轮廓发现是基于图像边缘提取寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终的轮廓发现结果
cv::findContours()
InputOutputArray binImg//输入图像,非0像素被看成1,0的像素值保持不变8-bit
OutputArrayOfArrays contours//全部发现的非轮廓对象
OutputArray hierachy//图的拓卜结构
int mode//轮廓的返回模式
int method//发现方法
Point offset=Point()//轮廓位移,默认是0
cv::drawContours()
InputOutputArray image表示目标图像,
InputArrayOfArrays contour表示输入的轮廓组,每一组轮廓由点vector构成,
int contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,
const Scalar& color为轮廓的颜色,
int thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,
int lineType为线型,
InputArray hierarchy为轮廓结构信息,
int maxLevel为maxLevel
Point offset=Point()//轮廓位移,默认是0
流程:
彩图转灰度图
灰度图转二值图像
发现轮廓
绘制轮廓
#include"pch.h" #include<iostream> #include<math.h> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; Mat gray_pic; int threshold_value = 100; int threshold_max = 255; void DemoContours(int, void*); int main(int argc, char**argv) { Mat src, dst; src = imread("2.jpg"); namedWindow("output window", CV_WINDOW_AUTOSIZE); imshow("output window", src); cvtColor(src, gray_pic, COLOR_BGR2GRAY); createTrackbar("Threshold value", "output window", &threshold_value, threshold_max, DemoContours); DemoContours(0, 0); waitKey(0); return 0; } void DemoContours(int, void*) { Mat canny_output; vector<vector<Point>> points; vector<Vec4i>hierachy; Canny(gray_pic, canny_output, threshold_value, threshold_value * 2, 3, false); findContours(canny_output, points, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); Mat dst = Mat::zeros(gray_pic.size(), CV_8UC3); RNG rng(12345); for (size_t i = 0; i < points.size(); ++i) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(dst, points, i, color, 2, 8, hierachy, 0, Point(0, 0)); } imshow("rslt", dst); }