阅读量:0
drawContours函数介绍
OpenCV中的drawContours函数用于在图像上绘制轮廓。其函数原型如下:
比较复制插入新建
void drawContours(InputOutputArray image, InputOutputArray contours, InputOutputArray contourIdx, int contourColor, Scalar thickness=Scalar(), int lineType=LINE_8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point() );
参数说明:
image:
输出图像,即绘制轮廓后的图像。contours:
轮廓集合,每个轮廓由一系列点组成。contourIdx:
轮廓索引数组,指定要绘制哪些轮廓。如果为NULL,则绘制所有轮廓。contourColor:
轮廓颜色,使用Scalar类型表示。thickness:
轮廓线宽,默认值为1。lineType:
轮廓线类型,默认值为LINE_8。hierarchy:
轮廓层次结构,用于绘制轮廓的父子关系。默认值为noArray()。只有在你想要绘制部分轮廓(参见maxLevel
)时,才需要使用这个参数。maxLevel:
表示绘制轮廓的最大层级。如果maxLevel为0,则只绘制指定的轮廓;如果maxLevel为1,则绘制轮廓及其所有嵌套轮廓;如果maxLevel为2,则绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套的轮廓等。需要注意的是,当存在层次结构时,这个参数才会被考虑。offset:
轮廓点的偏移量,默认值为(0,0)。
使用场景
OpenCV的drawContours函数可以应用于以下场景:
图像分割:在二值化或灰度图像中,通过绘制轮廓来将图像分割成不同的区域。
目标检测和识别:在实时视频流或图像中检测和识别特定目标,如人脸、车辆、行人等。
医学影像分析:在医学影像中查找和分析病变区域,如肿瘤、炎症等。
文字识别:对印刷体文字图像进行轮廓提取和分析,以便进行后续的文字识别和处理。
三维重建:在三维重建中,通过检测物体表面的轮廓来确定物体的位置和形状。
使用案例
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() { // 读取灰度图像 Mat src = imread("./3480e7ce_mk_tk_a_c2_6400_4480.png", IMREAD_GRAYSCALE); if (src.empty()) { cout << "无法读取图像" << endl; return -1; } imshow("原图", src); waitKey(0); // 二值化图像 Mat binary; threshold(src, binary, 128, 255, THRESH_BINARY); imshow("二值化图", binary); waitKey(0); // 查找轮廓 vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 绘制轮廓 Mat result(src.size(), CV_8UC3, Scalar(0, 0, 0)); for (size_t i = 0; i < contours.size(); i++) { // 蓝色颜色 Scalar color(255,0,0); // 只绘制第一层的轮廓 drawContours(result, contours, static_cast<int>(i), color, 2, LINE_8, hierarchy, 0); } // 显示结果 imshow("轮廓图", result); waitKey(0); return 0; }
运行效果:
二值化图像:
轮廓图:
总结
drawContours
函数是OpenCV库中用于绘制轮廓的一个非常实用的函数。它可以方便地将轮廓信息可视化出来,帮助我们更好地理解图像中的目标信息。在实际应用中,我们可以根据需要选择不同的参数来绘制不同样式的轮廓,从而实现更加灵活的应用效果。