动态人物识别代码
int main ( )
{
VideoCapture cap ( "vtest.avi" ) ;
if ( ! cap. isOpened ( ) )
{
std:: cout << "无法打开视频文件或摄像头流" << std:: endl;
return - 1 ;
}
Mat prevFrame, prevGray;
cap >> prevFrame;
prevGray = Mat ( prevFrame. size ( ) , CV_8UC1, Scalar ( 255 ) ) ;
int kk = 0 ;
while ( true )
{
Mat nextFrame, nextGray;
cap >> nextFrame;
if ( nextFrame. empty ( ) )
break ;
Mat diff;
absdiff ( prevFrame, nextFrame, diff) ;
Mat gray;
cvtColor ( diff, gray, COLOR_BGR2GRAY) ;
GaussianBlur ( gray, gray, Size ( 9 , 9 ) , 2 , 2 ) ;
threshold ( gray, nextGray, 30 , 255 , THRESH_BINARY) ;
Mat currentGray;
bitwise_and ( prevGray, nextGray, currentGray) ;
Mat dilated;
Mat kernel = getStructuringElement ( MORPH_RECT, Size ( 3 , 3 ) ) ;
dilate ( currentGray, dilated, kernel, Point ( - 1 , - 1 ) , 3 ) ;
RNG rng ( 10086 ) ;
Mat out, stats, centroids;
int number = connectedComponentsWithStats ( dilated, out, stats, centroids, 8 , CV_16U) ;
vector< Vec3b> colors;
for ( int i = 0 ; i < number; i++ )
{
Vec3b vec3 = Vec3b ( rng. uniform ( 0 , 256 ) , rng. uniform ( 0 , 256 ) , rng. uniform ( 0 , 256 ) ) ;
colors. push_back ( vec3) ;
}
Mat result = Mat :: zeros ( prevFrame. size ( ) , CV_8UC3) ;
int w = result. cols;
int h = result. rows;
for ( int i = 1 ; i < number; i++ )
{
int center_x = centroids. at < double > ( i, 0 ) ;
int center_y = centroids. at < double > ( i, 1 ) ;
int x = stats. at < int > ( i, CC_STAT_LEFT) ;
int y = stats. at < int > ( i, CC_STAT_TOP) ;
int w = stats. at < int > ( i, CC_STAT_WIDTH) ;
int h = stats. at < int > ( i, CC_STAT_HEIGHT) ;
int area = stats. at < int > ( i, CC_STAT_AREA) ;
if ( area < 500 )
{
continue ;
}
Rect rect ( x, y, w, h) ;
rectangle ( prevFrame, rect, colors[ i] , 2 ) ;
}
imshow ( "Motion Detection" , prevFrame) ;
if ( waitKey ( 1 ) == 27 )
break ;
prevGray = nextGray;
prevFrame = nextFrame;
}
cap. release ( ) ;
destroyAllWindows ( ) ;
return 0 ;
}