相机SDK开发C++篇-常用开发函数封装讲解(迈德威视相机)

使用迈德威视相机的SDK API与相机进行交互,涵盖了从基本的相机控制到高级功能的各个方面。通过设置适当的回调函数,可以有效地处理相机状态变化和图像数据。这样的封装使得相机控制更为直接和易于管理

类定义:MWCamera

这个类继承自Camera基类,并添加了用于控制麦德威视相机的特定成员和方法。关键成员变量包括:

m_handle: 用于持有与相机设备的连接句柄。

m_isOpen 和 m_isGrabbing: 分别用于指示相机是否已打开和是否正在抓取图像。

构造函数与析构函数

构造函数(MWCamera): 初始化相机,设备句柄和图像数据置为nullptr,状态变量初始化。

析构函数(~MWCamera): 调用关闭相机函数,清理图像数据。

相机操作

openCamera(): 打开相机。首先枚举所有连接的设备,匹配设备序列号,并创建设备句柄。之后设置相机输出格式和参数,如触发模式等。

closeCamera(): 关闭相机。停止图像抓取,并销毁设备句柄。

参数设置

setCameraParameters(): 这个方法的具体实现未展示,通常用于设置相机的曝光时间、增益等参数。

图像捕获

startGrabbing(): 开始图像捕获。检查相机是否已经打开,若已打开且未处于捕获状态,则开始捕获。

stopGrabbing(): 停止图像捕获。如果相机处于捕获状态,则停止捕获。

回调函数

GrabImageCallback: 静态函数,用于处理从相机接收到的图像数据。该函数处理原始数据,转换成所需格式,并添加到图像数据缓存中。

missCallBack: 监听相机连接状态的变化,例如网络通讯失败或相机掉电等。

实用函数

executeSoftTrigger(): 执行软触发,通常用于外部触发模式下手动触发相机捕获图像。

sendErrorsMsgs(), sendInforMsgs(), sendWarningMsgs(): 发送错误、信息和警告消息。

#include "./inc/camera/mvcamera/mwcamera.h"

#include "./inc/storage/image/mimgdata.h"

#include<QDebug>

#include <QSettings>

#include <QTextCodec>

#include "globadebug.h"

// 构造函数:初始化摄像头实例的基本参数MWCamera::MWCamera(const int index, const QString&ip):Camera(index, ip),m_isOpen(false), m_isGrabbing(false),m_handle(nullptr){  // 通过构造函数初始化基类和摄像头的状态}

// 析构函数:确保在对象销毁时释放资源和关闭摄像头MWCamera::~MWCamera(){ closeCamera(); // 调用关闭摄像头函数clearImageData(); // 清理内部图像数据缓存}

// 打开摄像头的函数实现bool MWCamera::openCamera(OpenCameraWay){  int nRet = CAMERA_STATUS_SUCCESS; // 定义并初始化返回状态为成功 m_isOpen = false; // 初始状态设置摄像头未打开 tSdkCameraDevInfo CameraList[16]; // 存储摄像头设备信息的数组  int CameraNums = 16; // 预设的设备数量上限

// 枚举所有连接的摄像头设备  if(CAMERA_STATUS_SUCCESS != (nRet = CameraEnumerateDevice(CameraList, &CameraNums))) { setLastErrorMsg("当前设备上未连接任何设备,错误代码:%1").arg(nRet, 0, 16);  return false; // 如果枚举失败,则返回错误 }

// 将所有枚举到的摄像头序列号存储到字符串列表中 QStringList serialNumList;  for(int i = 0; i < CameraNums; i++) serialNumList.append(reinterpret_cast<char*>(CameraList[i].acSn));

// 检查是否找到了匹配的摄像头序列号  if(!serialNumList.contains(getCameraIpAddress())) {setLastErrorMsg("相机#%1-未查找到SN: %2的相机").arg(getCameraIndex()).arg(getCameraIpAddress());  returnfalse; }

// 获取相机序列号在列表中的索引  int serial = serialNumList.indexOf(getCameraIpAddress());  // 根据序列号创建摄像头操作句柄  if (CAMERA_STATUS_SUCCESS != (nRet = CameraGrabber_Create(&m_handle, &CameraList[serial]))) { setLastErrorMsg("相机#%1初始化失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; }

// 获取摄像头操作句柄  if(CAMERA_STATUS_SUCCESS != (nRet = CameraGrabber_GetCameraHandle(m_handle, &hCamera))) { setLastErrorMsg("相机#%1初始化失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  returnfalse; }

// 获取摄像头的能力描述结构体 tSdkCameraCapbility CameraInfo;  if(CAMERA_STATUS_SUCCESS != (nRet = CameraGetCapability(hCamera, &CameraInfo))) { setLastErrorMsg("相机#%1获取信息失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; }

// 判断摄像头是彩色还是黑白,并设置输出格式  bool bMonoCamera = CameraInfo.sIspCapacity.bMonoSensor;  if(bMonoCamera) CameraSetIspOutFormat(hCamera, CAMERA_MEDIA_TYPE_MONO8);

// 根据最大分辨率计算帧缓冲区大小,并进行内存对齐分配 UINT FrameBufferSize = CameraInfo.sResolutionRange.iWidthMax * CameraInfo.sResolutionRange.iHeightMax * (bMonoCamera ? 1 : 3); pFrameBuffer = (BYTE *)CameraAlignMalloc(FrameBufferSize, 16);

// 加载摄像头默认参数,并设置触发模式  if(CAMERA_STATUS_SUCCESS != (nRet = CameraLoadParameter(hCamera, PARAMETER_TEAM_A))) { setLastErrorMsg("相机#%1加载A组参数错误,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; }

// 设置为硬件触发模式  if(CAMERA_STATUS_SUCCESS != (nRet = CameraSetTriggerMode(hCamera, HardwareTrigger))) { setLastErrorMsg("相机#%1设置外部触发错误,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; }

// 保存参数到A组,确保触发设置生效  if(CAMERA_STATUS_SUCCESS != (nRet = CameraSaveParameter(hCamera, PARAMETER_TEAM_A))) { setLastErrorMsg("相机#%1保存A组参数错误,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; }

// 设置系统选项,如缓存区数量  if(CAMERA_STATUS_SUCCESS != (nRet = CameraSetSysOption("NumBuffers", QString("%1").arg(getImageBufferNodeNum()).toLocal8Bit().data()))) { setLastErrorMsg("相机#%1设置缓存区数量错误,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; }

// 注册摄像头图像采集回调函数和异常回调函数,用于处理采集数据和监控摄像头状态  if(CAMERA_STATUS_SUCCESS != (nRet = CameraSetCallbackFunction(hCamera, GrabImageCallback, this, nullptr))) { setLastErrorMsg("相机#%1注册图像采集回调函数失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; }

if(CAMERA_STATUS_SUCCESS != (nRet = CameraSetConnectionStatusCallback(hCamera, missCallBack, this))){ setLastErrorMsg("相机#%1注册异常回调函数失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false;}

// 如果所有设置都成功,将摄像头打开状态设置为true,并返回true  return (m_isOpen = true);}

// 设置摄像头参数(虽然此方法体为空,通常用于配置如曝光、增益等)bool MWCamera::setCameraParameters(floatexposure, float gain, float triggerDelay, int width, int height, int offsetX, int offsetY){  // 示例中没有实现具体的设置,这里返回true表示设置成功  // 实际使用时应包含对相机参数的修改代码  return true;}

// 开始图像捕获bool MWCamera::startGrabbing(){  // 如果摄像头未打开,则无法开始捕获,返回false  if (!isOpen()){ setLastErrorMsg("相机#%1开始采集失败,由于相机未打开!").arg(getCameraIndex());  return m_isGrabbing; // 返回当前采集状态(应为false) }  // 如果摄像头已经处于采集状态,直接返回true  if (isGrabbing())  return true;

// 调用SDK的开始采集方法  int nRet = CameraPlay(hCamera);  if (CAMERA_STATUS_SUCCESS != nRet) {setLastErrorMsg("相机#%1开始采集失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  return m_isGrabbing; // 采集未开始,返回false }

// 更新内部状态,标记为正在采集,并返回true  return (m_isGrabbing = true);}

// 停止图像捕获bool MWCamera::stopGrabbing(){  // 如果摄像头未打开,认为已经处于停止状态,直接返回true  if(!isOpen())  return true;

// 如果摄像头未处于采集状态,也直接返回true  if (!isGrabbing())  return true;

// 调用SDK的停止采集方法  int nRet = CameraPause(hCamera);  if (CAMERA_STATUS_SUCCESS != nRet) {setLastErrorMsg("相机#%1停止采集失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; // 停止采集失败,返回false }

// 更新内部状态,标记为未在采集,并返回true  return !(m_isGrabbing = false);}

// 关闭摄像头bool MWCamera::closeCamera(){  // 如果摄像头已处于关闭状态,直接返回true  if (!isOpen())  returntrue;

// 先停止图像捕获 stopGrabbing();

// 调用SDK的销毁句柄方法,释放资源  int nRet = CameraGrabber_Destroy(m_handle);  if (CAMERA_STATUS_SUCCESS != nRet) { setLastErrorMsg("相机#%1关闭失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; // 关闭失败,返回false }

// 更新内部状态,标记摄像头为关闭,并返回true  return !(m_isOpen = false);}

// 执行软触发bool MWCamera::executeSoftTrigger(){  // 调用SDK的软触发功能  int nRet = CameraSoftTrigger(hCamera);  if (nRet != CAMERA_STATUS_SUCCESS) { setLastErrorMsg("相机%1执行软触发失败,错误码:%2").arg(getCameraIndex()).arg(nRet);  return false; // 软触发失败,返回false }  return true; // 软触发成功,返回true}

// 测试读取图像bool MWCamera::TestReadImage(HalconCpp::HObject &Image){  // 尝试将图像数据添加到图像数据管理中  bool nRet = getImageData()->addImageData(Image.Key());  if (!nRet) {sendErrorsMsgs(getImageData()->getLastErrorMsg() + " - 相机#%1").arg(getCameraIndex()); }Image.Detach(); // 解除图像数据的引用  return nRet; // 返回添加图像数据的结果}

// 发送错误消息void MWCamera::sendErrorsMsgs(const QString &msg){  emit errors(getCameraIndex(), msg);}

// 发送信息消息void MWCamera::sendInforMsgs(const QString &msg){  emit informations(getCameraIndex(), msg);}

// 发送警告消息void MWCamera::sendWarningMsgs(const QString &msg){  emit warnings(getCameraIndex(), msg);}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
德威相机SDK开发主要涉及以下几个方面: 1. 安装SDK:首先需要从德威官网上下载相机SDK,并按照官方文档进行安装。 2. 创建工程:使用Visual Studio等开发工具创建一个C++工程,添加SDK库文件和头文件。 3. 初始化相机:在代码中调用SDK提供的函数,打开相机设备,设置相机参数等。 4. 获取图像数据:使用SDK提供的函数相机中获取图像数据,可以将数据保存到本地文件中,也可以进行实时显示。 5. 处理图像数据:对获取到的图像数据进行处理,例如图像增强、图像分割、目标检测等。 6. 释放资源:在程序结束时需要调用SDK提供的函数释放相机资源。 以下是一个简单的示例代码: ```c++ #include "stdafx.h" #include "MvCameraControl.h" // 回调函数 void __stdcall ImageCallBackEx(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser) { // 处理图像数据 } int main(int argc, char* argv[]) { // 初始化SDK MV_CC_Startup(); // 创建相机对象 MV_CC_DEVICE_INFO_LIST stDevList = { 0 }; MV_CC_GetDeviceList(&stDevList); MV_CC_DEVICE_INFO stDevInfo = stDevList.pDeviceInfo[0]; MV_CC_HANDLE stDeviceHandle = NULL; MV_CC_CreateHandle(&stDeviceHandle, &stDevInfo); // 打开相机 MV_CC_OpenDevice(stDeviceHandle); // 设置回调函数 MV_CC_RegisterImageCallBackEx(stDeviceHandle, ImageCallBackEx, NULL); // 开始采集图像 MV_CC_StartGrabbing(stDeviceHandle); // 等待按键退出 getchar(); // 停止采集图像 MV_CC_StopGrabbing(stDeviceHandle); // 关闭相机 MV_CC_CloseDevice(stDeviceHandle); // 销毁相机对象 MV_CC_DestroyHandle(stDeviceHandle); // 关闭SDK MV_CC_Stopup(); return 0; } ``` 以上代码仅供参考,具体实现需要参考SDK文档和实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值