C++ OpenCV图像轮廓标记:实现步骤与代码详解
C++ OpenCV图像轮廓标记:实现步骤与代码详解
本文将介绍如何使用C++和OpenCV库在图像轮廓上添加标签。我们将提供完整的源代码,并附带详细的注释,以便您可以轻松理解代码的每个部分。
1. 代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 读取图像,并将其转换为灰度图像
Mat img = imread('image.jpg', IMREAD_GRAYSCALE);
if (img.empty())
{
cout << '无法读取图像' << endl;
return -1;
}
// 应用二值阈值处理
Mat thresh;
threshold(img, thresh, 128, 255, THRESH_BINARY);
// 查找轮廓
vector<vector<Point>> contours;
findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 在轮廓上绘制标签
for (int i = 0; i < contours.size(); i++)
{
// 计算轮廓的中心点
Moments mu = moments(contours[i]);
Point2f center(mu.m10 / mu.m00, mu.m01 / mu.m00);
// 绘制标签
putText(img, to_string(i), center, FONT_HERSHEY_SIMPLEX, 1, Scalar(255), 2);
}
// 显示结果图像
namedWindow('轮廓标记结果', WINDOW_NORMAL);
imshow('轮廓标记结果', img);
waitKey(0);
return 0;
}
2. 代码详解
- 首先,我们使用
imread函数读取输入图像,并使用IMREAD_GRAYSCALE将其转换为灰度图像。 - 然后,我们使用
threshold函数对灰度图像应用二值阈值处理。这将创建一个二值图像,其中像素值高于阈值的像素设置为白色,低于阈值的像素设置为黑色。 - 接下来,我们使用
findContours函数查找二值图像中的轮廓。RETR_EXTERNAL标志表示我们只对外部轮廓感兴趣。CHAIN_APPROX_SIMPLE标志表示我们希望使用简单的轮廓近似方法,该方法可以减少轮廓点的数量。 - 一旦我们找到了轮廓,我们就可以使用
moments函数计算每个轮廓的中心点。 - 最后,我们使用
putText函数在每个轮廓的中心点绘制一个标签。标签的内容是轮廓的索引。
3. 总结
本文提供了一个使用C++和OpenCV在图像轮廓上添加标签的简单示例。您可以根据自己的需要修改代码,例如使用不同的阈值、不同的轮廓查找方法或不同的标签内容。
注意:
- 对于更复杂的图像,您可能需要使用更高级的图像处理技术来获得更好的结果。
- 您可以尝试更改代码中的参数,例如阈值、字体大小和颜色,以查看它们如何影响结果。
原文地址: https://www.cveoy.top/t/topic/jRcq 著作权归作者所有。请勿转载和采集!