Opencv 检测其他blob上的blob

Opencv 检测其他blob上的blob,opencv,blob,segment,Opencv,Blob,Segment,我使用OpenCV和cvblob库来处理blob 现在我想在这种特殊情况下检测blob 本例中的问题或困难在于,在一个较大的水滴上有两个水滴,而另一个水滴与较大水滴的一部分重叠 在cvblob库中,要检测blob,必须具有二进制图像 我想我需要创建两个或多个图像来分割颜色均匀的斑点,然后对它们进行二值化以获得图像中的所有斑点 我该怎么做呢 提前感谢我是OpenCV的初学者,但我想,对于这种特殊情况,您应该使用带有CV_RETR_外部标志的cvFindContours(使用CV_RETR_树,您

我使用OpenCV和cvblob库来处理blob

现在我想在这种特殊情况下检测blob

本例中的问题或困难在于,在一个较大的水滴上有两个水滴,而另一个水滴与较大水滴的一部分重叠

在cvblob库中,要检测blob,必须具有二进制图像

我想我需要创建两个或多个图像来分割颜色均匀的斑点,然后对它们进行二值化以获得图像中的所有斑点

我该怎么做呢


提前感谢

我是OpenCV的初学者,但我想,对于这种特殊情况,您应该使用带有CV_RETR_外部标志的cvFindContours(使用CV_RETR_树,您的黄色斑点将位于蓝色斑点中),而不是使用cvblob

这取决于您是否想要跟踪它们(cvblob提供了一种快速有效的跟踪BLOB的方法,而不必实施camshift)

CvMemStorage*storage=cvCreateMemStorage(0);
CvSeq*firstContour=cvCreateSeq(CV_SEQ_ELTYPE_POINT、sizeof(CvSeq)、sizeof(CvPoint)、storage);
cvFindContours(图像、存储和firstContour、sizeof(CvContour)、CV_RETR_外部、CV_CHAIN_近似简单);
//这是一个联合国的轮廓
如果(第一个轮廓!=0){
对于(CvSeq*c=firstContour;c!=NULL;c=c->h_next){
对于(inti=0;itotal;++i){
//获取当前轮廓的每个点
CvPoint*pt=CV_GET_SEQ_ELEM(CvPoint,c,i);
双x=pt->x;
双y=pt->y;
}
}
}
利用轮廓提供的信息,您可以轻松找到水滴的质心、角度和边界框

跟踪这些blob可能更困难,因为cvblob不喜欢重叠的blob(如我所见)。您可能需要实现自己的跟踪方法

CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* firstContour = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), storage);

    cvFindContours(image, storage, &firstContour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);




    // S'il y a un contour
    if(firstContour != 0) {

        for( CvSeq* c = firstContour; c != NULL; c = c->h_next ) {

                    for(int i = 0; i < c->total; ++i) {                    

                        // Get each point of the current contour
                        CvPoint* pt = CV_GET_SEQ_ELEM(CvPoint, c, i);

                        double x = pt->x;
                        double y = pt->y;

                    }
          }
      }