Visual studio 2010 为什么在opencv中读取avi文件时会出现while循环中断? intmain(intargc,char*argv[]){ 流文件; 文件打开(“Motion.dat”); int frame_number=0; CvCapture*capture=cvCreateFileCapture(“Cricketc1.avi”); CvCapture*capture1=cvCreateFileCapture(“Cricketc1.avi”); IplImage*imgsize=NULL; IplImage*img1=NULL; IplImage*img2=NULL; IplImage*vidFrame=NULL; IplImage*imggray1=NULL; IplImage*imggray2=NULL; IplImage*imggray3=NULL; cvNamedWindow(“视频”,0); cvNamedWindow(“视频1”,0); imgsize=cvQueryFrame(capture1); 断言(imgsize); CvSize sz=cvGetSize(imgsize); cvReleaseCapture(&capture1); imggray1=cvCreateImage(sz,IPL_DEPTH_8U,1); imggray2=cvCreateImage(sz,IPL_DEPTH_8U,1); imggray3=cvCreateImage(sz,IPL_DEPTH_8U,1); while(true){ 帧号++; img1=cvQueryFrame(捕获); 如果(img1->imageData==NULL) 打破 CVT颜色(img1、imggray1、CV_rgb2灰色); img2=cvQueryFrame(捕获); 如果(img2->imageData==NULL) 打破 CVT颜色(img1、imggray1、CV_rgb2灰色); cvAbsDiff(imggray1、imggray2、imggray3); CvScalar sumDiff=cvSum(imggray3); cout
您正在循环中从同一个cvCapture*读取两次图像:Visual studio 2010 为什么在opencv中读取avi文件时会出现while循环中断? intmain(intargc,char*argv[]){ 流文件; 文件打开(“Motion.dat”); int frame_number=0; CvCapture*capture=cvCreateFileCapture(“Cricketc1.avi”); CvCapture*capture1=cvCreateFileCapture(“Cricketc1.avi”); IplImage*imgsize=NULL; IplImage*img1=NULL; IplImage*img2=NULL; IplImage*vidFrame=NULL; IplImage*imggray1=NULL; IplImage*imggray2=NULL; IplImage*imggray3=NULL; cvNamedWindow(“视频”,0); cvNamedWindow(“视频1”,0); imgsize=cvQueryFrame(capture1); 断言(imgsize); CvSize sz=cvGetSize(imgsize); cvReleaseCapture(&capture1); imggray1=cvCreateImage(sz,IPL_DEPTH_8U,1); imggray2=cvCreateImage(sz,IPL_DEPTH_8U,1); imggray3=cvCreateImage(sz,IPL_DEPTH_8U,1); while(true){ 帧号++; img1=cvQueryFrame(捕获); 如果(img1->imageData==NULL) 打破 CVT颜色(img1、imggray1、CV_rgb2灰色); img2=cvQueryFrame(捕获); 如果(img2->imageData==NULL) 打破 CVT颜色(img1、imggray1、CV_rgb2灰色); cvAbsDiff(imggray1、imggray2、imggray3); CvScalar sumDiff=cvSum(imggray3); cout,visual-studio-2010,opencv,Visual Studio 2010,Opencv,您正在循环中从同一个cvCapture*读取两次图像:img1=cvQueryFrame(capture);和img2=cvQueryFrame(capture);。如果将第二行更改为img2=cvQueryFrame(capture2)它应该可以正常工作。我需要那一行来获取序列中的下一个图像。这样我就可以应用cvAbsDIff()在两个连续的帧之间…!好的,但是请注意,在循环中,您将从capture获取两次帧,但只增加frame\u number一次。增加两次,一切都会正常工作。我编辑了wh
img1=cvQueryFrame(capture);
和img2=cvQueryFrame(capture);
。如果将第二行更改为img2=cvQueryFrame(capture2)
它应该可以正常工作。我需要那一行来获取序列中的下一个图像。这样我就可以应用cvAbsDIff()在两个连续的帧之间…!好的,但是请注意,在循环中,您将从capture
获取两次帧,但只增加frame\u number
一次。增加两次,一切都会正常工作。我编辑了while循环。我希望每个帧都使用sumDiff
。sumDiff
是两个帧之间的差异连续的图像。但在这里它将只计算到625!我应该对代码做什么更改,以便它得到所有1251帧之间的差异?
int main(int argc, char* argv[]) {
ofstream file;
file.open("Motion.dat");
int frame_number = 0;
CvCapture* capture = cvCreateFileCapture("Cricketc1.avi");
CvCapture* capture1 = cvCreateFileCapture("Cricketc1.avi");
IplImage* imgsize = NULL;
IplImage *img1 = NULL;
IplImage *img2 = NULL;
IplImage *vidFrame = NULL;
IplImage *imggray1 = NULL;
IplImage *imggray2 = NULL;
IplImage *imggray3 = NULL;
cvNamedWindow("Video", 0);
cvNamedWindow("Video1", 0);
imgsize = cvQueryFrame(capture1);
assert(imgsize);
CvSize sz = cvGetSize(imgsize);
cvReleaseCapture(&capture1);
imggray1 = cvCreateImage(sz, IPL_DEPTH_8U, 1);
imggray2 = cvCreateImage(sz, IPL_DEPTH_8U, 1);
imggray3 = cvCreateImage(sz, IPL_DEPTH_8U, 1);
while (true) {
frame_number++;
img1 = cvQueryFrame(capture);
if(img1->imageData == NULL)
break;
cvCvtColor(img1, imggray1, CV_RGB2GRAY);
img2 = cvQueryFrame(capture);
if(img2->imageData == NULL)
break;
cvCvtColor(img1, imggray1, CV_RGB2GRAY);
cvAbsDiff( imggray1, imggray2, imggray3 );
CvScalar sumDiff = cvSum (imggray3);
cout << sunDiff.val[0] << sunDiff.val[1] << sunDiff.val[2] << endl;
cvWaitKey(40);
}
cvReleaseCapture(&capture);
cvDestroyAllWindows();
file.close();
system("Pause");
return 0;
}