简介
openCV的connectedComponentsWithStats
函数可以轻松提取黑白图像的连通域,并给出每个连通区质心的位置。
以下图为例
我们希望提取图片中的两个白色正方体和一个圆形,并标记它们的质量中心。
实现
OpenCV代码如下
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// 设置原始图像
const int w = 500, h = 500;
Mat orignImage = Mat::zeros(h, w, CV_8UC1); // 构造一个全黑的单通道图片
for (int row = 0; row < h; ++row)
{
for (int col = 0; col < w; ++col)
{
if ((row > 150 && row < 300 && col > 150 && col < 300) || (row > 100 && row < 150 && col > 350 && col < 400) || (row - 400) * (row - 400) + (col - 200) * (col - 200) < 50 * 50) // 将位于这两个正方形和一个圆形区域内的像素设置为白色
{
orignImage.at<uint8_t>(row, col) = 255;
}
}
}
// 生成随机颜色,用于区分不同连通域
RNG rng(1025);
Mat out;
Mat status, centroids;
int numberOfRegions = connectedComponentsWithStats(orignImage, out, status, centroids, 8, CV_16U); // 统计图像连通域的个数
vector<Vec3b> colors; // 用于储存每个连通区域的颜色(三通道)
vector<Point2f> points; // 用于储存每个连通区域的质心位置
for (int i = 0; i < numberOfRegions; ++i)
{
Vec3b vec3 = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256)); // 给定随机色
colors.push_back(vec3);
points.push_back(Point2f(centroids.at<double>(i, 0), centroids.at<double>(i, 1)));
}
// 以不同颜色标记出不同的连通域
Mat colorMap = Mat::zeros(orignImage.size(), CV_8UC3);
for (int row = 0; row < h; ++row)
{
for (int col = 0; col < w; ++col)
{
int label = out.at<uint16_t>(row, col);
if (label == 0) // 背景的黑色不改变
{
continue;
}
colorMap.at<Vec3b>(row, col) = colors[label];
}
}
// 绘制质心点
for (int i = 1; i < points.size(); i++)
{
circle(colorMap, points[i], 3, Scalar(128, 0, 128), -1); // 画点,其实就是实心圆
}
// 显示结果,并输出为bmp位图
imshow("标记前的图像", orignImage);
imwrite("origin.bmp", orignImage);
imshow("标记后的图像", colorMap);
imwrite("colorMap.bmp", colorMap);
waitKey(0);
return 0;
}
其核心代码仅一行
int numberOfRegions = connectedComponentsWithStats(orignImage, out, status, centroids, 8, CV_16U); // 统计图像连通域的个数
该函数输入原始图像orignImage,输出被标记的图像out、统计信息status和质心坐标centroids
效果
可以看出,代码成功将三个连通区域上色,并标记出了质心位置。文章来源:https://www.toymoban.com/news/detail-677976.html
本文参考自:C++版本OpenCv教程(三十八 )图像连通域分析文章来源地址https://www.toymoban.com/news/detail-677976.html
到了这里,关于openCV连通域的提取与质心标记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!