【问题标题】:video capturing with opencv用opencv拍摄视频
【发布时间】:2013-08-16 00:52:31
【问题描述】:

我正在使用 openCV 为 Windows 编写一个 C 应用程序。我想从网络摄像头捕获视频并将其显示在窗口中。 该应用程序即将完成,但无法正常工作。我认为这是因为 cvQueryFrame() 总是返回 NULL 而我不知道为什么。我尝试在进入 while 之前捕获一些帧,但没有解决问题。

编译器没有显示任何错误。这不是编译问题,而是执行问题。我一步步调试,在行中

if(!originalImg) break;

它总是跳出来。这就是应用程序不会继续执行的原因。它打开和关闭非常快。 代码如下:

void main()
{
cvNamedWindow("Original Image", CV_WINDOW_AUTOSIZE);

while (1)
    {
    originalImg = cvQueryFrame(capture);

    if(!originalImg) break;

    cvShowImage("Original Image", originalImg);

    c = cvWaitKey(10);
    if( c == 27 ) break;
}

cvReleaseCapture(&capture);

cvDestroyWindow("Original Image");

}

让我们看看是否有人有一些想法并可以帮助我解决这个问题,谢谢!

【问题讨论】:

  • capture 是如何定义的?

标签: c opencv


【解决方案1】:

假设编译正常(包括所有相关库),可能是相机没有正确安装。您能否检查一下您是否可以使用网络摄像头(使用其他软件)

如果编译确实是问题,请参考以下相关问题: https://stackoverflow.com/a/5313594/1218748

快速总结:

重新编译opencv_highgui,将属性页C/C++面板中的“预处理器定义”改为包含:HAVE_VIDEOINPUT HAVE_DSHOW

还有其他很好的答案可以提出一些相关的优点,但我的直觉是上述解决方案可行:-)

【讨论】:

  • 感谢您的回答。我已经更改了我的项目的预处理器定义,添加了您所说的内容(HAVE_VIDEOINPUT 和 HAVE_DSHOW)。但是“重新编译opencv_highgui”是什么意思?添加了HAVE_VIDEOINPUT和HAVE_DSHOW后我需要做些什么吗?
  • 嗨@JeanClaude93。如果您进行更改,例如我提到的更改;为了实际实现您正在使用的库中的更改(在本例中为 highgui),您必须再次构建库以修改 dll 和 lib 文件。我不知道您使用的是哪个 IDE 和编译器,但这里是说明页面 opencv.willowgarage.com/wiki/…(注意:我将其指向 MS VS,因为通常人们从那里开始使用 opencv)
  • 哦,如果您以前从未执行过此过程,那么您可能使用了 MSVS 的预构建二进制文件。另请注意,您只需要构建highgui;不是整个 OpenCV 库集。
【解决方案2】:

您似乎还没有打开捕获。 在 main 开头添加:

CvCapture* capture = 0;
capture = cvCaptureFromCAM(0);

【讨论】:

  • 抱歉,我只展示了我的应用程序的主要部分。我在我的代码中声明了所有变量。还有其他建议吗?
  • 如果 capture 的值为 NULL,则检查调试器。如果是这样,那么opencv找不到你的相机。
  • 我刚刚检查过它,你是对的。捕获的值为 NULL。你知道我该如何解决这个问题吗?我正在使用装有 WebCAM 的 HP 笔记本电脑。
  • 尝试重新编译带有 HAVE_VIDEOINPUT HAVE_DSHOW 标志的 opencv(或只是 HighGui 模块)。在许多情况下,它会有所帮助。
  • “重新编译opencv”是什么意思?我对opencv没有高级知识,我不明白你的意思......
猜你喜欢
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多