检测其他 Blob 上的 Blob

发布于 2024-11-26 20:03:24 字数 313 浏览 2 评论 0原文

我使用 OpenCV 和 cvblob 库来处理 blob。

现在我想检测这种特殊情况下的斑点。

在这种情况下,问题或困难在于一个较大的斑点上方有两个斑点,而另一个斑点则与较大的斑点的一部分重叠。

在 cvblob 库中要检测 blob,您必须有一个二进制图像。

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

我该怎么办呢。

Image

提前致谢

I use OpenCV and cvblob library to play with blob.

Now I want to detect blob in this particular case.

The problem or the difficulty in this case is there are two blobs over a bigger one and other blob that overlap a part of the bigger one.

In cvblob library to detect a blob you must have a binary image.

I think i need to create two or more image to segment color uniform blobs and then binarize them to obtain all the blobs in the image.

How can i do that.

Image

thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

若相惜即相离 2024-12-03 20:03:24

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

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

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;

                    }
          }
      }

利用轮廓提供的信息,您可以轻松找到斑点的质心、角度和边界框。

跟踪这些斑点可能会更困难,因为 cvblob 不喜欢重叠的斑点(正如我所看到的)。您可能必须实施自己的跟踪方法。

I'm quite a beginner in OpenCV but I guess that, for that particular case, you should work with cvFindContours with the CV_RETR_EXTERNAL flag (with the CV_RETR_TREE, your yellow blob would be IN the blue one) instead of using cvblob.

It depends if you want to track them or not (cvblob offers a quick and efficient way to track blobs, instead of having to implement camshift).

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;

                    }
          }
      }

With the information given by the contour you can find easily the centroid, angle and bounding box of your blob.

Tracking these blob might be more difficult as cvblob doesn't like overlapping blobs (as I can see). You may have to implement your own tracking method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文