【问题标题】:Are 2 simultaneous webcam windows possible with openCV?openCV 可以同时使用 2 个网络摄像头窗口吗?
【发布时间】:2011-04-15 21:01:27
【问题描述】:

我正在将常见的图像转换应用于我的实时网络摄像头捕获。我想在一个窗口中显示原始网络摄像头,并在另一个窗口中显示应用了变换的图像。但是,我在两个窗口上都得到了相同的图像(过滤),我想知道我是否受到OpenCV API 的限制,或者我是否遗漏了什么?我的代码 sn-p 看起来像 -

/* allocate resources */
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE);
cvNamedWindow("Filtered", CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCaptureFromCAM(0);

do {    
    IplImage* img = cvQueryFrame(capture);
    cvShowImage("Original", img);           

    Filters* filters = new Filters(img);
    IplImage* dst = filters->doSobel();
    cvShowImage("Filtered", dst);

    cvWaitKey(10);      
} while (1);

/* deallocate resources */
cvDestroyWindow("Original");
cvDestroyWindow("Filtered");
cvReleaseCapture(&capture);

【问题讨论】:

  • +1 有趣的问题。

标签: c video opencv video-processing


【解决方案1】:

有可能!尝试将 img 复制到另一个 IplImage,然后再将其发送到处理,看看是否可以先。

是的,我知道你要说什么。但是,请先尝试一下,看看它是否符合您的要求。下面的代码只是为了说明你应该怎么做,我不知道它是否有效:

/* allocate resources */
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE);
cvNamedWindow("Filtered", CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCaptureFromCAM(0);    

do {    
    IplImage* img = cvQueryFrame(capture);
    cvShowImage("Original", img);           

    IplImage* img_cpy = cvCreateImage(cvGetSize(img), 8, 3);
    img_cpy = cvCloneImage(img);

    Filters* filters = new Filters(img_cpy);
    IplImage* dst = filters->doSobel();
    cvShowImage("Filtered", dst);

    /* Be aware that if you release img_cpy here it might not display 
     * the data on the window. On the other hand, not doing it now will
     * cause a memory leak.
     */
    //cvReleaseImage( &img_cpy );  

    cvWaitKey(10);      
} while (1);

/* deallocate resources */
cvDestroyWindow("Original");
cvDestroyWindow("Filtered");
cvReleaseCapture(&capture);

【讨论】:

  • 啊!不起作用,再想一想,我注意到最后一个 cvShowImage() 是两个窗口上显示的内容,所以如果我将 cvShowImage("Original") 移动到 cvShowImage("Filtered") 下面,我开始在两个窗口上获取 Original,和过滤消失!
  • 代码中存在错误,我已修复。我稍后会看看这个。我过去已经这样做了,也许不完全是这样,但我知道这样做是可能的。
  • 好的,成功了!实际上我自己已经将副本传递给Filters构造函数,但我没有执行cvCreateImage(),我想知道为什么我需要它,cvCloneImage()不会在克隆时分配新的存储空间并返回指向新位置的指针吗?跨度>
  • 我不确定。无论如何,如果它对您有帮助,请不要忘记投票支持我的答案,如果它解决了您的问题,请接受它作为官方答案。
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多