opencv基礎(3)——cvFindContours提取輪廓
1、findContours函式原型以及引數介紹
void findContours ( InputOutputArray image, //輸入影象,必須是8位單通道影象,並且應該轉化成二值的
OutputArrayOfArrays contours, //檢測到的輪廓,每個輪廓被表示成一個point向量
OutputArray hierarchy, //可選的輸出向量,包含影象的拓撲資訊。其中元素的個數和檢測到的輪廓的數量相等
int mode, //說明需要的輪廓型別和希望的返回值方式
int method, //輪廓近似方法
Point offset = Point() //輪廓點相對偏移點 )
2、測試程式碼
#include <stdio.h> #include <iostream> #include <vector> #include "core.hpp" #include "highgui.hpp" #include "imgproc.hpp"
using namespace cv; using namespace std; int main() { //1 載入和現實原圖 Mat matSrc = imread("1.jpg", IMREAD_COLOR); namedWindow("matSrc"); imshow("matSrc", matSrc);
//2二值化原圖 Mat matBinnay(matSrc.rows, matSrc.cols, CV_8UC1); threshold(matSrc, matBinnay, 128, 255, THRESH_BINARY); imwrite("22.bmp", matBinnay);
//3提取輪廓 vector<vector<Point>> vPoints; //儲存輪廓點 vector<Vec4i> hierarchy; //儲存輪廓塊關係 findContours(matBinnay, vPoints, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
//4畫輪廓點 Mat matDraw = imread("1.bmp", IMREAD_COLOR); int iCount = vPoints.size(); for (int i = 0; iCount; i++) { vector<Point> vPoint = vPoints[i]; int iSize = vPoint.size(); for (int j = 0; j < iSize; j++) { Point pt = vPoint[j]; line(matDraw, pt, pt, Scalar(0, 0, 255), 3); } }
return 0; }