Qt下使用OpenCV捕获摄像头

来源:互联网 发布:淘宝开网店指导靠谱吗 编辑:程序博客网 时间:2024/05/20 01:10
        在Qt下没有专门的视频采集与播放工具。这里使用了OpenCV所带的库函数捕获摄像头的视频图像。这里要注意的是Qt的图像格式是RGB格式,而OpenCV的格式是BGR,所以要进行颜色通道的转换,用到了OpenCV的库函数:cvtColor函数。

       Qt的图像存储格式是QImage类,而OpenCV的图像格式是Mat,所以要进行转换:

Mat image = imread("1.jpg");//改变颜色通道的顺序cv::cvtColor(image, image, CV_BGR2RGB);//Qt图像QImage img = QImage((const unsigned char*)(image.data), image.cols, image.rows, QImage::Format_RGB888);//显示在label中ui->label->setPixmap(QPixmap::fromImage(img));  //将QImage 格式转换成 QPixmap格式用于绘制图像

 

           新建一个Qt GUI应用,建立一个新类CameraGet,继承QWidget类。创建的GUI界面如下:

 

CameraGet类的头文件如下:


#ifndef CAMERAGET_H#define CAMERAGET_H#include <QWidget>#include <QImage>#include <QPixmap>#include <QTimer>#include <opencv2/opencv.hpp>namespace Ui {    class CameraGet;}class CameraGet : public QWidget{    Q_OBJECTpublic:    explicit CameraGet(QWidget *parent = 0);    ~CameraGet();public slots:    void openCamera();   //打开摄像头    void readFrame();    //读取当前帧信息    void closeCamera();  //关闭摄像头    void takingPictures();  //拍照private:    Ui::CameraGet *ui;    QTimer *timer;    QImage qimage;  //q开头表示Qt的图像格式    cv::VideoCapture capture;    cv::Mat cvframe;  //cv开头表示是OpenCv的图像格式};#endif // CAMERAGET_H


 CameraGet类的实现文件:

#include "cameraget.h"#include "ui_cameraget.h"CameraGet::CameraGet(QWidget *parent) :    QWidget(parent),    ui(new Ui::CameraGet){    ui->setupUi(this);    timer = new QTimer(this);    connect(timer, SIGNAL(timeout()), this, SLOT(readFrame()));    connect(ui->openCam, SIGNAL(clicked()),this, SLOT(openCamera()));    connect(ui->tackingPic, SIGNAL(clicked()), this, SLOT(takingPictures()));    connect(ui->closeCam, SIGNAL(clicked()), this, SLOT(closeCamera()));}CameraGet::~CameraGet(){    delete ui;}//打开摄像头void CameraGet::openCamera(){    capture = cv::VideoCapture(0);    timer->start(33);}//读取摄像头信息void CameraGet::readFrame(){    //捕获摄像头一帧图像    capture >> cvframe;    //颜色通道转换    cv::cvtColor(cvframe, cvframe, CV_BGR2RGB);    //获取QImage格式的图像    qimage = QImage((const uchar*)(cvframe.data), cvframe.cols, cvframe.rows, QImage::Format_RGB888);    //将图像显示在label中, 之前要把QImage格式的图像转换成QPixmap格式    ui->label->setPixmap(QPixmap::fromImage(qimage));}//拍照void CameraGet::takingPictures(){    ui->label_2->setPixmap(QPixmap::fromImage(qimage));}//关闭摄像头void CameraGet::closeCamera(){    timer->stop();    capture.release();}


演示结果:

 

原创粉丝点击