我试图在OpenCv中获得两个cv :: Mat帧之间的区别。所以这就是我尝试过的,
#include<opencv2\opencv.hpp>
#include<opencv2\calib3d\calib3d.hpp>
#include<opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
int main ()
{
cv::VideoCapture cap(0);
cv::Mat frame, frame1,frame2;
int key=0;
while(key!=27){
cap >> frame;
if(key=='c'){
frame1 = frame;
key = 0;
}
if(key =='x'){
cv::absdiff(frame, frame1, frame2); // I also tried frame2= (frame -frame1)*255;
cv::imshow("difference ",frame2);
key =0;
}
cv::imshow("stream",frame);
key = cv::waitKey(10);
}
}
结果始终是一个0矩阵,任何想法我在这里做错了什么? 提前感谢您的帮助。
答案 0 :(得分:11)
Mat对象是指针类型。在使用frame1 = frame直接将frame1设置为frame之后,两个矩阵也显示相同的点和相同的帧。您必须使用Mat的“copyTo”方法复制帧值。
答案 1 :(得分:7)
documentation of the Mat type州:
Mat基本上是一个包含两个数据部分的类:矩阵头和指向包含像素值的矩阵的指针。 [...] 每当有人复制Mat对象的标题时,矩阵的计数器就会增加。每当清洁标题时,该计数器就会减少。当计数器达到零时,矩阵也被释放。 有时你也想复制矩阵本身,所以OpenCV提供了clone()和copyTo()函数。
cv::Mat F = A.clone();
cv::Mat G;
A.copyTo(G);
答案 2 :(得分:4)
OpenCV重载cv::Mat
个对象上的做法操作符,以便行mat1 = mat2
仅影响指向mat1
中数据的指针(指向与mat2
相同的数据)。这样可以避免耗费所有图像数据的耗时。
如果要保存矩阵的数据,则必须编写mat1 = mat2.clone()
或mat2.copyTo(mat1)
。
答案 3 :(得分:0)
我正在寻找类似的程序而且我遇到了你的帖子,这里是我为frameDifferencing编写的一个示例,希望这有帮助,下面的函数会给你两帧之间的差异
/** @function differenceFrame */
Mat differenceFrame( Mat prev_frame, Mat curr_frame )
{
Mat image = prev_frame.clone();
printf("frame rows %d Cols %d\n" , image.rows, image.cols);
for (int rows = 0; rows < image.rows; rows++)
{
for (int cols = 0; cols < image.cols; cols++)
{
/* printf("BGR value %lf %lf %lf\n" , abs(prev_frame.at<cv::Vec3b>(rows,cols)[0] -
curr_frame.at<cv::Vec3b>(rows,cols)[0]),
abs(prev_frame.at<cv::Vec3b>(rows,cols)[1] -
curr_frame.at<cv::Vec3b>(rows,cols)[0]),
abs(prev_frame.at<cv::Vec3b>(rows,cols)[2] -
curr_frame.at<cv::Vec3b>(rows,cols)[0]));
*/
image.at<cv::Vec3b>(rows,cols)[0] = abs(prev_frame.at<cv::Vec3b>(rows,cols)[0] -
curr_frame.at<cv::Vec3b>(rows,cols)[0]);
image.at<cv::Vec3b>(rows,cols)[1] = abs(prev_frame.at<cv::Vec3b>(rows,cols)[1] -
curr_frame.at<cv::Vec3b>(rows,cols)[1]);
image.at<cv::Vec3b>(rows,cols)[2] = abs(prev_frame.at<cv::Vec3b>(rows,cols)[2] -
curr_frame.at<cv::Vec3b>(rows,cols)[2]);
}
}
return image;
}