在图像中查找轮廓
一、API函數
findContours( InputOutputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset=Point());
函數參數詳解:
1、image,單通道圖像矩陣,可以是灰度圖,但更常用的是二值圖像,一般是經過Canny、拉普拉斯等邊緣檢測算子處理過的二值圖像;
2、第二個參數:contours,定義為“vector<vector<Point>> contours”,是一個向量,并且是一個雙重向量,向量內每個元素保存了一組由連續的Point點構成的點的集合的向量,每一組Point點集就是一個輪廓。有多少輪廓,向量contours就有多少元素。
3、hierarchy,定義為“vector<Vec4i> hierarchy”,輪廓結構信息;
4、int型的mode,定義輪廓的檢索模式:模式一:CV_RETR_EXTERNAL只檢測最外圍輪廓,包含在外圍輪廓內的內圍輪廓被忽略模式二:CV_RETR_LIST 檢測所有的輪廓,包括內圍、外圍輪廓,但是檢測到的輪廓不 建立等級關系,彼此之間獨立,沒有等級關系;模式三:CV_RETR_CCOMP 檢測所有的輪廓,但所有輪廓只建立兩個等級關系,外圍為頂 層,若外圍內的內圍輪廓還包含了其他的輪廓信息,則內圍內的所有輪廓均歸屬 于頂層模式四:CV_RETR_TREE, 檢測所有輪廓,所有輪廓建立一個等級樹結構。外層輪廓包含 內層輪廓,內層輪廓還可以繼續包含內嵌輪廓。
5、int型的method,定義輪廓的近似方法:方法一:CV_CHAIN_APPROX_NONE 保存物體邊界上所有連續的輪廓點到contours向量內方法二:CV_CHAIN_APPROX_SIMPLE 僅保存輪廓的拐點信息,把所有輪廓拐點處的點保 存入contours向量內,拐點與拐點之間直線段上的信息點不予保留。
6、Point偏移量,所有的輪廓信息相對于原始圖像對應點的偏移量,相當于在每一個檢測出的輪廓點上加上該偏移量。
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )
函數參數詳解:
其中第一個參數image表示目標圖像,
第二個參數contours表示輸入的輪廓組,每一組輪廓由點vector構成,
第三個參數contourIdx指明畫第幾個輪廓,如果該參數為負值,則畫全部輪廓,
第四個參數color為輪廓的顏色,
第五個參數thickness為輪廓的線寬,如果為負值或CV_FILLED表示填充輪廓內部,
第六個參數lineType為線型,
第七個參數為輪廓結構信息,
第八個參數為maxLevel
二、程序
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;//1、將BGR圖轉換為灰度圖;
//2、對灰度圖進行降噪處理,因為canny算子對噪聲敏感;
//3、使用canny算子對圖片進行邊緣檢測;
//4、對邊緣檢測后的圖片進行輪廓識別;int main()
{Mat src = imread("2.png");imshow("原圖", src);Mat src_gray, src_blur,src_canny;if (src.channels()==3){cvtColor(src, src_gray, COLOR_BGR2GRAY);}blur(src_gray, src_blur, Size(3,3));Canny(src_blur, src_canny, 100, 200, 3);vector<vector<Point> > contours;vector<Vec4i> hierarchy;findContours(src_canny, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));Mat draw = Mat::zeros(src_canny.size(), CV_8UC3);for (int i = 0; i < contours.size(); i++){drawContours(draw, contours, i, Scalar(255, 255, 255), 2, 8, hierarchy, 0, Point(0, 0));}namedWindow("Contours", WINDOW_AUTOSIZE);imshow("Contours", draw);waitKey(0);return 0;
}
?
?
總結
- 上一篇: OpenCV后投影,利用阈值函数分割指定
- 下一篇: (opencv)ORB匹配算法