我在一些图像中有一个坚实的黑色背景,并且这些图片中有对象(非黑色物体但是多色)。
如何计算非黑色物体的数量(它们被黑色像素包围并且不会相互碰撞)?
我想要完全从头开始制作(通过像素,当找到一个非黑色像素时,在它周围搜索以了解它的极限并将其计为一个,保持极限以便我知道它何时和#39;与迭代每一行像素时不同,我将再次与同一个物体碰撞)。但我想知道使用OpenCV是否有更简单的方法来实现它。
答案 0 :(得分:0)
使用OpenCV,您可以使用Count Contours功能(即您的形状轮廓)。我已经包含了描述和教程链接的链接。
您应首先转换为BW图像,然后使用此功能。
答案 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();
导致:
完整代码:
#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);
}