輪廓查找與繪製(二)訪問輪廓中每個點
先上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;
}
運行結果: