QT 使用opencv 打开usb相机

1.在.pro文件中 添加opencv的头文件与lib 库

INCLUDEPATH += D:\opencv\build\install\include

LIBS += D:\opencv\build\install\x64\mingw\lib\libopencv_*.a

LIBS += D:\opencv\build\install\x64\mingw\bin\libopencv_*.dll

  1. usb相机类的头文件usbCamera.h
cpp 复制代码
#ifndef USBCAMERA_H
#define USBCAMERA_H


#include <QObject>
#include <QDebug>
#include <QImage>
#include <QString>
#include <QThread>
#include <QTime>
#include <QApplication>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "iostream"

// 相机类:提供相机的基本操作
class usbCamera : public QObject
{
    Q_OBJECT
    cv::VideoCapture capture; //视频流捕获器
    static int cameracount; //存储相机数目

public:

    int                     g_read_fps=0;       //统计读取帧率
    int                     g_disply_fps=0;     //统计显示帧率

    usbCamera();
    ~usbCamera();
    bool openFlag=false;
    bool open(int _index);
    void close();
    cv::Mat read();
    cv::Mat matnow;
    QImage Mat2QImage(cv::Mat const& src);
    cv::Mat QImage2Mat(QImage const& src);
    static int getCameraCount(){//获取可用相机数目
        if(cameracount>0)return cameracount;
        cv::VideoCapture _capture;
        while(_capture.open(cameracount,cv::CAP_DSHOW)){
            cameracount++;
            _capture.release();
        }
        return cameracount;

    }

signals:
    void updateImage(QImage const&);

public slots:
    void Operate(int); // 当Camera类被MovetoThread时,该槽函数相当于QThread::run()

};


#endif // USBCAMERA_H
  1. 相机类的cpp文件 usbCamera.cpp
cpp 复制代码
#include "usbcamera.h"
int usbCamera::cameracount=0;

usbCamera::usbCamera()
{

}

usbCamera::~usbCamera()
{
    if(!capture.isOpened())
    {
        capture.release();
    }
}

bool usbCamera::open(int _index)
{
    qDebug()<<"open index="<<_index;
//    int desiredWidth = 1920; // 你想要的宽度
//    int desiredHeight = 1080; // 你想要的高度
    int desiredWidth = 1080; // 你想要的宽度
    int desiredHeight = 720; // 你想要的高度  不能超过最大的分辨率

    if(capture.open(_index, cv::CAP_DSHOW))
    {
        openFlag=true;
        capture.set(cv::CAP_PROP_FPS, 30);
        capture.set(cv::CAP_PROP_FRAME_WIDTH, desiredWidth);
        capture.set(cv::CAP_PROP_FRAME_HEIGHT, desiredHeight);
        capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M','J','P','G'));
        return true;
    } else {
        openFlag=false;
        return false;
    }
}

void usbCamera::close()
{
    capture.release();
}

cv::Mat usbCamera::read()
{
    cv::Mat mat;
    capture.read(mat);
    return mat;
}

void usbCamera::Operate(int _index)
{
    if(open(_index))
    {
        qDebug()<<"Camera open success!";
    } else {
        qDebug()<<"Camera open failed";
        return;
    }
    while(1)
    {
        //qApp->processEvents();
        cv::Mat matin=read();
        QImage image= Mat2QImage(matin);
        emit updateImage(image);
    }
}

QImage usbCamera::Mat2QImage(cv::Mat const& mat)
{

    cv::Mat temp;
    cv::cvtColor(mat, temp,CV_BGR2RGB);
    QImage image((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
    image.bits();
    return image;
}

cv::Mat usbCamera::QImage2Mat(QImage const& image)
{
    cv::Mat tmp(image.height(),image.width(),CV_8UC3,(uchar*)image.bits(),image.bytesPerLine());
    cv::Mat mat;
    cv::cvtColor(tmp, mat,CV_BGR2RGB);
    return mat;
}

4.对象申明

头文件:
#include "usbcamera.h"

复制代码
 usbCamera* cameraTraj;//轨迹抓取
    void updateTrajImage(QImage);//traj 更新

5.初始化相机

cameraTraj = new usbCamera();

threadCameraTraj =new QThread();

cameraTraj->moveToThread(threadCameraTraj);//将camera对象放在子线程

threadCameraTraj->start();

connect(this, SIGNAL(cameraOperate(int)), cameraTraj, SLOT(Operate(int)));//打开相机

connect(cameraTraj, SIGNAL(updateImage(QImage)), this, SLOT(updateTrajImage(QImage)));//图片更新

emit cameraOperate(0);//开启第一个相机

//更新图片

void MainForm::updateTrajImage(QImage image)

{

cameraTraj->g_read_fps++;//读取帧率

if(!image.isNull()&&startTask==false)

{

ui->TrajLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->TrajLabel->size(), Qt::KeepAspectRatio)));//显示图片

ui->TrajLabel->setScaledContents(true);//根据QLabel的当前大小来调整图片的大小

}

}

5.结束销毁

复制代码
 threadCameraTraj->terminate();//结束线程
    cameraTraj->close();//关闭相机
相关推荐
摇曳的树1 小时前
【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包
数码相机·目标检测·3d
红米煮粥4 小时前
OpenCV-图像拼接
人工智能·opencv·计算机视觉
jndingxin5 小时前
OpenCV视频I/O(8)视频采集类VideoCapture之从视频源中读取一帧图像函数read()的使用
人工智能·opencv·音视频
Bill665 小时前
OpenCV 形态学相关函数详解及用法示例
opencv·opencv形态学函数·腐蚀与膨胀·开运算与闭运算·顶帽与黑帽
翁乐安5 小时前
opencv-如何获取图像区域特定像素区域大小
人工智能·python·opencv
菜就多练_08285 小时前
《深度学习》OpenCV 背景建模 原理及案例解析
人工智能·深度学习·opencv
Geek之路6 小时前
Qt系统学习篇(6)-QMainWindow
数据库·qt·学习
初阳7856 小时前
【Qt】控件概述(2)—— 按钮类控件
开发语言·qt
初阳7857 小时前
【Qt】控件概述(3)—— 显示类控件
开发语言·qt
efls1117 小时前
Qt_绘图
开发语言·c++·qt