OpenCV - 照片中有多少个黑色物体?

时间:2017-05-10 11:30:48

标签: c++ opencv

好的,所以我正在尝试使用c ++的openCV,我想为黑色的对象做一个简单的检测程序。所以我有这个简单的代码:

int main()
{
    Mat3b bgr = imread("C:/Users/sesoa/Desktop/photos/shapes.png");

    Mat3b hsv;
    cvtColor(bgr, hsv, COLOR_BGR2HSV);

    Mat1b mask1, mask2;
    inRange(hsv, Scalar(0, 0, 0, 0), Scalar(180, 255, 30, 0), mask1);
    inRange(hsv, Scalar(0, 0, 0, 0), Scalar(180, 255, 40, 0), mask2);



    Mat1b mask = mask1 | mask2;

    imshow("Mask", mask);
    waitKey();

    return 0;
}

shapes.png是这样的: enter image description here

所有形状都是圆形的,颜色为黑色。我想让我的程序告诉我有多少连接的黑色物体。形状下的写作也是黑色的。所以它也向我展示了这一点,没关系,因为无论如何这都是一张测试照片。

如何修改程序以检测照片中连接的黑色物体的数量? (在这张照片中,输出应为“60”,因为有8个对象,49个字母+ 3个字母是'i'所以我们必须计算点数。)

编辑:

我希望程序计算黑色物体。我已经把所有的黑色物体都拿出来了: enter image description here

1 个答案:

答案 0 :(得分:1)

如果您想计算对象数量,请执行以下操作:

std::vector<std::vector<cv::Point> > contours; 
std::vector<cv::Vec4i> hierarchy;
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) ); // canny_output is the binary image

这将为您提供二进制图像中的所有轮廓(contours.size())。如果只想要特定的轮廓,可以使用轮廓区域进行过滤。

希望它有所帮助!