利用OPENCV + QT5.9实现摄像头采集控制

利用OPENCV + QT5.9实现摄像头采集控制

利用OPENCV + QT5.9实现摄像头采集控制

最近开始研究OPENCV+QT,发现利用它来写GUI控制小软件非常方便,最近刚刚好有需求,就编写了一个笔记本摄像头读写的显示小程序,跟大家一同分享,一同进步:

摄像头代码

代码片.

#include "widget.h"
#include "ui_widget.h"
#include <Windows.h>
#include "MVCAPI.h"
#include "MVC_Common.h"
#include "QTimer"
#include "QDebug"

//#if _MSC_VER >= 1600
//# pragma execution_character_set("utf-8")
//#endif

// #include "opencv2/opencv.hpp"
// #include "opencv/highgui.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"

using namespace cv;
using namespace std;

VideoCapture capture;
Mat frame;

#pragma comment (lib, "MVC_API.lib")

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->btn_changesize,SIGNAL(clicked(bool)),this,SLOT(changeLabelsize()));

    //QString str = "192.168.0.1";
    //char* p =const_cast<char*>(str.toStdString().c_str());
    // MVC_FindDevice(p);
    // MVC_ReScanDevice();
    MVC_OpenDevice(HK_A5100_GM17);
   //MVCGE_DEVLIST DevInfo;

    connect(ui->btn_check,SIGNAL(clicked(bool)),this,SLOT(OnBnClickedBtnScan()));
    connect(ui->pushButton_4,SIGNAL(clicked(bool)),this,SLOT(OnBnClickedBtnCapture()));
    QTimer *timer =new QTimer(this);
    capture.open(0);
    timer->start(25);

    connect(timer,SIGNAL(timeout()),this,SLOT(ReadFrame()));
}

Widget::~Widget()
{
    delete ui;
}


void Widget::changeLabelsize()
{
    ui->vedio_label->resize(ui->lineEdit->text().toInt(),ui->lineEdit_2->text().toInt());
}

void Widget::OnBnClickedBtnScan()
{
    if(!m_bFirstScan)
        {
            //MessageBox("REscan");
            MVC_ReScanDevice();
        }
        else m_bFirstScan = 0;
        GEVScan();
}


void Widget::GEVScan()
{
    int DevNum = MVC_GetDeviceNumber();
    // ui->comboBox;
    if(DevNum==0)
        {
            ui->comboBox->addItem(QStringLiteral("未找到任何千兆网设备,请配置IP或检查连接"));
            //m_CMBDevice.AddString("未找到任何千兆网设备,请配置IP或检查连接");
        }
        else
        {
            for(int j=0; j<DevNum; j++)
            {
                MVC_GetDeviceInfoEx(j,&DevInfo);
                QString DevInfostr=QString("No.%1:%2 MAC:%3 IP:%4").arg(j).arg(DevInfo.DevName).arg(DevInfo.DevMAC).arg(DevInfo.DevIP) ;
                // DevInfostr("No.%1:%s MAC:%s IP:%s",j,DevInfo.DevName,DevInfo.DevMAC,DevInfo.DevIP);
                //m_CMBDevice.AddString(DevInfostr);
                ui->comboBox->addItem(DevInfostr);
            }
        }

}


void Widget::OnBnClickedBtnCapture()
{
    ui->pushButton_4->setEnabled(false);
    if(!m_bCapturing)
    {
       // if(!m_bCHKEmbed) ::GetWindowRect(m_HwndEx,&m_RectEx);
       // else memset(&m_RectEx,0,sizeof(QRect));
        MVC_SubDisplayInit(m_iDevSelect,0,m_RectEx,m_bCHKEmbed?m_HwndEx:NULL,FALSE);
        MVC_EnableCapture(m_iDevSelect);
        MVC_SetStreamHOOK(m_iDevSelect,MStreamProc,this);
        m_bCapturing = 1;
        m_bDisplaying = 1;
        ui->pushButton_4->setWindowTitle("停止采集");
        ui->pushButton_5->setWindowTitle("关闭显示");

       // QTimer *timer = new QTimer(this);

       // timer->start(1000);

        //EnableButton(1);
    }
    else
    {
        MVC_SubDisplayClose(m_iDevSelect,0);
        //KillTimer(0);
        ui->pushButton_4->setWindowTitle("开始采集");
        ui->pushButton_5->setWindowTitle("打开显示");
        m_bCapturing = 0;
        m_bDisplaying = 0;
        MVC_SetStreamHOOK(m_iDevSelect,NULL,this);
        MVC_DisableCapture(m_iDevSelect);
      //  EnableButton(0);
    }
}

UINT WINAPI Widget::MStreamProc(WORD wHWCardNo,MVCFRAMEINFO m_FrameInfo, PVOID pUserData)
{
    Widget* ptDlg = (Widget*)pUserData;
    ptDlg->m_iCapFrameNum++;
    for(int i=0; i<BUF_ARRAY; i++)
    {
        if(!ptDlg->m_bLockData[i])
        {
            memcpy(&ptDlg->m_SrcFrameInfo,&m_FrameInfo,sizeof(MVCFRAMEINFO));					//Copy到结构信息
            memcpy(ptDlg->m_pRAWData[i],m_FrameInfo.lBufPtr,m_FrameInfo.lBufSize);				//安全Copy出图像数据
            ptDlg->m_bLockData[i] = 1;
            SetEvent(ptDlg->hEventStart);														//Copy完成发送显示信号
            break;
        }
    }
    return TRUE;
}

void Widget::ReadFrame()
{
        capture>>frame;
        qDebug()<<frame.channels()<<frame.cols<<frame.rows<<frame.depth();
        // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
        QImage image((const uchar*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888);
        ui->vedio_label->setPixmap(QPixmap::fromImage(image));

}


 [1]: http://adrai.github.io/flowchart.js/
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值