文章目录
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) ;
}