我们试试这样的代码:
cv::Mat m1, m2;
cv::VideoCapture cap(0);
do {
cap >> m1;
cap >> m2;
} while(cv::norm(m1,m2)==0);
frames+=2;
//...
,但似乎不起作用。那么如何获得bool如果帧数据内容从相机捕获是相同的或不?
你的方法失败了,因为在真实的相机视频流中(从你的代码中我看到你从相机捕获)每两帧不相等,因为噪音,改变照明,小相机运动等。你可以这样修改支票:
cv::norm(m1,m2) < epsilon
其中epsilon
是一些你可以自己找到的无符号数(它取决于你的标准)。这是一个非常快速和简单的解决方案。
查看karlphillip的链接以获得更有效的解决方案
Google "opencv difference" =>
- http://andybest.net/2009/02/processing-opencv-tutorial-2-bubbles/
- http://ubaa.net/shared/processing/opencv/opencv_absdiff.html
- http://createdigitalmotion.com/2009/02/processing-tutorials-getting-started-with-video-processing-via-opencv/
opencv.absDiff ()
等
我知道在OpenCV中没有这样的函数,但它可以很容易地实现。任何返回元素和的函数都是错误的,因为一个像素的差异可以通过其他像素的差异来补偿。保证正确性的唯一方法是逐像素检查。下面是一个简单的例子:
template<typename T>
bool identical(cv::Mat m1, cv::Mat m2)
{
if(m1.cols != m2.cols || m1.rows != m2.rows)
return false;
for(int i=0; i<m1.rows; i++)
{
for(int j=0; j<m1.cols; j++)
{
if(m1.at<T>(i, j) != m2.at<T>(i, j))
return false;
}
}
return true;
}
我没有检查代码,所以,只要按ctrl+c就可以了