方法1:
使用opencv,我的opencv版本是2.4.6.1,最新版,摄像头是中星微的z301p,系统Ubuntu,摄像头驱动linux内核自带,很遗憾这种方法我测试时发现只支持单摄像头,如果强行增加摄像头,运行时会出各种错误而且奇卡,原因不明
头文件代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <QTime>
#include "opencv.hpp"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QTimer *timer;
CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
IplImage *frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
private slots:
void openCamera();
void readCamera();
void closeCamera();
};
#endif // MAINWINDOW_H
cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QImage>
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!");
}
timer->start(33);
}
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));
}
void MainWindow::closeCamera()
{
timer->stop();
cvReleaseCapture(&cam);
}
======================================割===============================================
方法2:
使用v4l2