轮廓发现(find contour) 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。 所以边缘提取的阈值选定会影响最终轮廓发现结果
//发现轮廓 cv::findContours( InputOutputArray binImg, // 输入图像,非0的像素被看成1,0的像素值保持不变,8-bit OutputArrayOfArrays contours, // 全部发现的轮廓对象 OutputArray, hierachy // 图该的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现。 int mode, // 轮廓返回的模式 int method, // 发现方法 Point offset=Point() // 轮廓像素的位移,默认(0, 0)没有位移 ) //绘制轮廓 drawContours( InputOutputArray binImg, // 输出图像 OutputArrayOfArrays contours, // 全部发现的轮廓对象 Int contourIdx // 轮廓索引号 const Scalar & color, // 绘制时候颜色 int thickness, // 绘制线宽 int lineType , // 线的类型LINE_8 InputArray hierarchy, // 拓扑结构图 int maxlevel, // 最大层数, 0只绘制当前的,1表示绘制绘制当前及其内嵌的轮廓 Point offset=Point() // 轮廓位移,可选 }
Mat src, dst; int threshold_value = 100; int threshold_max = 255; RNG rng; void Demo_Contours(int, void*); int main(int argc, char** argv) { src = imread(STRPAHT); if (src.empty()) { printf("could not load image...\n"); return -1; } cvtColor(src, src, CV_BGR2GRAY); createTrackbar("Threshold Value:", "findcontours - demo", &threshold_value, threshold_max, Demo_Contours); Demo_Contours(0, 0); waitKey(0); return 0; } void Demo_Contours(int, void*) { Mat canny_output; vector<vector<Point>> contours; vector<Vec4i> hierachy; Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);
//发现 findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); dst = Mat::zeros(src.size(), CV_8UC3); RNG rng(12345); for (size_t i = 0; i < contours.size(); i++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
//绘制 drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0)); } imshow("output_win", dst); }