在openv中获取两帧之间的差异
Getting the difference between two frames in opencv
我试图在OpenCv中获得两个cv::Mat帧之间的差异。这就是我所尝试的,
#include<opencv2opencv.hpp>
#include<opencv2calib3dcalib3d.hpp>
#include<opencv2corecore.hpp>
#include <opencv2highguihighgui.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矩阵,知道我在这里做错了什么吗?谢谢你的帮助。
Mat对象是指针类型的。在使用frame1 = frame直接将frame1设置为frame之后,两个矩阵也显示相同的点和相同的帧。你必须使用Mat.
OpenCV矩阵内部使用指针
Mat类型的文档说明:
Mat基本上是一个包含两个数据部分的类:矩阵头和指向包含像素值的矩阵的指针。[…]每当有人复制Mat对象的标头时,矩阵的计数器就会增加。每当清除标头时,此计数器就会减少。当计数器达到零时,矩阵也被释放。有时候你也想复制矩阵本身,所以OpenCV提供了clone()和copyTo()函数。
cv::Mat F = A.clone();
cv::Mat G;
A.copyTo(G);
OpenCV重载cv::Mat
对象上的影响操作符,以便行mat1 = mat2
仅影响指向mat1
中的数据的指针(指向与mat2
相同的数据)。这避免了耗时的所有图像数据的副本。
如果你想保存矩阵的数据,你必须写mat1 = mat2.clone()
或mat2.copyTo(mat1)
。
我正在寻找一个类似的程序,我看到了你的帖子,这是我为framedifference写的一个样本,希望这有所帮助,下面的函数将给你两个帧之间的差异
/** @function differenceFrame */
Mat differenceFrame( Mat prev_frame, Mat curr_frame )
{
Mat image = prev_frame.clone();
printf("frame rows %d Cols %dn" , 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 %lfn" , 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;
}
相关文章:
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 给定两个偶数,求出它们之间所有偶数的平方和
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- 查找字符在两个索引之间出现的次数
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- C++两个源文件之间共享的枚举的静态实例
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 以天C++为单位的两个时间戳之间的差异
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 在C++中查找两个向量之间最相似的值
- 两个有符号数字之间的距离
- 这两种C++语法之间有什么区别?
- Directx 12 :在两个进程之间共享图形内存
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- 如何使用OpenCV计算两帧之间的旋转平移矩阵
- 如何跳过前两帧
- 在openv中获取两帧之间的差异