外部矩形边界:boundingRect()函数
# include <opencv2/opencv.hpp>
# include <iostream>
# include <opencv2/highgui/highgui.hpp>
# include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
# include <iostream>
# include <fstream>
using namespace cv;
# include <opencv2/core/core.hpp>
int main ( )
{
Mat image ( 600 , 600 , CV_8UC3) ;
RNG& rng = theRNG ( ) ;
while ( 1 )
{
int count = rng. uniform ( 3 , 103 ) ;
vector< Point> points;
for ( int i = 0 ; i < count; i++ )
{
Point point;
point. x = rng. uniform ( image. cols / 4 , image. cols * 3 / 4 ) ;
point. y = rng. uniform ( image. rows / 4 , image. rows * 3 / 4 ) ;
points. push_back ( point) ;
}
RotatedRect box = minAreaRect ( Mat ( points) ) ;
Point2f vertex[ 4 ] ;
box. points ( vertex) ;
image = Scalar :: all ( 0 ) ;
for ( int i = 0 ; i < count; i++ )
circle ( image, points[ i] , 3 , Scalar ( rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) ) , FILLED) ;
for ( int i = 0 ; i < 4 ; i++ )
line ( image, vertex[ i] , vertex[ ( i + 1 ) % 4 ] , Scalar ( 100 , 200 , 211 ) , 2 ) ;
imshow ( "矩形包围示例" , image) ;
char key = ( char ) waitKey ( ) ;
if ( key == 27 || key == 'q' || key == 'Q' )
break ;
}
return 0 ;
}
轮廓的圆形边界
# include <opencv2/opencv.hpp>
# include <iostream>
# include <opencv2/highgui/highgui.hpp>
# include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
# include <iostream>
# include <fstream>
using namespace cv;
# include <opencv2/core/core.hpp>
int main ( )
{
Mat image ( 600 , 600 , CV_8UC3) ;
RNG& rng = theRNG ( ) ;
while ( 1 )
{
int count = rng. uniform ( 3 , 103 ) ;
vector< Point> points;
for ( int i = 0 ; i < count; i++ )
{
Point point;
point. x = rng. uniform ( image. cols / 4 , image. cols * 3 / 4 ) ;
point. y = rng. uniform ( image. rows / 4 , image. rows * 3 / 4 ) ;
points. push_back ( point) ;
}
Point2f center;
float radius = 0 ;
minEnclosingCircle ( Mat ( points) , center, radius) ;
image = Scalar :: all ( 0 ) ;
for ( int i = 0 ; i < count; i++ )
circle ( image, points[ i] , 3 , Scalar ( rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) ) , FILLED, LINE_AA) ;
circle ( image, center, cvRound ( radius) , Scalar ( rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) , rng. uniform ( 0 , 255 ) ) , 2 , LINE_AA) ;
imshow ( "圆形包围示例" , image) ;
char key = ( char ) waitKey ( ) ;
if ( key == 27 || key == 'q' || key == 'Q' )
break ;
}
return 0 ;
}
使用多边形包围轮廓
# include <opencv2/opencv.hpp>
# include <iostream>
# include <opencv2/highgui/highgui.hpp>
# include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
# include <iostream>
# include <fstream>
using namespace cv;
# include <opencv2/core/core.hpp>
# define WINDOW_NAME1 "【原始图窗口】"
# define WINDOW_NAME2 "【效果图窗口】"
Mat g_srcImage;
Mat g_grayImage;
int g_nThresh = 50 ;
int g_nMaxThresh = 255 ;
RNG g_rng ( 12345 ) ;
void on_ContoursChange ( int , void * ) ;
static void ShowHelpText ( ) ;
int main ( )
{
system ( "color 1A" ) ;
g_srcImage = imread ( "1.jpg" , 1 ) ;
if ( ! g_srcImage. data) { printf ( "读取图片错误,请确定目录下是否有 imread 函数指定的图片存在~! \n" ) ; return false ; }
cvtColor ( g_srcImage, g_grayImage, COLOR_BGR2GRAY) ;
blur ( g_grayImage, g_grayImage, Size ( 3 , 3 ) ) ;
namedWindow ( WINDOW_NAME1, WINDOW_AUTOSIZE) ;
imshow ( WINDOW_NAME1, g_srcImage) ;
createTrackbar ( " 阈值:" , WINDOW_NAME1, & g_nThresh, g_nMaxThresh, on_ContoursChange) ;
on_ContoursChange ( 0 , 0 ) ;
waitKey ( 0 ) ;
return ( 0 ) ;
}
void on_ContoursChange ( int , void * )
{
Mat threshold_output;
vector< vector< Point>> contours;
vector< Vec4i> hierarchy;
threshold ( g_grayImage, threshold_output, g_nThresh, 255 , THRESH_BINARY) ;
findContours ( threshold_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point ( 0 , 0 ) ) ;
vector< vector< Point> > contours_poly ( contours. size ( ) ) ;
vector< Rect> boundRect ( contours. size ( ) ) ;
vector< Point2f> center ( contours. size ( ) ) ;
vector< float > radius ( contours. size ( ) ) ;
for ( unsigned int i = 0 ; i < contours. size ( ) ; i++ )
{
approxPolyDP ( Mat ( contours[ i] ) , contours_poly[ i] , 3 , true ) ;
boundRect[ i] = boundingRect ( Mat ( contours_poly[ i] ) ) ;
minEnclosingCircle ( contours_poly[ i] , center[ i] , radius[ i] ) ;
}
Mat drawing = Mat :: zeros ( threshold_output. size ( ) , CV_8UC3) ; for ( int unsigned i = 0 ; i < contours. size ( ) ; i++ )
{
Scalar color = Scalar ( g_rng. uniform ( 0 , 255 ) ,
g_rng. uniform ( 0 , 255 ) , g_rng. uniform ( 0 , 255 ) ) ;
drawContours ( drawing, contours_poly, i, color, 1 , 8 , vector < Vec4i> ( ) , 0 , Point ( ) ) ;
rectangle ( drawing, boundRect[ i] . tl ( ) , boundRect[ i] . br ( ) , color, 2 , 8 , 0 ) ;
circle ( drawing, center[ i] , ( int ) radius[ i] , color, 2 , 8 , 0 ) ;
}
namedWindow ( WINDOW_NAME2, WINDOW_AUTOSIZE) ;
imshow ( WINDOW_NAME2, drawing) ;
}