OpenCV在两个不同的窗口中显示原始视频和修改后的视频。

3

这应该很简单。我从我的网络摄像头中接收视频流,并对图像进行转换等操作。我想在一个窗口中查看原始图像(视频输入),在另一个窗口中查看转换后的视频。问题是,一旦我开始捕获视频而不仅仅是单个图像,原始视频窗口就会显示转换后的视频。我不明白为什么。

cvNamedWindow("in", CV_WINDOW_AUTOSIZE);
cvNamedWindow("out", CV_WINDOW_AUTOSIZE);

CvCapture *fc = cvCaptureFromCAM(0);

IplImage* frame = cvQueryFrame(fc);

if (!frame) {
    return 0;
}

IplImage* greyscale = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
IplImage* output = cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F , 1);

while(1){

    frame= cvQueryFrame(fc);
    cvShowImage("in", frame);

    // manually convert to greyscale
    for (int y = 0; y < frame->height; y++) {
        uchar* p = (uchar*) frame->imageData + y* frame->widthStep; // pointer to row
        uchar* gp = (uchar*) greyscale->imageData + y*greyscale->widthStep;  
        for(int x = 0; x < frame->width; x++){
            gp[x] = (p[3*x] + p[3*x+1] + p[3*x+2])/3;   // average RGB values 
        }
    }

    cvShowImage("out", greyscale);

    char c = cvWaitKey(33);
    if (c == 27) {
        return 0;
    }
}

在这个简单的例子中,两个视频流最终呈现出灰度...frame和greyscale的指针值和imagedata完全不同。如果我停止在“out”窗口显示灰度,则frame将以彩色显示。
此外,如果我继续对灰度图像应用Sobel操作,并在“out”中显示结果,则“in”和“out”窗口都将显示Sobel图像!
有什么想法吗?
2个回答

1
嗯,这很奇怪,但似乎使用CV_WINDOW_AUTOSIZE是问题所在?也许它在OpenCV 2.1中不受支持(我非常确定我正在运行的就是这个版本)。无论如何,在创建窗口时使用0代替CV_WINDOW_AUTOSIZE可以正常工作。

0

我已经在Mandriva 2010下尝试了你的代码,并且使用CV_WINDOW_AUTOSIZE或0都可以正常运行。

你可以尝试使用cvCvtColor(frame,grayscale,CV_RGB2GRAY)将其转换为灰度,看看问题是否仍然存在。


嗯,我正在运行openCV 2.1。由于窗口自适应大小的原因,出现了更多的错误...在某些情况下,第二个窗口会显示一半正确,一半是第一个窗口的乱码视图。无论哪种方式,使用0都可以解决所有问题。非常奇怪。 - wallacer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接