【OpenCV学习笔记】二十五、轮廓查找与绘制(二)访问轮廓中每个点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc8730866/article/details/68924443

轮廓查找与绘制(二)访问轮廓中每个点

先上ppt:








代码:

///访问轮廓中每个点,并绘制在原图上
#include "opencv2/opencv.hpp"
using namespace cv;
#include <iostream>
using namespace std;
int main()
{
	//1.查找轮廓时,一般使用二值化图像,进行阈值化处理或者Canny边缘检测
	Mat srcImg = imread("22.jpg", CV_LOAD_IMAGE_COLOR);
	resize(srcImg,srcImg,Size(),0.7,0.7);
	imshow("srcImg", srcImg);
	Mat copyImg = srcImg.clone();//将原图像备份(查找轮廓会改变原图像)
	cvtColor(srcImg, srcImg, CV_BGR2GRAY);//转换成灰度图(阈值化需要图像会灰度图)
	threshold(srcImg, srcImg, 100, 255, CV_THRESH_BINARY_INV); //阈值化并保证黑色背景白色轮廓
	imshow("threshold", srcImg);
	//2.查找轮廓并绘制轮廓
	vector<vector<Point>> contours;//存放检测到的轮廓,每个轮廓均由点组成
	vector<Vec4i> hierarchy;//还未理解,没用到.
	//2.1查找轮廓——findContours()
	//轮廓检索模式:CV_RETR_EXTERNAL为检测最外层
	//轮廓近似方法:CV_CHAIN_APPROX_NONE为连续存储所有的轮廓点
	//findContours(srcImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
	//轮廓检索模式:CV_RETR_TREE及其他均为检测所有轮廓
	//轮廓近似方法:CV_CHAIN_APPROX_SIMPLE为对于压缩存储,对于水平、垂直或斜向的线段,只会存储端点
	findContours(srcImg, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
	//2.2访问每个轮廓中的每个点,绘制在原图上
	//drawContours(copyImg, contours, -1, Scalar(0, 255, 0), 2, 8);//contourIdx:绘制轮廓索引,-1为绘制所有轮廓
	for (int i = 0;i<contours.size();i++)//遍历每个轮廓
	{
		for (int j = 0;j<contours[i].size();j+=10)//遍历轮廓中的所有点
		{
			//以画圆的方法在原图中画出每个轮廓中的点(以下两种方法一样)
			//circle(copyImg, Point(contours[i][j].x, contours[i][j].y), 1, Scalar(0, 255, 0), 2, 8);
			circle(copyImg,contours[i][j],3,Scalar(0,255,0),2,8);
		}
	}
	imshow("draw", copyImg);
	waitKey(0);
	return 0;
}

运行结果:



没有更多推荐了,返回首页