当前位置: 技术问答>求教:在一台机器上多个进程之间使用udp通信是否可靠,谢谢
iis7站长之家
如何使用opencv 连接多个摄像头
来源: 互联网 发布时间:2017-04-30
本文导语: 系统是UBUNTU-11.04 opencv版本是2.4.6.1 摄像头是微星z301p 两个USB摄像头用hub连接 将两个摄像头视频同时显示到Qt界面中 ------------------------- 代码: #include "mainwindow.h" #include "ui_mainwindow.h" #include #include MainWindow::MainWindow...
系统是UBUNTU-11.04
opencv版本是2.4.6.1
摄像头是微星z301p
两个USB摄像头用hub连接
将两个摄像头视频同时显示到Qt界面中
-------------------------
代码:
则开始后两个摄像图均无画面显示,并输出错误:
/root/Qtworkspace/TestOpenCv-build-desktop/TestOpenCv 启动中...
HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP
HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP
select timeout
select timeout
OpenCV Error: Assertion failed (buf.data && buf.isContinuous()) in imdecode_, file /root/package/opencv-2.4.6.1/modules/highgui/src/loadsave.cpp, line 307
terminate called after throwing an instance of 'cv::Exception'
what(): /root/package/opencv-2.4.6.1/modules/highgui/src/loadsave.cpp:307: error: (-215) buf.data && buf.isContinuous() in function imdecode_
程序异常终止。
如果修改readCamera()函数为
则第一个摄像头有输出,第二个没有
程序打印输出:
/root/Qtworkspace/TestOpenCv-build-desktop/TestOpenCv 启动中...
HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP
HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP
VIDIOC_STREAMON: 输入/输出错误
get frame2 error!
VIDIOC_QBUF: 无效的参数
get frame2 error!
VIDIOC_QBUF: 无效的参数
get frame2 error!
请教该问题如何解决
opencv版本是2.4.6.1
摄像头是微星z301p
两个USB摄像头用hub连接
将两个摄像头视频同时显示到Qt界面中
-------------------------
代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
cam=NULL;
cam_2=NULL;
timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(readCamera()));
connect(ui->open,SIGNAL(clicked()),this,SLOT(openCamera()));
connect(ui->close,SIGNAL(clicked()),this,SLOT(closeCamera()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::openCamera()
{
cam=cvCaptureFromCAM(200);//CV_CAP_V4L2
if(!cam)
{
qDebug("create camera1 capture error!");
}
cam_2=cvCaptureFromCAM(201);//CV_CAP_V4L2+1
if(!cam_2)
{
qDebug("create camera2 capture error!");
}
timer->start(33);
}
void MainWindow::readCamera()
{
frame_2=cvQueryFrame(cam_2);
if(!frame_2)
{
qDebug("get frame2 error!");
return;
}
QImage image_2=QImage((const uchar*)frame_2->imageData, frame_2->width, frame_2->height, QImage::Format_RGB888).rgbSwapped();//rgbSwapped()用于转换QImage对象从RGB->BGR
ui->label_2->setPixmap(QPixmap::fromImage(image_2));
frame=cvQueryFrame(cam);
if(!frame)
{
qDebug("get frame1 error!");
return;
}
QImage image=QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();//rgbSwapped()用于转换QImage对象从RGB->BGR
ui->label->setPixmap(QPixmap::fromImage(image));
}
void MainWindow::closeCamera()
{
timer->stop();
cvReleaseCapture(&cam);
cvReleaseCapture(&cam_2);
}
则开始后两个摄像图均无画面显示,并输出错误:
/root/Qtworkspace/TestOpenCv-build-desktop/TestOpenCv 启动中...
HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP
HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP
select timeout
select timeout
OpenCV Error: Assertion failed (buf.data && buf.isContinuous()) in imdecode_, file /root/package/opencv-2.4.6.1/modules/highgui/src/loadsave.cpp, line 307
terminate called after throwing an instance of 'cv::Exception'
what(): /root/package/opencv-2.4.6.1/modules/highgui/src/loadsave.cpp:307: error: (-215) buf.data && buf.isContinuous() in function imdecode_
程序异常终止。
如果修改readCamera()函数为
void MainWindow::readCamera()
{
frame=cvQueryFrame(cam);
if(!frame)
{
qDebug("get frame1 error!");
return;
}
QImage image=QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();//rgbSwapped()用于转换QImage对象从RGB->BGR
ui->label->setPixmap(QPixmap::fromImage(image));
frame_2=cvQueryFrame(cam_2);
if(!frame_2)
{
qDebug("get frame2 error!");
return;
}
QImage image_2=QImage((const uchar*)frame_2->imageData, frame_2->width, frame_2->height, QImage::Format_RGB888).rgbSwapped();//rgbSwapped()用于转换QImage对象从RGB->BGR
ui->label_2->setPixmap(QPixmap::fromImage(image_2));
}
则第一个摄像头有输出,第二个没有
程序打印输出:
/root/Qtworkspace/TestOpenCv-build-desktop/TestOpenCv 启动中...
HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP
HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP
VIDIOC_STREAMON: 输入/输出错误
get frame2 error!
VIDIOC_QBUF: 无效的参数
get frame2 error!
VIDIOC_QBUF: 无效的参数
get frame2 error!
请教该问题如何解决
|
HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP
是因为设置图像分辨率失败,使用了默认分辨率
第二个摄像头没有输出,是因为第一个摄像头占用了USB口的全部带宽
把分辨率设置为320*240带宽就够用,不过首先要解决第一个问题
另一个方法是强制摄像头计算所需带宽,而不是申请全部带宽
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
是因为设置图像分辨率失败,使用了默认分辨率
第二个摄像头没有输出,是因为第一个摄像头占用了USB口的全部带宽
把分辨率设置为320*240带宽就够用,不过首先要解决第一个问题
另一个方法是强制摄像头计算所需带宽,而不是申请全部带宽
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
|
我不知道 我帮你顶