我正在尝试通过同时从两个USB网络摄像头读取便宜的立体相机。我的代码:
int main(int argc, char** argv)
{
char * window1_name = "Cam 1";
char * window2_name = "Cam 2";
CvCapture* capture1 = cvCaptureFromCAM( 1 );
CvCapture* capture2 = cvCaptureFromCAM( 2 );
namedWindow(window1_name, CV_WINDOW_AUTOSIZE );
namedWindow(window2_name, CV_WINDOW_AUTOSIZE );
while ( 1 ) {
// Get one frame
IplImage* cam1_frame = cvQueryFrame( capture1);
IplImage* cam2_frame = cvQueryFrame( capture2 );
usleep(100000);
cvShowImage( window1_name, cam1_frame );
cvShowImage( window2_name, cam2_frame );
if ( (cvWaitKey(10) & 255) == 27 ) break;
}
cvReleaseCapture( &capture1 );
cvReleaseCapture( &capture2 );
}
我得到以下输出。
VIDIOC_QUERYMENU: Invalid argument
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
我的相机都是Logitech c210,我在Ubuntu 12.10上。当我尝试从一台摄像机流式传输时,我能够看到每台摄像机的信号源。一个摄像头是cvCaptureFromCAM(1),另一个是cvCaptureFromCAM(2),但它不能同时工作。我尝试编译最新的v4l,我相信这是相机的用途。仍然没有。
编辑:
原来我的USB总线仅支持900 MB / s,每个摄像头的默认分辨率为640x480,速度为480 MB / s。我使用v4l2-ctl程序在执行程序之前更改默认分辨率,它以较低的分辨率工作。
v4l2-ctl -d /dev/video1 --set-fmt-video=width=320,height=240,pixelformat=YUYV
v4l2-ctl -d /dev/video2 --set-fmt-video=width=320,height=240,pixelformat=YUYV
./my_program
答案 0 :(得分:0)
您可能有可能错过了一些头文件。以下代码在我的机器中运行完美。虽然我正在使用Windows。我没有UBUNTU机器来测试。如何尝试以下代码。
Opencv将“0”作为默认摄像头。所以把它设为0和1。
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/contrib/contrib.hpp"
#include <stdio.h>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <stdlib.h>
#include <time.h>
int main(int argc, const char** argv)
{
const char * window1_name = "Cam 1";
const char * window2_name = "Cam 2";
CvCapture* capture1 = cvCaptureFromCAM( 0 );
CvCapture* capture2 = cvCaptureFromCAM( 1 );
namedWindow(window1_name, CV_WINDOW_AUTOSIZE );
namedWindow(window2_name, CV_WINDOW_AUTOSIZE );
while ( 1 ) {
// Get one frame
IplImage* cam1_frame = cvQueryFrame( capture1);
IplImage* cam2_frame = cvQueryFrame( capture2 );
// sleep(100000);
cvShowImage( window1_name, cam1_frame );
cvShowImage( window2_name, cam2_frame );
if ( (cvWaitKey(10) & 255) == 27 ) break;
}
cvReleaseCapture( &capture1 );
cvReleaseCapture( &capture2 );
}