最近在学习研究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;
}
处理效果,如下图所示:
该效果是未加腐蚀处理的效果,如果添加了腐蚀处理后,整张图片将是黑色。说明看到的轮廓中差异点都是些离散的点,不能直接被引用。