OpenCV-在二进制图像中找到最大斑点的边界框
feature-detection
image-processing
opencv
6
0

使用OpenCV在二进制图像中找到最大斑点的边界框的最有效方法是什么?不幸的是,OpenCV没有用于斑点检测的特定功能。我应该只使用findContours()并在列表中搜索最大的吗?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

为了找到最大的Blob的边界框,我使用了findContours ,然后使用以下代码:

double maxArea = 0;
for (MatOfPoint contour : contours) {
    double area = Imgproc.contourArea(contour);
    if (area > maxArea) {
        maxArea = area;
        largestContour = contour;
    }
}
Rect boundingRect = Imgproc.boundingRect(largestContour);
收藏
评论

这里。它。是的。 (仅供参考:不要偷懒,并找出下面我的函数中发生的事情。

cv::Mat findBiggestBlob(cv::Mat & matImage){
    int largest_area=0;
    int largest_contour_index=0;

    vector< vector<Point> > contours; // Vector for storing contour
    vector<Vec4i> hierarchy;

    findContours( matImage, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image

    for( int i = 0; i< contours.size(); i++ ) {// iterate through each contour. 
        double a=contourArea( contours[i],false);  //  Find the area of contour
        if(a>largest_area){
            largest_area=a;
            largest_contour_index=i;                //Store the index of largest contour
            //bounding_rect=boundingRect(contours[i]); // Find the bounding rectangle for biggest contour
        }
    }

    drawContours( matImage, contours, largest_contour_index, Scalar(255), CV_FILLED, 8, hierarchy ); // Draw the largest contour using previously stored index.
    return matImage;
}
收藏
评论

如果要使用OpenCV库,请签出OpenCV SimpleBlobDetector。这是另一个堆栈溢出,显示了其中的一个小教程: 如何使用OpenCV SimpleBlobDetector

但是,这仅给您关键点。您可以将其用作初始搜索以找到所需的Blob,然后可以在最可能的Blob周围使用findContours算法。

此外,如果您了解有关Blob的更多信息,则可以提供参数以过滤掉不需要的Blob。您可能需要测试SimpleBlobDetector的area参数。如果算法未检测到任何斑点,则可能可以根据图像区域的大小来计算面积,然后迭代地允许较小的斑点。

以下是指向OpenCV主要文档的链接: http : //docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html#simpleblobdetector

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号