gpt4 book ai didi

objective-c - objective-c 方法中的IplImage *

转载 作者:行者123 更新时间:2023-12-02 16:57:13 24 4
gpt4 key购买 nike

我想在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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com