当前位置:  技术问答>求教:在一台机器上多个进程之间使用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界面中
-------------------------
代码:
#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

|
我不知道 我帮你顶

    
 
 

您可能感兴趣的文章:

  • linux下使用摄像头问题
  • 有在linux下使用价格低于100的摄像头吗?
  • 有什么软件在linux下使用usb摄像头的么?
  • linux下usb 摄像头驱动如何使用
  • 100分请教一下如何设置ov9650的摄像头寄存器设置---在友善之臂中使用
  • android开发之调用手机的摄像头使用MediaRecorder录像并播放
  • 请问如何在一个文件系统修改源码管理并使用多个卷(存储设备)
  • 怎么使用grep查找满足多个关键字任意一个的行
  • 一个虚拟主机使用多个域名的配置方法(apache)该怎么写?
  • jquery代码-如何使用多个属性来进行过滤
  • 多个用户同时使用bean,bean中的变量和方法会不会冲突?
  • 问个简单的问题,redhat能不能多个人同时使用root账户?
  • 请问如何在linux下一个工程里面使用多个cpp文件
  • ftp账号与多个使用者的疑惑
  • 在shell脚本中如何使用FTP一次删除远端的多个文件?
  • php使用array_rand()函数从数组中随机选择一个或多个元素
  • Linux下面如何使用make命令编译多个.c文件
  • apache中使用mod_gnutls模块实现多个SSL站点配置(多个HTTPS协议的虚拟主机)
  • linux下一次使用多个静态库的makefile编写?
  • 调用同一个函数建立的多个线程,如何使用函数的数据?
  • 不使用semget等信号量相关的函数如何实现多个进程对同一个文件的访问
  • 多个文件使用同一个函数时的重复定义错误
  • 求教:在一台机器上多个进程之间使用udp通信是否可靠,谢谢
  • 在linux7.3下多个线程使用 pthread_cond_t 的一个小问题。
  • 如何实现只有指定的计算机可以登录系统?(系统为JSP+EJB,使用者跨多个网段)
  • php使用多个进程同时控制文件读写示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,