OpenCV在单独的窗口中显示传入视频和修改后的视频

时间:2010-10-20 22:37:51

标签: c opencv

这应该很容易。我有一个从我的网络摄像头进来的视频流。我只是在玩图像转换等。我希望能够在一个窗口中查看原始图像(视频输入),在另一个窗口中查看转换后的视频。问题是,一旦我开始捕获视频而不是单个图像,原始视频窗口就会显示转换后的视频。我不明白为什么。

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;
    }
}

在这个简单的例子中,两个视频流最终都显示为灰度......帧和灰度的指针值和图像数据完全不同。如果我停止在“out”窗口中显示灰度,则框架将以彩色显示。

此外,如果我继续在灰度图像上应用Sobel操作并将结果显示为“out”,则“in”和“out”窗口将显示Sobel图像!

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我已经在mandriva 2010下使用openCV 2.0尝试了你的代码,它在CV_WINDOW_AUTOSIZE或0下工作正常。

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