图像的轮廓发现与绘制
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace std; using namespace cv; Mat src, dst; const char* output_win = "findcontours-demo"; int threshold_value = 100; int threshold_max = 255; RNG rng; void Demo_Contours(int, void*); int main(int argc, char** argv) { src = imread("L:/12.jpg"); if (src.empty()) { printf("could not load image...\n"); return -1; } namedWindow("input-image", CV_WINDOW_AUTOSIZE); namedWindow("output_win", CV_WINDOW_AUTOSIZE); imshow("input-image", src); cvtColor(src, src, CV_BGR2GRAY); const char* trackbar_title = "Threshold Value:"; createTrackbar(trackbar_title, output_win, &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); //Canny边缘检测,阈值 findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); //findContours参数: //1.输入图像 2.检测出的所有轮廓对象(数组) 3.拓扑结构 4.轮廓返回模式 5.发现方法 6.默认P(0,0)没有位移 dst = Mat::zeros(src.size(), CV_8UC3); //初始化dst为一个src大小的零矩阵 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)); //contours的每一段轮廓取一次随机颜色 drawContours(dst, contours, i, color, 1, 8, hierachy, 0, Point(0, 0)); //drawContours参数: //1.输出图像 2.轮廓集contours 3.第几个轮廓 4.颜色 5.线宽 6.线条类型 7.拓扑结构 //8. 0表示绘制当前 1表示绘制当前及其内嵌的轮廓 9.轮廓位移 } imshow(output_win, dst); }
结果:
代码中涉及数组的使用方法:
vector<vector<Point>> contours; //定义一个二维数组 数组的使用见下图
vector<Vec4i> hierachy; //四维整型的数组
这两个数组为 findContours的第2和第3个参数;
vector<vector<Point>>://一般在轮廓查找和轮廓绘制使用,参数 contours
vector容器里面放了一个vector容器,子容器里放点
vector<V e c 4 i>:放了4维int向量//一般在轮廓查找和轮廓绘制使用,参数 hierarchy
vector<R e ct>: 像素width * height from 位置(x*y)
vector<R o t a t e d R e c t>:如图三个成员