计算所有2D非黑色对象

时间:2015-12-22 14:10:51

标签: opencv

我在一些图像中有一个坚实的黑色背景,并且这些图片中有对象(非黑色物体但是多色)。

如何计算非黑色物体的数量(它们被黑色像素包围并且不会相互碰撞)?

我想要完全从头开始制作(通过像素,当找到一个非黑色像素时,在它周围搜索以了解它的极限并将其计为一个,保持极限以便我知道它何时和#39;与迭代每一行像素时不同,我将再次与同一个物体碰撞)。但我想知道使用OpenCV是否有更简单的方法来实现它。

enter image description here

2 个答案:

答案 0 :(得分:0)

使用OpenCV,您可以使用Count Contours功能(即您的形状轮廓)。我已经包含了描述和教程链接的链接。

您应首先转换为BW图像,然后使用此功能。

Find Contours DescriptionTutorial

答案 1 :(得分:0)

您可以使用findContours,或者如果您使用的是OpenCV> 3.0,您也可以使用connectedComponents

您需要先将图像转换为灰度:

// Load image
Mat3b img = imread("D:\\SO\\img\\random.png");

// Convert to grayscale
Mat1b gray;
cvtColor(img, gray, COLOR_BGR2GRAY);

然后将其二值化。由于您的背景是黑色(灰度值0),您可以简单地将所有像素视为前景,其值大于0:

// Binarize image
Mat1b bin = gray > 0;

然后只需检索连接的组件:

// Find connected components
vector<vector<Point>> contours;
findContours(bin.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

cout << "Number of connected components: " << contours.size();

您最终可以使用不同的随机颜色绘制每个连接的组件:

// Draw results
Mat3b results(img.rows, img.cols, Vec3b(0,0,0));
for (int i = 0; i < contours.size(); ++i)
{
    Scalar color(rand() & 255, rand() & 255, rand() & 255);
    drawContours(results, contours, i, color, CV_FILLED);
}

imshow("Results", results);
waitKey();

导致:

enter image description here

完整代码:

#include <opencv2\opencv.hpp>
#include <vector>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
    // Load image
    Mat3b img = imread("path_to_image");

    // Convert to grayscale
    Mat1b gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    // Binarize image
    Mat1b bin = gray > 0;

    // Find connected components
    vector<vector<Point>> contours;
    findContours(bin.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    cout << "Number of connected components: " << contours.size();

    // Draw results
    Mat3b results(img.rows, img.cols, Vec3b(0,0,0));
    for (int i = 0; i < contours.size(); ++i)
    {
        Scalar color(rand() & 255, rand() & 255, rand() & 255);
        drawContours(results, contours, i, color, CV_FILLED);
    }


    imshow("Results", results);
    waitKey();

    return(0);
}