我想在openCV中对视频帧进行帧比较。
假设视频文件中的第10帧和第100帧。
如果在主视频捕获循环中执行此操作,它将起作用。但是现在我想将其移动到专用方法(将IplImages作为输入)。
// MAIN CAPTURE LOOP
while(1) {
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 10);
frame = cvQueryFrame(capture);
if (!frame) break;
cvShowImage("Window_1", frame);
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 100);
nextFrame = cvQueryFrame(capture);
if (!nextFrame) break;
cvShowImage("Window_2", nextFrame); // THIS SHOWS ME TWO DIFFERENT FRAMES
// PASS THE IMAGES TO THE NEW METHOD
[self compareFrame: frame withFrame: nextFrame]);
char c = cvWaitKey(5);
if(c==27) {
NSLog(@"ESC pressed!");
break;
}
这是我的方法(简体)
- (int) compareFrame: (IplImage*) firstFrame withFrame: (IplImage*) secondFrame
{
// THIS SHOWS ME ONLY THE firstFrame IN BOTH
// WINDOWS?
cvShowImage("Window_1", firstFrame);
cvShowImage("Window_2", secondFrame);
return 1;
}
为什么会这样?
最佳答案
这是因为您不拥有cvQueryFrame
的结果,而cvCapture
结构却拥有。如果要对结果进行处理,则必须首先进行复制。之所以看到两个不同的帧,是因为cvShowImage
在显示它之前先进行了自己的复制。到达调用[self compareFrame]
的位置后,frame和nextFrame指向相同的数据。
尝试以下方法:
while (1) {
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 10);
frame =cvQueryFrame(capture);
if (!frame) {
NSLog(@"Couldn't read frame 10");
break;
};
frame = cvCloneImage(frame); //Make a copy of the frame
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 100);
nextFrame = cvQueryFrame(capture);
if (!nextFrame) {
NSLog(@"Couldn't read frame 100");
break;
};
nextFrame = cvCloneImage(nextFrame); //Make a copy of the frame
// PASS THE IMAGES TO THE NEW METHOD
[self compareFrame: frame withFrame: nextFrame];
char c = cvWaitKey();
cvReleaseImage(&frame);
cvReleaseImage(&nextFrame);
if(c==27) {
NSLog(@"ESC pressed!");
break;
}
}
关于objective-c - objective-c 方法中的IplImage *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076327/