在opencv中获得两个帧之间的差异

Eng*_*ine 3 c++ opencv

我试图在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);
     }
  }
Run Code Online (Sandbox Code Playgroud)

结果总是相同的0矩阵,任何想法我在这里做错了什么?在此先感谢您的帮助.

Fua*_*kun 11

Mat对象是指针类型.在使用frame1 = frame直接将frame1设置为frame之后,两个矩阵也显示相同的点和相同的帧.您必须使用Mat的"copyTo"方法复制帧值.


djf*_*djf 7

OpenCV Matrixes在内部使用指针

Mat类型文档说明:

Mat基本上是一个包含两个数据部分的类:矩阵头和指向包含像素值的矩阵的指针.[...]每当有人复制Mat对象的标题时,矩阵的计数器就会增加.每当清洁标题时,该计数器就会减少.当计数器达到零时,矩阵也被释放.有时你也想复制矩阵本身,所以OpenCV提供了clone()和copyTo()函数.

cv::Mat F = A.clone();
cv::Mat G;
A.copyTo(G);
Run Code Online (Sandbox Code Playgroud)