这应该很容易。我有一个来 self 的网络摄像头的视频流。我只是在玩图像转换等。我希望能够在一个窗口中查看原始图像(视频输入),在另一个窗口中查看转换后的视频。问题是,一旦我开始捕捉视频而不是单张图像,原始视频窗口就会显示转换后的视频。我不明白为什么。
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 图像!
有什么想法吗?
最佳答案
嗯,这很奇怪,但问题似乎是使用 CV_WINDOW_AUTOSIZE?也许它在 OpenCV 2.1 中不受支持(我很确定我正在运行的是它)。无论如何,在创建窗口时使用 0 而不是 CV_WINDOW_AUTOSIZE 效果很好。
关于c - OpenCV 在单独的窗口中显示传入视频和修改后的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982884/