最近在学习研究OpenCV,做了个摄像头前后帧的比较效果,发现通过比较后,能发现物体轮廓。
具体算法见下:
//比较两张图片 BOOL COpencvCameraCtrl::DiffTwoPic() { Mat pre_gray; cv::namedWindow( "showCamera" ); cv::namedWindow( _T("jg") ); while(true) { //取得图像 Mat frame, bigFrame; vc >> bigFrame; if( !bigFrame.data ) { continue; } //frame = bigFrame( cv::Rect( 330, 200, 100, 70 ) ); frame = bigFrame; cv::imshow( "showCamera", frame ); Mat frame_gray; cv::cvtColor( frame, frame_gray, CV_BGR2GRAY ); if( !pre_gray.empty() ) { //比较图像 Mat abcdiff, erosion_dst; cv::absdiff(pre_gray, frame_gray, abcdiff); //腐蚀操作 /* int erosion_size = 1; int erosion_type = MORPH_RECT; Mat element = getStructuringElement( erosion_type, Size( 2*erosion_size + 1, 2*erosion_size+1 ), Point( erosion_size, erosion_size ) ); /// 腐蚀操作 erode( abcdiff, erosion_dst, element ); */ //二值化操作 Mat matthre; threshold( abcdiff, matthre, 5, 255, 0 ); cv::imshow( _T("jg"), matthre ); int nCount = cv::countNonZero( abcdiff ); if( nCount > 30 ) { //Beep(5500,150); } } //保存图像 frame_gray.copyTo(pre_gray); cv::waitKey(30); } return TRUE; }
处理效果,如下图所示:
该效果是未加腐蚀处理的效果,如果添加了腐蚀处理后,整张图片将是黑色。说明看到的轮廓中差异点都是些离散的点,不能直接被引用。
时间: 2024-11-21 00:26:18