21xrx.com
2024-05-20 17:55:34 Monday
登录
文章检索 我的文章 写文章
OpenCV findContours 函数实现
2023-07-17 20:11:22 深夜i     --     --
C++代码 OpenCV 函数实现

在计算机视觉和图像处理领域,边缘检测是一个重要的任务。OpenCV是一个功能强大的开源计算机视觉库,它提供了各种图像处理和分析函数。其中一个常用的函数是findContours,它可以用来检测图像中的边缘。

findContours函数通过查找图像中的连续非零像素点的边缘,生成一组检测到的轮廓。通过这些轮廓,我们可以分析图像的形状、外部和内部结构,从而实现各种应用,如物体检测、形状识别等。

下面是一个使用C++编写的OpenCV findContours函数的示例代码:


#include <opencv2/opencv.hpp>

#include <iostream>

using namespace cv;

using namespace std;

int main()

{

  // 加载图像

  Mat image = imread("image.png", IMREAD_GRAYSCALE);

  // 检查图像是否成功加载

  if (image.empty())

  

    cout << "无法加载图像!" << endl;

    return -1;

  

  // 对图像应用二值化

  Mat binaryImage;

  threshold(image, binaryImage, 128, 255, THRESH_BINARY);

  // 查找轮廓

  vector<vector<Point>> contours;

  vector<Vec4i> hierarchy;

  findContours(binaryImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);

  // 绘制轮廓

  Mat contourImage = Mat::zeros(image.size(), CV_8UC3);

  for (size_t i = 0; i < contours.size(); i++)

  {

    Scalar color = Scalar(0, 0, 255); // 蓝色

    drawContours(contourImage, contours, i, color, 2, LINE_8, hierarchy, 0);

  }

  // 显示原始图像和检测到的轮廓图像

  imshow("原始图像", image);

  imshow("轮廓图像", contourImage);

  waitKey(0);

  return 0;

}

在这段代码中,我们首先使用imread函数加载一幅灰度图像。然后,我们使用threshold函数对图像进行二值化处理,将像素点的灰度值转化为二值(黑白)图像,以便更好地检测边缘。

接下来,我们定义了两个容器变量contours和hierarchy,用于存储检测到的轮廓和它们的层次结构。

然后,我们调用findContours函数来查找图像中的轮廓。该函数的参数包括输入二值图像、输出轮廓、输出轮廓所属的层次结构等。在这个示例中,我们使用的轮廓检测模式是RETR_TREE,表示检测所有的轮廓,并构造轮廓的整体层次结构。另外,CHAIN_APPROX_SIMPLE参数表示轮廓中的点是由水平、垂直和对角线组成的。

最后,我们使用drawContours函数将检测到的轮廓绘制在一个空白图像上,并通过imshow函数显示原始图像和检测到的轮廓图像。

这段代码可以让我们更好地理解和使用OpenCV中的findContours函数来检测图像中的边缘。通过这个函数,我们可以实现各种图像处理和计算机视觉应用,为我们的项目提供强大的功能和性能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复