opencv系列28--轮廓发现 [ api:findContours,api:drawContours ]


        轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现结果。

q1.png

        API介绍:findContours发现轮廓   

        cv::findContours(

                InputOutputArray  binImg,     // 输入图像,非0的像素被看成1,0的像素值保持不变,8-bit

                OutputArrayOfArrays  contours,    //  全部发现的轮廓对象

                OutputArray,  hierachy    // 图该的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现。

                int mode,     //  轮廓返回的模式

                int method,    // 发现方法

                Point offset=Point()    //轮廓像素的位移,默认(0, 0)没有位移

        )


        API介绍:drawContours绘制轮廓

        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()    // 轮廓位移,可选

        )


        步骤

        1:输入图像转为灰度图像cvtColor

        2:使用Canny进行边缘提取,得到二值图像

        3:使用findContours寻找轮廓

        4:使用drawContours绘制轮廓


        代码实例

#
#
#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("D:/linuxkiss/images/leo.png");
	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);
	//------api调用------
	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));
		//------api调用------
		drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));
	}
	imshow(output_win, dst);
}


上一篇 下一篇