
cv::findContours 是 OpenCV 库中用于在二值图像中查找轮廓的函数。该函数非常强大,可以用于图像分割、形状分析等任务。以下是对 cv::findContours 函数的详细介绍:
在 C++ 接口中,cv::findContours 的函数原型通常如下:
void cv::findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy,
int mode, int method, Point offset = Point())InputOutputArrayOutputArrayOfArraysstd::vector<std::vector<cv::Point>> 类型的变量,其中每个内部 vector<cv::Point> 表示一个轮廓,由一系列的点组成。OutputArraystd::vector<Vec4i> 类型的变量,其中每个 Vec4i 表示一个轮廓的层级信息,包括当前轮廓的下一个轮廓、前一个轮廓、第一个子轮廓和父轮廓的索引。intcv::findContours 函数如何检索轮廓。常用的模式有: cv::RETR_EXTERNAL:只检索最外层的轮廓。cv::RETR_LIST:检索所有的轮廓,但不建立轮廓之间的等级关系。cv::RETR_CCOMP:检索所有的轮廓,并将它们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界。cv::RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。intcv::CHAIN_APPROX_NONE:保存所有的轮廓点,不进行任何压缩。cv::CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向的轮廓,只保留端点。cv::CHAIN_APPROX_TC89_L1、cv::CHAIN_APPROX_TC89_KCOS:使用 Teh-Chin 链近似算法的一种。Pointcv::Point(0, 0),表示不进行偏移。当轮廓是从图像的某个区域(ROI)中提取的,并且需要在整个图像中分析时,这个参数将很有用。cv::findContours 函数没有返回值(即返回类型为 void),但它通过修改传入的 contours 和(可选的)hierarchy 参数来输出轮廓和层级信息。
以下是一个简单的使用 cv::findContours 函数的示例:
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("your_binary_image.jpg", cv::IMREAD_GRAYSCALE); // 加载二值图像
cv::Mat binary;
cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY); // 确保图像是二值的
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(binary, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 在这里可以使用 contours 和 hierarchy 进行进一步的处理,比如绘制轮廓等
return 0;
}通过 cv::findContours 函数,可以轻松地在二值图像中检测对象的轮廓,为后续的图像分析和处理提供基础。