opencv 中利用函数 findContours() 可以监测出物体的轮廓
drawContours() 可以画出物体的轮廓

  1. findContours()函数源码
    void findContours(InputArray image, OutputArrayOfArrays contours,
    	OutputArray hierarchy, int mode,
    	int method, Point offset = Point());
    image ,8位单通道图像。 非零像素被视为1。 零像素保持为0,因此图像被视为二值。 
            可以使用compare、inRange、threshold、adaptiveThreshold、Canny和
            其他方法来从灰度或彩色图像创建二值图像。
    contours 监测到的轮廓 原型 vector<vector<Point>> contours; 每个轮廓线存储为一个点的向量
    hierarchy 可选输出向量 原型vector<Vec4i> hierarchy;
    model 定义轮廓的检索模式  RETR_EXTERNAL 只监测最外围轮廓
                             RETR_LIST 检测所有轮廓
    method 定义轮廓的近似方法  CHAIN_APPROX_NONE 保存物体所有连续的轮廓点到contours向量内
                              CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息 拐点与拐点直接的信息不保留 
    point 偏移量
    
  1. drawContours()函数源码
    	void drawContours(InputOutputArray image, InputArrayOfArrays contours,
    		int contourIdx, const Scalar& color,
    		int thickness = 1, int lineType = LINE_8,
    		InputArray hierarchy = noArray(),
    		int maxLevel = INT_MAX, Point offset = Point());
    	imgae 目标图像
    	contours 所有的输入轮廓。 每条轮廓线存储为一个点向量。
    	contouridx要绘制的轮廓参数。 如果它是负的,就画出所有的等高线。
    	color 颜色
    	thickness 宽度 如果是负数 表示填充轮廓内部
    	lineType 线型
    	hierarchy可选信息。 它只在你想绘制一些轮廓时才需要(参见maxLevel)。
    	maxlevel  绘制轮廓的最大水平。 如果为0,则只绘制指定的轮廓。 
    		                          如果为1,函数绘制轮廓线和所有嵌套轮廓线。 
    		                          如果是2,该函数绘制等值线、所有嵌套等值线、所有嵌套到嵌套等值线,等等。
    		                          只有当存在可用的层次结构时,才会考虑此参数。
    	offset 可选轮廓偏移参数。 将所有绘制的等高线按指定偏移量(dx, dy)移动。
    

3 代码

int main()
{
	Mat image, img2;

	img2 = imread("2_3.jpg", 0);

	GaussianBlur(img2, image, Size(3, 3), 0);//高斯

	Canny(image, image, 100, 250);//二值化

	vector<vector<Point>> contours;

	vector<Vec4i> hierarchy;

	//3.利用函数findContours()查找图像A的轮廓;
	findContours(image, contours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE, Point());

	Mat imageContours = Mat::zeros(image.size(), CV_8UC1);

	Mat Contours = Mat::zeros(image.size(), CV_8UC1);  //绘制  

	for (int i = 0; i < contours.size(); i++)
	{
		//contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数  
		for (int j = 0; j < contours[i].size(); j++)
		{
			//绘制出contours向量内所有的像素点  
			Point P = Point(contours[i][j].x, contours[i][j].y);
			
			Contours.at<uchar>(P) = 255;//白色像素点
		}
	}
	//绘制轮廓  
	drawContours(imageContours, contours, -1, Scalar(255));
	
	imshow("Contours Image", imageContours); //轮廓 

	imshow("Point of Contours", Contours);   //向量contours内保存的所有轮廓点
	waitKey(0);

}

4 method 参数对比
4.1 CHAIN_APPROX_NONE 保存物体所有连续的轮廓点到contours向量内

4.2 CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息 拐点与拐点直接的信息不保留