Qt 显示实时摄像头内容

方法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

 

你可能感兴趣的:(Qt 显示实时摄像头内容)