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在图像轮廓上添加标签的简单示例。您可以根据自己的需要修改代码,例如使用不同的阈值、不同的轮廓查找方法或不同的标签内容。

注意:

  • 对于更复杂的图像,您可能需要使用更高级的图像处理技术来获得更好的结果。
  • 您可以尝试更改代码中的参数,例如阈值、字体大小和颜色,以查看它们如何影响结果。
C++ OpenCV图像轮廓标记:实现步骤与代码详解

原文地址: https://www.cveoy.top/t/topic/jRcq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录