所以我们尝试代码:
cv::Mat m1, m2;
cv::VideoCapture cap(0);
do {
cap >> m1;
cap >> m2;
} while(cv::norm(m1,m2)==0);
frames+=2;
//...
但似乎没有用。那么如果从相机捕获的帧数据内容是否相同,如何获得bool?
答案 0 :(得分:2)
你的方法失败了,因为在真实的相机视频流中(从你的代码中我看到你从相机中捕获)每两帧都不相同,因为噪音,变化的照明,小的相机运动等。你可以改变你的检查: / p>
cv::norm(m1,m2) < epsilon
epsilon
是一些您可以自己找到的无符号数字(取决于您的标准)。这是一个非常快速和简单的解决方案。
查看 karlphillip 的链接,以获得更有效的解决方案。
答案 1 :(得分:0)
Google“opencv difference”=&gt;
答案 2 :(得分:0)
在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'。