【OpenCV學習筆記】二十五、輪廓查找與繪製(二)訪問輪廓中每個點

輪廓查找與繪製(二)訪問輪廓中每個點

先上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;
}

運行結果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章