一、介绍
在图像处理中,轮廓(contour)是一个非常重要的概念,通常指的是将物体从背景中分离出来的边界线或曲线。在OpenCV库中,可以使用findcontours函数来找到图像中的轮廓。
本篇文章将详细介绍如何使用OpenCV中的findcontours函数进行轮廓检测。
二、必备知识
在开始介绍findcontours函数之前,需要了解以下几个OpenCV函数:
- cvtColor:将图像从一种颜色空间转换为另一种颜色空间
- threshold:对图像进行二值化处理,将图像分为黑白两部分
- findcontours:找到图像中的轮廓,返回轮廓的信息
- drawContours:将轮廓在图像上进行绘制,以便观察和调试
三、使用findcontours函数进行轮廓检测
1. 准备工作
在使用findcontours函数之前,需要加载一张图像。代码如下:
#include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("image.jpg"); // 检查图像是否成功加载 if (image.empty()) { std::cout << "无法加载图像!" << std::endl; return -1; } // 显示原始图像 imshow("Original Image", image); // 等待按下任意按键 waitKey(0); return 0; }
运行上述代码,可以加载一张图像并显示在窗口中。
2. 进行轮廓检测
在加载完图像后,接下来就是使用findcontours函数进行轮廓检测了。
在使用findcontours函数之前,需要对图像进行一些预处理,如将图像从彩色空间转换为灰度空间,并进行二值化处理。代码如下:
Mat grayImage, binaryImage; cvtColor(image, grayImage, COLOR_BGR2GRAY); // 将图像转换为灰度空间 threshold(grayImage, binaryImage, 50, 255, THRESH_BINARY); // 对图像进行二值化处理
上述代码中,我们将图像从BGR彩色空间转换为灰度空间,并使用阈值50将图像二值化,使得图像中明暗的部分被分为黑白两部分。
接下来就是使用findcontours函数进行轮廓检测了。代码如下:
std::vector<std::vector<Point>> contours; std::vector<Vec4i> hierarchy; findContours(binaryImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point()); // 绘制轮廓 Mat contoursImage = Mat::zeros(binaryImage.size(), CV_8UC3); for (int i = 0; i < contours.size(); i++) { drawContours(contoursImage, contours, i, Scalar(0, 0, 255), 2, 8, hierarchy, 0, Point()); } imshow("Contours Image", contoursImage); waitKey(0);
上述代码中,我们使用findcontours函数找到了图像中的所有轮廓,并将结果存储在contours向量中。同时,我们还使用了drawContours函数在contoursImage图像上将所有轮廓绘制出来,并显示在窗口中。
运行以上代码,会得到图像中所有轮廓的检测结果,并且通过drawContours函数绘制出来。如下图所示:
上述代码中,在findcontours函数中,我们使用了以下参数:
- binaryImage:二值化后的图像
- contours:存储检测到的轮廓
- hierarchy:表示轮廓的层级结构
- RETR_TREE:表示检测所有轮廓,并重建完整的轮廓层次结构
- CHAIN_APPROX_SIMPLE:表示对轮廓中的所有点进行压缩,并仅保留与轮廓形状有关的重要点
- Point():表示轮廓的偏移量,一般都为(0,0)
其中,RETR_TREE和CHAIN_APPROX_SIMPLE是findcontours函数中的两个比较重要的参数。
RETR_TREE表示检测所有轮廓,并重建完整的轮廓层次结构。在重建层次结构时,每个轮廓都分配一个编号,这个编号就是hierarchy向量中的元素之一。
CHAIN_APPROX_SIMPLE表示对轮廓中的所有点进行压缩,并仅保留与轮廓形状有关的重要点。这样做可以有效减小存储轮廓信息所需的空间。
四、总结
本篇文章主要介绍了如何使用OpenCV中的findcontours函数进行轮廓检测。首先介绍了几个必备知识,然后详细介绍了使用findcontours函数进行轮廓检测的步骤。希望这篇文章能够帮助大家更好地理解和使用OpenCV库中的轮廓检测函数。