文章目录 findContours 发现边缘 drawContours 绘制边缘 大致流程 示例
findContours 发现边缘
cv:: findContours (
InputOutputArray binImg, OutputArrayOfArrays contours,
OutputArray, hierachy
int mode,
int method,
Point offset= Point ( )
)
drawContours 绘制边缘
drawContours (
InputOutputArray binImg, OutputArrayOfArrays contours,
Int contourIdx
const Scalar & color,
int thickness,
int lineType ,
InputArray hierarchy,
int maxlevel,
Point offset= Point ( )
大致流程
输入图像转为灰度图像cvtColor 一系列降噪处理 一系列图像的增强 一系列阈值处理 使用Canny进行边缘提取,得到二值图像 使用findContours寻找轮廓 使用drawContours绘制轮廓
示例
# include <opencv2/opencv.hpp>
# include <iostream>
# include <math.h> using namespace std;
using namespace cv; Mat src, dst;
const char * output_win = "findcontours-demo" ;
int threshold_value = 100 ;
int threshold_max = 255 ;
RNG rng;
void Demo_Contours ( int , void * ) ; int main ( int argc, char * * argv) { src = imread ( "D:/vcprojects/images/happyfish.png" ) ; if ( src. empty ( ) ) { printf ( "could not load image...\n" ) ; return - 1 ; } namedWindow ( "input-image" ) ; namedWindow ( output_win) ; imshow ( "input-image" , src) ; cvtColor ( src, src, CV_BGR2GRAY) ; const char * trackbar_title = "Threshold Value:" ; createTrackbar ( trackbar_title, output_win, & threshold_value, threshold_max, Demo_Contours) ; Demo_Contours ( 0 , 0 ) ; waitKey ( 0 ) ; return 0 ;
} void Demo_Contours ( int , void * ) { Mat canny_output; vector< vector< Point>> contours; vector< Vec4i> hierachy; Canny ( src, canny_output, threshold_value, threshold_value * 2 , 3 , false) ; findContours ( canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point ( 0 , 0 ) ) ; dst = Mat:: zeros ( src. size ( ) , CV_8UC3) ; RNG rng ( 12345 ) ; for ( size_t i = 0 ; i < contours. size ( ) ; i++ ) { Scalar color = Scalar ( rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) ) ; drawContours ( dst, contours, i, color, 2 , 8 , hierachy, 0 , Point ( 0 , 0 ) ) ; } imshow ( output_win, dst) ;
}