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();//关闭相机
相关推荐
luofeiju1 小时前
RGB下的色彩变换:用线性代数解构色彩世界
图像处理·人工智能·opencv·线性代数
feiyangqingyun1 小时前
Qt音视频开发技巧/推流带旋转角度/rtsprtmp推流/保存文件到MP4/拉流解析旋转角度
qt·音视频·qt旋转角度推流
清醒的兰2 小时前
Qt 基于TCP套接字编程
网络·qt·tcp
mahuifa10 天前
PySide环境配置及工具使用
python·qt·环境配置·开发经验·pyside
小灰灰搞电子10 天前
Qt PyQt与PySide技术-C++库的Python绑定
c++·qt·pyqt
Echo``10 天前
12.OpenCV—基础入门
开发语言·c++·人工智能·qt·opencv·计算机视觉
jndingxin10 天前
OpenCV CUDA模块设备层-----线程块内初始化连续内存区域 的设备端工具函数blockYota()
人工智能·opencv·计算机视觉
AI technophile10 天前
OpenCV计算机视觉实战(12)——图像金字塔与特征缩放
人工智能·opencv·计算机视觉
无证驾驶梁嗖嗖10 天前
[特殊字符] OpenCV opencv_world 模块作用及编译实践完整指南
opencv
智驾10 天前
QML革命:下一代GUI开发的核心优势详解
qt·qml