手把手带你模仿 海康威视sdk+Qt 的二次开发(下)

2024-01-23 12:59

本文主要是介绍手把手带你模仿 海康威视sdk+Qt 的二次开发(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上篇是代码之前的工作,这一篇讲解代码。

首先来看操作相机的整个接口流程:
在这里插入图片描述
接下来详细分析:
1.枚举设备:
在这里插入图片描述在这里插入图片描述
注:将MV_GIGE_DEVICE和MV_USB_DEVICE设备信息保存到m_stDevList结构体中,以便后续使用。
2.创建句柄
也就是将设备信息与变量进行绑定,以后只要拿到这个句柄,就可以进行相关设备的操作:
在这里插入图片描述
3.打开设备:
在这里插入图片描述

4.开启一个线程,用于图像数据的取流操作:
4-1.新建一个线程类,其中含有对于widget的引用,便于线程窗口zhong句柄信息:
在这里插入图片描述
打开设备之后就开启线程:

在这里插入图片描述
在线程函数中,完成图像帧数据的读取操作:

void WorkThread::run()
{MV_FRAME_OUT stImageInfo = {0};int nRet = MV_OK;bool f=isRun();while(f){nRet=m_widget.m_pcMyCamera->GetImageBuffer(&stImageInfo, 1000); if (nRet == MV_OK){ m_widget.m_mutex.lock();if(NULL ==  m_widget.m_pSaveImageBuf || stImageInfo.stFrameInfo.nFrameLen >  m_widget.m_nSaveImageBufSize){if(m_widget.m_pSaveImageBuf){free(m_widget.m_pSaveImageBuf);m_widget.m_pSaveImageBuf=NULL;}m_widget.m_pSaveImageBuf = (unsigned char *)malloc(sizeof(unsigned char) * stImageInfo.stFrameInfo.nFrameLen);if (m_widget.m_pSaveImageBuf  == NULL){m_widget.m_mutex.unlock();return;}m_widget.m_nSaveImageBufSize = stImageInfo.stFrameInfo.nFrameLen;}memcpy(m_widget.m_pSaveImageBuf, stImageInfo.pBufAddr, stImageInfo.stFrameInfo.nFrameLen);memcpy(&m_widget.m_stImageInfo, &(stImageInfo.stFrameInfo), sizeof(MV_FRAME_OUT_INFO_EX));m_widget.m_mutex.unlock();auto pixmap = QPixmap::fromImage(QImage(stImageInfo.pBufAddr,stImageInfo.stFrameInfo.nWidth,stImageInfo.stFrameInfo.nHeight,QImage::Format_Indexed8));m_widget.ui->label->setPixmap(pixmap);m_widget.m_pcMyCamera->FreeImageBuffer(&stImageInfo);}else{if (MV_TRIGGER_MODE_ON == m_widget.m_nTriggerMode){qDebug()<<__FUNCTION__;// Sleep(5);}}}
}

之后在主线程中进行取流操作:

void Widget::slot_grabbingBtn()
{if (false == m_bOpenDevice || true == m_bStartGrabbing || NULL == m_pcMyCamera){return;}memset(&m_stImageInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));m_WorkThread->SetRun(true);m_WorkThread->start();int nRet = m_pcMyCamera->StartGrabbing();if (MV_OK != nRet){m_WorkThread->SetRun(false);QMessageBox::information(this,"Device","Start grabbing fail");return;}m_bStartGrabbing = true;EnableControls();
}

完成了取流操作,其他是一些基本的操作函数,先代码奉上:
widget.h:

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QMutex>
#include "MvCameraControl.h"
#include "MvCamera.h"
#include "workthread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{friend class WorkThread;Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();public slots:void slot_searchDevice();                     //查询设备void slot_openDevice();                       //打开设备void slot_closeDevice();                      //关闭设备void slot_continusModeBtn();                  //连续模式void slot_triggerModeBtn();                   //触发模式void slot_grabbingBtn();                      //开始采集void slot_stopGrbbingBtn();                   //停止采集void slot_softwareTriggerBtn();               //软触发void slot_softwareoOnceBtn();                 //软触发一次void slot_saveBmpBtn();                       //保存Bmp图片void slot_saveJpgBtn();                       //保存Jpg图片void slot_saveTiffBtn();                      //保存Tiff图片void slot_savePngBtn();                       //保存Png图片void slot_getParameterBtn();                  //获取参数void slot_setParameterBtn();                  //设置参数public:int   GrabThreadProcess();                    //线程取流函数,用于图像显示的取流操作int   SaveImage(MV_SAVE_IAMGE_TYPE enSaveImageType);         //由于图片类型不同,但是他们大部分的实现代码相同,于是定义一个公共的函数,便于操作。int   GetTriggerMode();                        //获取触发模式int   SetTriggerMode();                        //设置触发模式int   GetExposureTime();                       //获取曝光时间int   SetExposureTime();                       //设置曝光时间int   GetGain();                               //获取增益int   SetGain();                               //设置增益int   GetFrameRate();                          //获取帧率int   SetFrameRate();                          //设置帧率int   GetTriggerSource();                      //获取触发源int   SetTriggerSource();                      //设置触发源//按钮使能,比如在没有打开设备之前,后续的比如采集图片之类按钮将变灰不能按下,只有满足一定条件才可以进行操作,每次在按下一个按钮的最后都将调用该函数做一个判断。void  EnableControls();void  InitUi();                //初始化界面// ch:去除自定义的像素格式bool  RemoveCustomPixelFormats(enum MvGvspPixelType enPixelFormat);private:MV_CC_DEVICE_INFO_LIST  m_stDevList;                    //保存设备信息的链表CMvCamera*              m_pcMyCamera;                   //用于操作相机的指针bool                    m_isDeviceReady;                //是否查询到设备bool                    m_bOpenDevice;                  //是否打开设备bool                    m_bSoftWareTriggerCheck;        //软触发按钮是否被按下bool                    m_bStartGrabbing;               //是否开始抓图int                     m_nDeviceCombo;int                     m_nTriggerMode;                 //触发模式MV_FRAME_OUT_INFO_EX    m_stImageInfo;                  //保存一帧图像信息unsigned char*          m_pSaveImageBuf;                //保存一帧图像的指针unsigned int            m_nSaveImageBufSize;            //保存一帧图像的大小int                     m_nTriggerSource;               //触发源WorkThread*             m_WorkThread;                   //线程句柄,用于开启线程取流图像用QMutex                  m_mutex;double                  m_dExposureEdit;double                  m_dGainEdit;double                  m_dFrameRateEdit;
private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),m_bOpenDevice(false),m_nDeviceCombo(0),m_nTriggerMode(MV_TRIGGER_MODE_OFF),m_bStartGrabbing(false),m_pcMyCamera(NULL),m_pSaveImageBuf(NULL),m_nSaveImageBufSize(0),m_bSoftWareTriggerCheck(false), m_nTriggerSource(MV_TRIGGER_SOURCE_SOFTWARE),m_dExposureEdit(0),m_dGainEdit(0),m_dFrameRateEdit(0),m_isDeviceReady(false)
{m_WorkThread=new WorkThread(*this);ui->setupUi(this);InitUi();connect(ui->searchDeviceBtn   ,SIGNAL(clicked()),this,SLOT(slot_searchDevice()));connect(ui->openDeviceBtn     ,SIGNAL(clicked()),this,SLOT(slot_openDevice()));connect(ui->closeDeviceBtn    ,SIGNAL(clicked()),this,SLOT(slot_closeDevice()));connect(ui->continusModeBtn   ,SIGNAL(clicked()),this,SLOT(slot_continusModeBtn()));connect(ui->triggerModeBtn    ,SIGNAL(clicked()),this,SLOT(slot_triggerModeBtn()));connect(ui->startGrabBtn      ,SIGNAL(clicked()),this,SLOT(slot_grabbingBtn()));connect(ui->softwareTriggerBtn,SIGNAL(stateChanged(int)),this,SLOT(slot_softwareTriggerBtn()));connect(ui->softwareOnceBtn   ,SIGNAL(clicked()),this,SLOT(slot_softwareoOnceBtn()));connect(ui->saveBmpBtn        ,SIGNAL(clicked()),this,SLOT(slot_saveBmpBtn()));connect(ui->saveJpgBtn        ,SIGNAL(clicked()),this,SLOT(slot_saveJpgBtn()));connect(ui->saveTiffBtn       ,SIGNAL(clicked()),this,SLOT(slot_saveTiffBtn()));connect(ui->savePngBtn        ,SIGNAL(clicked()),this,SLOT(slot_savePngBtn()));connect(ui->GetParamterBtn    ,SIGNAL(clicked()),this,SLOT(slot_getParameterBtn()));connect(ui->SetParameterBtn   ,SIGNAL(clicked()),this,SLOT(slot_setParameterBtn()));connect(ui->stopGrabBtn       ,SIGNAL(clicked()),this,SLOT(slot_stopGrbbingBtn()));
}void Widget::slot_setParameterBtn()
{bool bIsSetSucceed = true;int nRet = SetExposureTime();if (nRet != MV_OK){bIsSetSucceed = false;QMessageBox::critical(this,"Exposure","Set Exposure Time Fail");}nRet = SetGain();if (nRet != MV_OK){bIsSetSucceed = false;QMessageBox::critical(this,"Gain","Set Gain Fail");}nRet = SetFrameRate();if (nRet != MV_OK){bIsSetSucceed = false;QMessageBox::critical(this,"Frame","Set Frame Rate Fail");}if (true == bIsSetSucceed){QMessageBox::critical(this,"Parameter","Set Parameter Succeed");}
}void Widget::slot_stopGrbbingBtn()
{if (false == m_bOpenDevice || false == m_bStartGrabbing || NULL == m_pcMyCamera){return;}m_WorkThread->SetRun(false);bool f=m_WorkThread->isRun();if(f){m_WorkThread->quit();m_WorkThread->wait();m_WorkThread=NULL;}int nRet = m_pcMyCamera->StopGrabbing();if(MV_OK != nRet){QMessageBox::critical(this,"grabbing","Stop grabbing fail");return;}m_bStartGrabbing = false;
}int Widget::SetTriggerSource()
{int nRet = MV_OK;m_bSoftWareTriggerCheck=ui->softwareTriggerBtn->isChecked();if (m_bSoftWareTriggerCheck){m_nTriggerSource = MV_TRIGGER_SOURCE_SOFTWARE;nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);if (MV_OK != nRet){QMessageBox::critical(this,"Trigger","Set Software Trigger Fail");return nRet;}// GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON )->EnableWindow(TRUE);}else{m_nTriggerSource = MV_TRIGGER_SOURCE_LINE0;nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);if (MV_OK != nRet){QMessageBox::critical(this,"Hardware","Set Hardware Trigger Fail");return nRet;}//GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON )->EnableWindow(FALSE);}return nRet;
}int Widget::SetFrameRate()
{int nRet = m_pcMyCamera->SetBoolValue("AcquisitionFrameRateEnable", true);if (MV_OK != nRet){return nRet;}return m_pcMyCamera->SetFloatValue("AcquisitionFrameRate", (float)m_dFrameRateEdit);
}int Widget::SetGain()
{// ch:设置增益前先把自动增益关闭,失败无需返回//en:Set Gain after Auto Gain is turned off, this failure does not need to returnm_pcMyCamera->SetEnumValue("GainAuto", 0);return m_pcMyCamera->SetFloatValue("Gain", (float)m_dGainEdit);
}int Widget::SetExposureTime()
{// ch:调节这两个曝光模式,才能让曝光时间生效// en:Adjust these two exposure mode to allow exposure time effectiveint nRet = m_pcMyCamera->SetEnumValue("ExposureMode", MV_EXPOSURE_MODE_TIMED);if (MV_OK != nRet){return nRet;}m_pcMyCamera->SetEnumValue("ExposureAuto", MV_EXPOSURE_AUTO_MODE_OFF);return m_pcMyCamera->SetFloatValue("ExposureTime", (float)m_dExposureEdit);
}int Widget::SetTriggerMode()
{
return m_pcMyCamera->SetEnumValue("TriggerMode", m_nTriggerMode);
}void Widget::slot_getParameterBtn()
{int nRet = GetTriggerMode();if (nRet != MV_OK){QMessageBox::critical(this,"Mode","Get Trigger Mode Fail");}nRet = GetExposureTime();if (nRet != MV_OK){QMessageBox::critical(this,"Mode","Get Exposure Time Fail");}ui->ExposureLineEdit->setText(QString("%1").arg(m_dExposureEdit));nRet = GetGain();if (nRet != MV_OK){QMessageBox::critical(this,"Gain","Get Gain Fail");}ui->GainLineEdit->setText(QString("%1").arg(m_dGainEdit));nRet = GetFrameRate();if (nRet != MV_OK){QMessageBox::critical(this,"Frame","Get Frame Rate Fail");}ui->FrameRateLineEdit->setText(QString("%1").arg(m_dFrameRateEdit));nRet = GetTriggerSource();if (nRet != MV_OK){QMessageBox::critical(this,"Trigger","Get Trigger Source Fail");}}int Widget::GetTriggerSource()
{MVCC_ENUMVALUE stEnumValue = {0};int nRet = m_pcMyCamera->GetEnumValue("TriggerSource", &stEnumValue);if (MV_OK != nRet){return nRet;}if ((unsigned int)MV_TRIGGER_SOURCE_SOFTWARE == stEnumValue.nCurValue){m_bSoftWareTriggerCheck = true;}else{m_bSoftWareTriggerCheck = false;}return MV_OK;
}int Widget::GetGain()
{MVCC_FLOATVALUE stFloatValue = {0};int nRet = m_pcMyCamera->GetFloatValue("Gain", &stFloatValue);if (MV_OK != nRet){return nRet;}m_dGainEdit = stFloatValue.fCurValue;return MV_OK;
}int Widget::GetFrameRate()
{MVCC_FLOATVALUE stFloatValue = {0};int nRet = m_pcMyCamera->GetFloatValue("ResultingFrameRate", &stFloatValue);if (MV_OK != nRet){return nRet;}m_dFrameRateEdit = stFloatValue.fCurValue;return MV_OK;
}int Widget::GetTriggerMode()
{MVCC_ENUMVALUE stEnumValue = {0};int nRet = m_pcMyCamera->GetEnumValue("TriggerMode", &stEnumValue);if(MV_OK != nRet){return nRet;}m_nTriggerMode = stEnumValue.nCurValue;EnableControls();return MV_OK;
}int Widget::GetExposureTime()
{MVCC_FLOATVALUE stFloatValue = {0};int nRet = m_pcMyCamera->GetFloatValue("ExposureTime", &stFloatValue);if(MV_OK != nRet){return nRet;}m_dExposureEdit = stFloatValue.fCurValue;return MV_OK;
}void Widget::slot_savePngBtn()
{int nRet = SaveImage(MV_Image_Png);if (MV_OK != nRet){QMessageBox::critical(this,"picture","Save Png fail");return;}QMessageBox::critical(this,"picture","Save Png succeed!");
}void Widget::slot_saveTiffBtn(){int nRet = SaveImage(MV_Image_Tif);if (MV_OK != nRet){QMessageBox::critical(this,"picture","Save jpg fail");return;}QMessageBox::critical(this,"picture","Save jpg succeed!");}void Widget::slot_saveJpgBtn()
{int nRet = SaveImage(MV_Image_Jpeg);if (MV_OK != nRet){QMessageBox::critical(this,"picture","Save jpg fail");return;}QMessageBox::critical(this,"picture","Save jpg succeed!");
}int Widget::SaveImage(MV_SAVE_IAMGE_TYPE enSaveImageType)
{MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam;memset(&stSaveFileParam, 0, sizeof(MV_SAVE_IMG_TO_FILE_PARAM));m_mutex.lock();if (m_pSaveImageBuf == NULL || m_stImageInfo.enPixelType == 0){m_mutex.unlock();return MV_E_NODATA;}if(RemoveCustomPixelFormats(m_stImageInfo.enPixelType)){m_mutex.unlock();return MV_E_SUPPORT;}stSaveFileParam.enImageType = enSaveImageType;              // ch:需要保存的图像类型 | en:Image format to savestSaveFileParam.enPixelType = m_stImageInfo.enPixelType;    // ch:相机对应的像素格式 | en:Camera pixel typestSaveFileParam.nWidth      = m_stImageInfo.nWidth;         // ch:相机对应的宽 | en:WidthstSaveFileParam.nHeight     = m_stImageInfo.nHeight;        // ch:相机对应的高 | en:HeightstSaveFileParam.nDataLen    = m_stImageInfo.nFrameLen;stSaveFileParam.pData       = m_pSaveImageBuf;stSaveFileParam.iMethodValue = 0;// ch:jpg图像质量范围为(50-99], png图像质量范围为[0-9] | en:jpg image nQuality range is (50-99], png image nQuality range is [0-9]if (MV_Image_Bmp == stSaveFileParam.enImageType){sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.bmp", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);}else if (MV_Image_Jpeg == stSaveFileParam.enImageType){stSaveFileParam.nQuality = 80;sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.jpg", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);}else if (MV_Image_Tif == stSaveFileParam.enImageType){sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.tif", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);}else if (MV_Image_Png == stSaveFileParam.enImageType){stSaveFileParam.nQuality = 8;sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.png", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);}int nRet = m_pcMyCamera->SaveImageToFile(&stSaveFileParam);m_mutex.unlock();return nRet;
}void Widget::slot_saveBmpBtn()
{
int nRet = SaveImage(MV_Image_Bmp);if (MV_OK != nRet){QMessageBox::critical(this,"picture","Save bmp fail");return;}QMessageBox::critical(this,"picture","Save bmp succeed!");
}void Widget::slot_closeDevice()
{bool f=m_WorkThread->isRun();if (f){m_WorkThread->quit();m_WorkThread->wait();m_WorkThread->SetRun(false);}if(m_pcMyCamera){m_pcMyCamera->Close();delete m_pcMyCamera;m_pcMyCamera = NULL;}m_bStartGrabbing=false;m_bOpenDevice = false;if(m_pSaveImageBuf){free(m_pSaveImageBuf);m_pSaveImageBuf=NULL;}m_nSaveImageBufSize=0;EnableControls();
}void Widget::slot_continusModeBtn()
{m_nTriggerMode = MV_TRIGGER_MODE_OFF;m_pcMyCamera->SetEnumValue("TriggerMode", m_nTriggerMode);EnableControls();
}void Widget::slot_triggerModeBtn()
{m_nTriggerMode = MV_TRIGGER_MODE_ON;m_pcMyCamera->SetEnumValue("TriggerMode", m_nTriggerMode);EnableControls();
}void Widget::slot_grabbingBtn()
{if (false == m_bOpenDevice || true == m_bStartGrabbing || NULL == m_pcMyCamera){return;}memset(&m_stImageInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));m_WorkThread->SetRun(true);m_WorkThread->start();int nRet = m_pcMyCamera->StartGrabbing();if (MV_OK != nRet){m_WorkThread->SetRun(false);QMessageBox::information(this,"Device","Start grabbing fail");return;}m_bStartGrabbing = true;EnableControls();
}void Widget::slot_softwareTriggerBtn()
{int nRet = MV_OK;m_bSoftWareTriggerCheck=ui->softwareTriggerBtn->isChecked();if (m_bSoftWareTriggerCheck){m_nTriggerSource = MV_TRIGGER_SOURCE_SOFTWARE;nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);if (MV_OK != nRet){QMessageBox::information(this,"Device","Set Software Trigger Fail");return;}}else{m_nTriggerSource = MV_TRIGGER_SOURCE_LINE0;nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);if (MV_OK != nRet){QMessageBox::information(this,"Device","Set Hardware Trigger Fail");return;}}EnableControls();return;
}void Widget::slot_softwareoOnceBtn()
{if(true != m_bStartGrabbing){return;}m_pcMyCamera->CommandExecute("TriggerSoftware");
}void Widget::InitUi()
{memset(&m_stImageInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));m_WorkThread->SetRun(false);EnableControls();
}void  Widget::EnableControls()
{//如果查询到设备,开启打开设备按钮ui->openDeviceBtn->setEnabled(m_isDeviceReady?true:false);ui->closeDeviceBtn->setEnabled(m_bOpenDevice?true:false);ui->continusModeBtn->setEnabled(m_bOpenDevice?true:false);ui->triggerModeBtn->setEnabled(m_bOpenDevice?true:false);ui->startGrabBtn->setEnabled(m_bOpenDevice?true:false);ui->stopGrabBtn->setEnabled(m_bOpenDevice?true:false);//首先是否是在采集图像中,在采集图像的过程中,判断是否为触发模式,只有在触发模式下,才能开启软触发按钮。ui->softwareTriggerBtn->setEnabled(m_bStartGrabbing?((MV_TRIGGER_MODE_ON ==  m_nTriggerMode)?true:false):false);ui->softwareOnceBtn->setEnabled((MV_TRIGGER_MODE_OFF ==  m_nTriggerMode) ? false:(m_bSoftWareTriggerCheck?true:false) );ui->saveBmpBtn->setEnabled(m_bStartGrabbing?true:false);ui->saveJpgBtn->setEnabled(m_bStartGrabbing?true:false);ui->saveTiffBtn->setEnabled(m_bStartGrabbing?true:false);ui->savePngBtn->setEnabled(m_bStartGrabbing?true:false);ui->GetParamterBtn->setEnabled(m_bOpenDevice?true:false);ui->SetParameterBtn  ->setEnabled(m_bOpenDevice?true:false);ui->ExposureLineEdit->setEnabled(m_bOpenDevice?true:false);ui->GainLineEdit->setEnabled(m_bOpenDevice?true:false);ui->FrameRateLineEdit->setEnabled(m_bOpenDevice?true:false);
}bool Widget::RemoveCustomPixelFormats(MvGvspPixelType enPixelFormat)
{int nResult = enPixelFormat & MV_GVSP_PIX_CUSTOM;if(MV_GVSP_PIX_CUSTOM == nResult){return true;}else{return false;}
}void Widget::slot_openDevice()
{if (true == m_bOpenDevice || NULL != m_pcMyCamera){return;}int nIndex = m_nDeviceCombo;if ((nIndex < 0) | (nIndex >= MV_MAX_DEVICE_NUM)){QMessageBox::critical(this,"Device","Device index is error!");return;}// ch:由设备信息创建设备实例 | en:Device instance created by device informationif (NULL == m_stDevList.pDeviceInfo[nIndex]){QMessageBox::critical(this,"Device","Device does not exist!");return;}m_pcMyCamera = new CMvCamera;if (NULL == m_pcMyCamera){return;}int nRet = m_pcMyCamera->Open(m_stDevList.pDeviceInfo[nIndex]);if (MV_OK != nRet){delete m_pcMyCamera;m_pcMyCamera = NULL;QMessageBox::critical(this,"Device","Device Open error!");return;}// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)if (m_stDevList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE){unsigned int nPacketSize = 0;nRet = m_pcMyCamera->GetOptimalPacketSize(&nPacketSize);if (nRet == MV_OK){nRet = m_pcMyCamera->SetIntValue("GevSCPSPacketSize",nPacketSize);if(nRet != MV_OK){QMessageBox::critical(this,"Device","Warning: Set Packet Size fail!");}}else{QMessageBox::critical(this,"Device","Warning: Get Packet Size fail!");}}m_bOpenDevice = true;EnableControls();slot_getParameterBtn();
}void Widget::slot_searchDevice()
{QString strMsg;ui->comboBox->clear();memset(&m_stDevList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));//ch:枚举子网内所有设备,将查询到的设备信息保存到m_stDevList列表中。int nRet   = CMvCamera::EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &m_stDevList);if (MV_OK != nRet){QMessageBox::critical(this,"device","No device!");return;}// ch:将值加入到信息列表框中并显示出来 | en:Add value to the information list box and displayfor (unsigned int i = 0; i < m_stDevList.nDeviceNum; i++){MV_CC_DEVICE_INFO* pDeviceInfo = m_stDevList.pDeviceInfo[i];if (NULL == pDeviceInfo){continue;}if (pDeviceInfo->nTLayerType == MV_GIGE_DEVICE){int nIp1 = ((m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24);int nIp2 = ((m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16);int nIp3 = ((m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8);int nIp4 = (m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff);char strUserName[256] = {0};sprintf_s(strUserName, 256, "%s %s (%s)", pDeviceInfo->SpecialInfo.stGigEInfo.chManufacturerName,pDeviceInfo->SpecialInfo.stGigEInfo.chModelName,pDeviceInfo->SpecialInfo.stGigEInfo.chSerialNumber);QString  UserName(strUserName);strMsg= QString("[%1]GigE: %2  %3.%4.%5.%6").arg( QString::number(i)).arg(strUserName).arg(QString::number(nIp1)).arg(QString::number(nIp2)).arg(QString::number(nIp3)).arg( QString::number(nIp4));ui->comboBox->addItem(strMsg);}}if (0 == m_stDevList.nDeviceNum){QMessageBox::critical(this,"device","No device!");return;}ui->comboBox->setCurrentIndex(0);m_isDeviceReady=true;                                 //设备已经打开EnableControls();
}Widget::~Widget()
{delete ui;slot_closeDevice();
}

workthread.h:

#ifndef WORKTHREAD_H
#define WORKTHREAD_H#include <QThread>
class Widget;
class WorkThread : public QThread
{
public:explicit WorkThread(Widget&m_widget_,QObject *parent = nullptr);void run();bool isRun();void SetRun(bool f);private:Widget& m_widget;bool runflag_;
};#endif // WORKTHREAD_H

workthread.cpp:

#include "workthread.h"
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
WorkThread::WorkThread(Widget&m_widget_,QObject *parent): QThread{parent},m_widget(m_widget_),runflag_(false)
{}bool WorkThread::isRun()
{
return runflag_;
}
void WorkThread::SetRun(bool f)
{runflag_=f;
}void WorkThread::run()
{MV_FRAME_OUT stImageInfo = {0};int nRet = MV_OK;bool f=isRun();while(f){nRet=m_widget.m_pcMyCamera->GetImageBuffer(&stImageInfo, 1000); if (nRet == MV_OK){ m_widget.m_mutex.lock();if(NULL ==  m_widget.m_pSaveImageBuf || stImageInfo.stFrameInfo.nFrameLen >  m_widget.m_nSaveImageBufSize){if(m_widget.m_pSaveImageBuf){free(m_widget.m_pSaveImageBuf);m_widget.m_pSaveImageBuf=NULL;}m_widget.m_pSaveImageBuf = (unsigned char *)malloc(sizeof(unsigned char) * stImageInfo.stFrameInfo.nFrameLen);if (m_widget.m_pSaveImageBuf  == NULL){m_widget.m_mutex.unlock();return;}m_widget.m_nSaveImageBufSize = stImageInfo.stFrameInfo.nFrameLen;}memcpy(m_widget.m_pSaveImageBuf, stImageInfo.pBufAddr, stImageInfo.stFrameInfo.nFrameLen);memcpy(&m_widget.m_stImageInfo, &(stImageInfo.stFrameInfo), sizeof(MV_FRAME_OUT_INFO_EX));m_widget.m_mutex.unlock();auto pixmap = QPixmap::fromImage(QImage(stImageInfo.pBufAddr,stImageInfo.stFrameInfo.nWidth,stImageInfo.stFrameInfo.nHeight,QImage::Format_Indexed8));m_widget.ui->label->setPixmap(pixmap);m_widget.m_pcMyCamera->FreeImageBuffer(&stImageInfo);}else{if (MV_TRIGGER_MODE_ON == m_widget.m_nTriggerMode){qDebug()<<__FUNCTION__;// Sleep(5);}}}}

ui_widget.h:

/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 5.15.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QComboBox>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QRadioButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QPushButton *searchDeviceBtn;QPushButton *openDeviceBtn;QPushButton *closeDeviceBtn;QGroupBox *init_groupbox;QGroupBox *savepicture_groupbox;QPushButton *saveBmpBtn;QPushButton *saveJpgBtn;QPushButton *saveTiffBtn;QPushButton *savePngBtn;QPushButton *startGrabBtn;QRadioButton *continusModeBtn;QRadioButton *triggerModeBtn;QPushButton *stopGrabBtn;QCheckBox *softwareTriggerBtn;QPushButton *softwareOnceBtn;QGroupBox *grabpicture_groupbox;QLabel *Exposure;QLabel *Gain;QLabel *GrabRate;QLineEdit *ExposureLineEdit;QLineEdit *GainLineEdit;QLineEdit *FrameRateLineEdit;QPushButton *GetParamterBtn;QPushButton *SetParameterBtn;QGroupBox *parameter_groupbox;QWidget *layoutWidget;QVBoxLayout *verticalLayout;QComboBox *comboBox;QLabel *label;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName(QString::fromUtf8("Widget"));Widget->resize(1028, 679);searchDeviceBtn = new QPushButton(Widget);searchDeviceBtn->setObjectName(QString::fromUtf8("searchDeviceBtn"));searchDeviceBtn->setGeometry(QRect(760, 30, 191, 29));openDeviceBtn = new QPushButton(Widget);openDeviceBtn->setObjectName(QString::fromUtf8("openDeviceBtn"));openDeviceBtn->setGeometry(QRect(760, 70, 93, 29));closeDeviceBtn = new QPushButton(Widget);closeDeviceBtn->setObjectName(QString::fromUtf8("closeDeviceBtn"));closeDeviceBtn->setGeometry(QRect(860, 70, 93, 29));init_groupbox = new QGroupBox(Widget);init_groupbox->setObjectName(QString::fromUtf8("init_groupbox"));init_groupbox->setGeometry(QRect(710, 10, 281, 101));savepicture_groupbox = new QGroupBox(Widget);savepicture_groupbox->setObjectName(QString::fromUtf8("savepicture_groupbox"));savepicture_groupbox->setGeometry(QRect(710, 300, 281, 141));saveBmpBtn = new QPushButton(savepicture_groupbox);saveBmpBtn->setObjectName(QString::fromUtf8("saveBmpBtn"));saveBmpBtn->setGeometry(QRect(10, 30, 93, 29));saveJpgBtn = new QPushButton(savepicture_groupbox);saveJpgBtn->setObjectName(QString::fromUtf8("saveJpgBtn"));saveJpgBtn->setGeometry(QRect(140, 30, 93, 29));saveTiffBtn = new QPushButton(savepicture_groupbox);saveTiffBtn->setObjectName(QString::fromUtf8("saveTiffBtn"));saveTiffBtn->setGeometry(QRect(10, 80, 93, 29));savePngBtn = new QPushButton(savepicture_groupbox);savePngBtn->setObjectName(QString::fromUtf8("savePngBtn"));savePngBtn->setGeometry(QRect(140, 80, 93, 29));startGrabBtn = new QPushButton(Widget);startGrabBtn->setObjectName(QString::fromUtf8("startGrabBtn"));startGrabBtn->setGeometry(QRect(730, 180, 111, 25));startGrabBtn->setCheckable(false);continusModeBtn = new QRadioButton(Widget);continusModeBtn->setObjectName(QString::fromUtf8("continusModeBtn"));continusModeBtn->setGeometry(QRect(740, 130, 118, 24));triggerModeBtn = new QRadioButton(Widget);triggerModeBtn->setObjectName(QString::fromUtf8("triggerModeBtn"));triggerModeBtn->setGeometry(QRect(850, 130, 118, 24));stopGrabBtn = new QPushButton(Widget);stopGrabBtn->setObjectName(QString::fromUtf8("stopGrabBtn"));stopGrabBtn->setGeometry(QRect(850, 180, 111, 25));softwareTriggerBtn = new QCheckBox(Widget);softwareTriggerBtn->setObjectName(QString::fromUtf8("softwareTriggerBtn"));softwareTriggerBtn->setGeometry(QRect(750, 230, 71, 24));softwareOnceBtn = new QPushButton(Widget);softwareOnceBtn->setObjectName(QString::fromUtf8("softwareOnceBtn"));softwareOnceBtn->setGeometry(QRect(860, 230, 93, 29));grabpicture_groupbox = new QGroupBox(Widget);grabpicture_groupbox->setObjectName(QString::fromUtf8("grabpicture_groupbox"));grabpicture_groupbox->setGeometry(QRect(710, 110, 281, 181));Exposure = new QLabel(Widget);Exposure->setObjectName(QString::fromUtf8("Exposure"));Exposure->setGeometry(QRect(750, 470, 69, 20));Gain = new QLabel(Widget);Gain->setObjectName(QString::fromUtf8("Gain"));Gain->setGeometry(QRect(750, 510, 69, 20));GrabRate = new QLabel(Widget);GrabRate->setObjectName(QString::fromUtf8("GrabRate"));GrabRate->setGeometry(QRect(750, 550, 69, 20));ExposureLineEdit = new QLineEdit(Widget);ExposureLineEdit->setObjectName(QString::fromUtf8("ExposureLineEdit"));ExposureLineEdit->setGeometry(QRect(830, 470, 113, 25));GainLineEdit = new QLineEdit(Widget);GainLineEdit->setObjectName(QString::fromUtf8("GainLineEdit"));GainLineEdit->setGeometry(QRect(830, 510, 113, 25));FrameRateLineEdit = new QLineEdit(Widget);FrameRateLineEdit->setObjectName(QString::fromUtf8("FrameRateLineEdit"));FrameRateLineEdit->setGeometry(QRect(830, 550, 113, 25));GetParamterBtn = new QPushButton(Widget);GetParamterBtn->setObjectName(QString::fromUtf8("GetParamterBtn"));GetParamterBtn->setGeometry(QRect(750, 600, 93, 29));SetParameterBtn = new QPushButton(Widget);SetParameterBtn->setObjectName(QString::fromUtf8("SetParameterBtn"));SetParameterBtn->setGeometry(QRect(850, 600, 93, 29));parameter_groupbox = new QGroupBox(Widget);parameter_groupbox->setObjectName(QString::fromUtf8("parameter_groupbox"));parameter_groupbox->setGeometry(QRect(710, 450, 281, 201));layoutWidget = new QWidget(Widget);layoutWidget->setObjectName(QString::fromUtf8("layoutWidget"));layoutWidget->setGeometry(QRect(10, 10, 661, 651));verticalLayout = new QVBoxLayout(layoutWidget);verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));verticalLayout->setContentsMargins(0, 0, 0, 0);comboBox = new QComboBox(layoutWidget);comboBox->setObjectName(QString::fromUtf8("comboBox"));verticalLayout->addWidget(comboBox);label = new QLabel(layoutWidget);label->setObjectName(QString::fromUtf8("label"));verticalLayout->addWidget(label);parameter_groupbox->raise();init_groupbox->raise();grabpicture_groupbox->raise();searchDeviceBtn->raise();openDeviceBtn->raise();closeDeviceBtn->raise();savepicture_groupbox->raise();startGrabBtn->raise();continusModeBtn->raise();triggerModeBtn->raise();stopGrabBtn->raise();softwareTriggerBtn->raise();softwareOnceBtn->raise();Exposure->raise();Gain->raise();GrabRate->raise();ExposureLineEdit->raise();GainLineEdit->raise();FrameRateLineEdit->raise();GetParamterBtn->raise();SetParameterBtn->raise();layoutWidget->raise();retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));searchDeviceBtn->setText(QCoreApplication::translate("Widget", "\346\237\245\350\257\242\350\256\276\345\244\207", nullptr));openDeviceBtn->setText(QCoreApplication::translate("Widget", "\346\211\223\345\274\200\350\256\276\345\244\207", nullptr));closeDeviceBtn->setText(QCoreApplication::translate("Widget", "\345\205\263\351\227\255\350\256\276\345\244\207", nullptr));init_groupbox->setTitle(QCoreApplication::translate("Widget", "\345\210\235\345\247\213\345\214\226", nullptr));savepicture_groupbox->setTitle(QCoreApplication::translate("Widget", "\345\233\276\347\211\207\344\277\235\345\255\230", nullptr));saveBmpBtn->setText(QCoreApplication::translate("Widget", "\344\277\235\345\255\230BMP", nullptr));saveJpgBtn->setText(QCoreApplication::translate("Widget", "\344\277\235\345\255\230JPG", nullptr));saveTiffBtn->setText(QCoreApplication::translate("Widget", "\344\277\235\345\255\230tiff", nullptr));savePngBtn->setText(QCoreApplication::translate("Widget", "\344\277\235\345\255\230PNG", nullptr));startGrabBtn->setText(QCoreApplication::translate("Widget", "\345\274\200\345\247\213\351\207\207\351\233\206", nullptr));continusModeBtn->setText(QCoreApplication::translate("Widget", "\350\277\236\347\273\255\346\250\241\345\274\217", nullptr));triggerModeBtn->setText(QCoreApplication::translate("Widget", "\350\247\246\345\217\221\346\250\241\345\274\217", nullptr));stopGrabBtn->setText(QCoreApplication::translate("Widget", "\345\201\234\346\255\242\351\207\207\351\233\206", nullptr));softwareTriggerBtn->setText(QCoreApplication::translate("Widget", "\350\275\257\350\247\246\345\217\221", nullptr));softwareOnceBtn->setText(QCoreApplication::translate("Widget", "\350\275\257\350\247\246\345\217\221\344\270\200\346\254\241", nullptr));grabpicture_groupbox->setTitle(QCoreApplication::translate("Widget", "\345\233\276\345\203\217\351\207\207\351\233\206", nullptr));Exposure->setText(QCoreApplication::translate("Widget", "\346\233\235\345\205\211", nullptr));Gain->setText(QCoreApplication::translate("Widget", "\345\242\236\347\233\212", nullptr));GrabRate->setText(QCoreApplication::translate("Widget", "\345\270\247\347\216\207", nullptr));ExposureLineEdit->setText(QCoreApplication::translate("Widget", "0", nullptr));GainLineEdit->setText(QCoreApplication::translate("Widget", "0", nullptr));FrameRateLineEdit->setText(QCoreApplication::translate("Widget", "0", nullptr));GetParamterBtn->setText(QCoreApplication::translate("Widget", "\345\217\202\346\225\260\350\216\267\345\217\226", nullptr));SetParameterBtn->setText(QCoreApplication::translate("Widget", "\345\217\202\346\225\260\350\256\276\347\275\256", nullptr));parameter_groupbox->setTitle(QCoreApplication::translate("Widget", "\345\217\202\346\225\260", nullptr));label->setText(QString());} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

ui设计器中的效果如下:
在这里插入图片描述

这篇关于手把手带你模仿 海康威视sdk+Qt 的二次开发(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/636500

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设