当我在OpenCV上运行视频时,如何找到帧之间的差异?我需要做一个循环来检查帧之间的变化,并在另一个窗口中显示结果? 我可以在我附加的循环中执行此操作吗?或者还有另一种方法吗?
while( key != 'x' )
{
frame = cvQueryFrame( capture );
cvCvtColor(frame, gray, CV_RGB2GRAY);
//gray_frame = cvQueryFrame( capture );
//cvCvtColor(frame, gray_frame, CV_BGR2GRAY);
if(key==27)
break;
cvShowImage( "video",frame );
cvShowImage( "grayvideo",gray );
key = cvWaitKey( 1000 / fps );
}
cvDestroyWindow( "video" );
cvDestroyWindow( "grayvideo" );
cvReleaseCapture( &capture );
return 0;
我在命令窗口中收到此错误:编译器没有对齐堆栈变量。 Libavcodec被错误编译 并且可能非常慢或崩溃。这不是libavcodec中的错误, 但在编译器中。您可以尝试使用gcc> = 4.2重新编译。 不要向FFmpeg开发人员报告崩溃情况。 OpenCV错误:断言失败(src1.size()== dst.size()&& src1.type()== dst。 type())在未知函数中,文件........ \ ocv \ opencv \ src \ cxcore \ cxarithm.cpp ,第1563行
maby有什么问题maby的深度大小? 我该怎么办呢?或maby错误的代码? 非常感谢你的帮助答案 0 :(得分:3)
你可以减去两个Mat对象/指针。
Mat prev_frame;
cap.read(prev_frame);
while (1)
{
Mat frame;
cap.read(frame);
Mat dif = frame - prev_frame;
imshow("difference", dif);
// you can also use absdiff
//absdiff(frame, prev_frame, dif);
prev_frame = frame.clone();
}
答案 1 :(得分:1)
框架差异有简单的方法,但我建议您检查OpenCV中的运动模板示例。它位于OpenCVversion \ samples \ c \ motempl.exe。这是做出差异的一些先进方法,可能是你感兴趣的。
如果你想用帧减法来实现它,你应该创建另一个IplImage来存储最后一帧并从那一帧中减去当前帧。还要确保创建另一个窗口以查看结果。
您应该查看此post以获取有关减法的信息。
您的代码应该类似于以下伪代码:
allocate space for frame, oldFrame and destinationFrame, all the same size/type.
while(1){
copy current frame to oldFrame
grab new frame in frame
cvSub(frame,oldFrame,dest)
cvShow(dest)
}
我希望有所帮助。
亲切的问候, 丹尼尔
答案 2 :(得分:0)
这是您建议的新代码:
#include "stdafx.h"
#include <stdio.h> // For printf
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main()
{
int key = 0;
CvCapture* capture = cvCaptureFromAVI( "macroblock.mpg" );
IplImage* frame = cvQueryFrame( capture );
IplImage* currframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1);
IplImage* destframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1);
if ( !capture )
{
fprintf( stderr, "Cannot open AVI!\n" );
return 1;
}
int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS );
cvNamedWindow( "dest", CV_WINDOW_AUTOSIZE );
while( key != 'x' )
{
frame = cvQueryFrame( capture );
currframe = cvCloneImage( frame );
frame = cvQueryFrame( capture );
cvSub(frame,currframe,destframe);
if(key==27 )break;
cvShowImage( "dest",destframe);
key = cvWaitKey( 1000 / fps );
}
cvDestroyWindow( "dest" );
cvReleaseCapture( &capture );
return 0;
}