python - cvCaptureFromCAM(CV_CAP_ANY) 返回 NULL

标签 python c++ opencv

我有一段c++代码:

#include <opencv/highgui.h>
#include <iostream>

int main()
{
    CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); //tried (0) too
    if(capture == NULL)
        std::cout<<"NULL"<<std::endl;

    return 0;
}

并使用以下方法编译它:

g++ main.cpp `pkg-config opencv --cflags` `pkg-config opencv --libs`

./a.out的结果是

NULL

我使用 OpenCV 2.4.2 和 Ubuntu 12.04

但我确信我的网络摄像头是好的,因为下面的 python 代码工作正常。

import cv2
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
cv2.imshow('frame', frame) # it shows a correct image from the webcam
cv2.waitKey(0)

有人知道为什么我无法在 C++ 代码中读取我的网络摄像头吗?

更新:

然后我将 OpenCV 升级到 2.4.8 并再次编译 C++ 代码。 输出仍然是 NULL,因为它显示了一些错误消息:

VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
libv4l2: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl S_FMT
libv4l2: error setting pixformat: Device or resource busy
libv4l1: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT

NULL

最佳答案

我看到它说“设备/资源正忙”...我认为您正在其他地方使用您的网络摄像头...例如skype 等。否则尝试使用以下代码:

尝试使用(1)代替(0)

VideoCapture cap(1);

for(;;)
{
    Mat frame;
    cap >> frame;
    imshow("My webcam", frame);
}

上面的代码是针对C++格式的,如果你想得到一个IplImage,你可以添加下面一行,将Mat格式的“frame”转换成IplImage*格式

IplImage* img = new IplImage(frame);
cvShowImage("IplImage format webcam", img);

关于python - cvCaptureFromCAM(CV_CAP_ANY) 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21635495/

相关文章:

python - 占位符类方法 Python 3

c# - 使用cvTransform和cvGetAffineTransform openCv调整矩形大小

c++ - OpenCV 模板匹配 N 个最佳匹配不起作用

python - Pandas 转出独特的专栏

python - PySimpleGui 输出标题栏名称问题

c++ - 创建一个库?

c++ - 如何使用 Ximea 在 C++ 中存储图像

c++ - 打破 GLSL 着色器指令限制的错误消息是什么?

java - 使用 jni 将位图从 android 相机传递到 C++

python - 将 Python 项目转换为 C