172 lines
5.2 KiB
C++
172 lines
5.2 KiB
C++
#include "BlobDetector.h"
|
|
|
|
BlobDetector::BlobDetector()
|
|
{
|
|
|
|
}
|
|
|
|
/**
|
|
- FUNCTION: Blob
|
|
- FUNCTIONALITY: Constructor from an image. Fills an object with all the blobs in
|
|
the image
|
|
- PARAMETERS:
|
|
- source: image to extract the blobs from
|
|
- mask: optional mask to apply. The blobs will be extracted where the mask is not 0.
|
|
- numThreads: number of labelling threads.
|
|
- RESULT:
|
|
- object with all the blobs in the image.
|
|
- RESTRICTIONS:
|
|
- AUTHOR: Ricard Borràs
|
|
- CREATION DATE: 25-05-2005.
|
|
- MODIFICATION: Oct-2013. Luca Nardelli and Saverio Murgia. Changed to comply with reimplemented labelling algorithm
|
|
*/
|
|
BlobDetector::BlobDetector(IplImage* source, IplImage* mask, int numThreads)
|
|
{
|
|
if (mask != NULL) {
|
|
cv::Mat temp = cv::Mat::zeros(cv::Size(source->width, source->height), CV_8UC1);
|
|
cv::cvarrToMat(source).copyTo(temp, cv::cvarrToMat(mask));
|
|
m_compLabeler.set(numThreads, temp);
|
|
m_compLabeler.doLabeling(m_blobGroup.m_blobs);
|
|
}
|
|
else {
|
|
m_compLabeler.set(numThreads, cv::cvarrToMat(source));
|
|
m_compLabeler.doLabeling(m_blobGroup.m_blobs);
|
|
}
|
|
}
|
|
|
|
/**
|
|
- FUNCTION: BlobDetector
|
|
- FUNCTIONALITY: Copy constructor
|
|
- PARAMETERS:
|
|
- source: object to copy
|
|
- RESULT:
|
|
- RESTRICTIONS:
|
|
- AUTHOR: Ricard Borràs
|
|
- CREATION DATE: 25-05-2005.
|
|
- MODIFICATION: Date. Author. Description.
|
|
*/
|
|
BlobDetector::BlobDetector(const BlobDetector& source)
|
|
{
|
|
// create the new from the past as a parameter
|
|
//m_blobs = BlobVector(source.getNumBlobs());
|
|
m_blobGroup.m_blobs.reserve(source.m_blobGroup.getNumBlobs());
|
|
// copy the blobs from the origin to the current one
|
|
BlobVector::const_iterator pBlobsSrc = source.m_blobGroup.m_blobs.begin();
|
|
//BlobVector::iterator pBlobsDst = m_blobs.begin();
|
|
while (pBlobsSrc != source.m_blobGroup.m_blobs.end()) {
|
|
// can't call the operator = since BlobVector is a
|
|
// Blob vector *. So create a new blob from the
|
|
// original blob
|
|
m_blobGroup.m_blobs.push_back(new Blob(**pBlobsSrc));
|
|
pBlobsSrc++;
|
|
}
|
|
}
|
|
|
|
BlobDetector& BlobDetector::operator=(const BlobDetector& source)
|
|
{
|
|
if (this != &source) {
|
|
m_blobGroup.m_blobs.reserve(source.m_blobGroup.getNumBlobs());
|
|
BlobVector::const_iterator pBlobsSrc = source.m_blobGroup.m_blobs.begin();
|
|
while (pBlobsSrc != source.m_blobGroup.m_blobs.end()) {
|
|
m_blobGroup.m_blobs.push_back(new Blob(**pBlobsSrc));
|
|
pBlobsSrc++;
|
|
}
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
BlobDetector::BlobDetector(BlobDetector&& source) noexcept
|
|
{
|
|
std::exchange(m_blobGroup, std::move(source.m_blobGroup));
|
|
}
|
|
|
|
BlobDetector& BlobDetector::operator=(BlobDetector&& source) noexcept
|
|
{
|
|
if (this != &source) {
|
|
std::exchange(m_blobGroup, std::move(source.m_blobGroup));
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
- FUNCTION: ~BlobDetector
|
|
- FUNCTIONALITY: Destructor
|
|
- PARAMETERS:
|
|
- RESULT:
|
|
- RESTRICTIONS:
|
|
- AUTHOR: Ricard Borràs
|
|
- CREATION DATE: 25-05-2005.
|
|
- MODIFICATION: Date. Author. Description.
|
|
*/
|
|
BlobDetector::~BlobDetector()
|
|
{
|
|
m_blobGroup.clearBlobs();
|
|
}
|
|
|
|
/**
|
|
- FUNCTION: BlobDetector
|
|
- FUNCTIONALITY: Constructor from an image. Fills an object with all the blobs in
|
|
the image, OPENCV 2 interface
|
|
- PARAMETERS:
|
|
- source: Mat to extract the blobs from, CV_8UC1
|
|
- mask: optional mask to apply. The blobs will be extracted where the mask is
|
|
not 0. All the neighbouring blobs where the mask is 0 will be external blobs
|
|
- numThreads: number of labelling threads.
|
|
- RESULT:
|
|
- object with all the blobs in the image.
|
|
- RESTRICTIONS:
|
|
- AUTHOR: Saverio Murgia & Luca Nardelli
|
|
- CREATION DATE: 06-04-2013.
|
|
- MODIFICATION: Date. Author. Description.
|
|
*/
|
|
BlobDetector::BlobDetector(cv::Mat& source, const cv::Mat& mask, int numThreads) {
|
|
if (mask.data) {
|
|
cv::Mat temp = cv::Mat::zeros(source.size(), source.type());
|
|
source.copyTo(temp, mask);
|
|
m_compLabeler.set(numThreads, temp);
|
|
m_compLabeler.doLabeling(m_blobGroup.m_blobs);
|
|
}
|
|
else {
|
|
m_compLabeler.set(numThreads, source);
|
|
m_compLabeler.doLabeling(m_blobGroup.m_blobs);
|
|
}
|
|
}
|
|
|
|
/**
|
|
- FUNCTION: detect
|
|
- FUNCTIONALITY: detects blob in the image
|
|
- PARAMETERS:
|
|
- source: Mat to extract the blobs from, CV_8UC1
|
|
- mask: optional mask to apply. The blobs will be extracted where the mask is
|
|
not 0. All the neighbouring blobs where the mask is 0 will be external blobs
|
|
- numThreads: number of labelling threads.
|
|
- RESULT:
|
|
- the object will contain the detected blobs.
|
|
- RESTRICTIONS:
|
|
- AUTHOR: Saverio Murgia & Luca Nardelli
|
|
- CREATION DATE: 10-04-2014.
|
|
- MODIFICATION: Date. Author. Description.
|
|
*/
|
|
const BlobGroup& BlobDetector::detect(cv::Mat& source, const cv::Mat& mask /*= cv::Mat()*/, int numThreads/*=1*/)
|
|
{
|
|
m_blobGroup.clearBlobs();
|
|
if (mask.data) {
|
|
cv::Mat temp = cv::Mat::zeros(source.size(), source.type());
|
|
source.copyTo(temp, mask);
|
|
m_compLabeler.set(numThreads, temp);
|
|
m_compLabeler.doLabeling(m_blobGroup.m_blobs);
|
|
}
|
|
else {
|
|
m_compLabeler.set(numThreads, source);
|
|
m_compLabeler.doLabeling(m_blobGroup.m_blobs);
|
|
}
|
|
|
|
return m_blobGroup;
|
|
}
|
|
|
|
const BlobGroup& BlobDetector::getBlobGroup()
|
|
{
|
|
return m_blobGroup;
|
|
}
|
|
|