利用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/