1. 程式人生 > >opencv基礎(3)——cvFindContours提取輪廓

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