MFC 调用海康相机进行软触发

初始化相机类文件

#pragma once
#include "MvCameraControl.h"
class CMvCamera
{
public:CMvCamera();~CMvCamera();//初始化相机int InitCamera();int SaveCurrentImage(CString filePath);//关闭相机void CloseCamera();//设置int SetEnumValue(IN const char* strKey, IN unsigned int nValue);// ch:执行一次Command型命令,如 UserSetSaveint CommandExecute(IN const char* strKey);public:int nRet;void* m_hDevHandle; // 初始化设备句柄为空
};
#include "pch.h"
#include "CMvCamera.h"CMvCamera::CMvCamera()
{
}CMvCamera::~CMvCamera()
{CloseCamera();if (m_hDevHandle != NULL){MV_CC_DestroyHandle(m_hDevHandle);m_hDevHandle = NULL;}
}int CMvCamera::InitCamera()
{nRet = MV_OK;m_hDevHandle = NULL;// 初始化SDKnRet = MV_CC_Initialize();if (MV_OK != nRet){AfxMessageBox(_T("初始化失败"));return 0;}// 枚举设备MV_CC_DEVICE_INFO_LIST stDeviceList;memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);if (MV_OK != nRet){AfxMessageBox(_T("枚举设备失败"));return 0;}// 检查是否找到设备if (stDeviceList.nDeviceNum > 0){for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++){MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];if (NULL == pDeviceInfo){break;}}}else{AfxMessageBox(_T("没有找到设备"));return 0;}unsigned int nIndex = 0; // 选择第一个设备// 创建设备句柄nRet = MV_CC_CreateHandle(&m_hDevHandle, stDeviceList.pDeviceInfo[nIndex]);if (MV_OK != nRet){AfxMessageBox(_T("创建句柄失败"));return 0;}// 打开设备nRet = MV_CC_OpenDevice(m_hDevHandle);if (MV_OK != nRet){AfxMessageBox(_T("打开设备失败"));return 0;}// 对于GigE相机,设置最佳包大小if (stDeviceList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE){int nPacketSize = MV_CC_GetOptimalPacketSize(m_hDevHandle);if (nPacketSize > 0){nRet = MV_CC_SetIntValue(m_hDevHandle, "GevSCPSPacketSize", nPacketSize);if (nRet != MV_OK){AfxMessageBox(_T("Warning: Set Packet Size fail"));return 0;}}else{AfxMessageBox(_T("Warning: Get Packet Size fail"));return 0;}}// 设置触发模式为开启nRet = MV_CC_SetEnumValue(m_hDevHandle, "TriggerMode", 1);if (MV_OK != nRet){AfxMessageBox(_T("Set Trigger Mode fail!"));return 0;}// 设置触发源为软件触发nRet = MV_CC_SetEnumValue(m_hDevHandle, "TriggerSource", MV_TRIGGER_SOURCE_SOFTWARE);if (MV_OK != nRet){AfxMessageBox(_T("Set Trigger Source fail!"));return 0;}// 开始取流nRet = MV_CC_StartGrabbing(m_hDevHandle);if (MV_OK != nRet){AfxMessageBox(_T("Start Grabbing fail!"));return 0;}return 1; // 初始化成功}int CMvCamera::SaveCurrentImage(CString filePath) 
{MV_FRAME_OUT stOutFrame = { 0 };nRet = MV_CC_GetImageBuffer(m_hDevHandle, &stOutFrame, 1000);if (nRet != MV_OK) {AfxMessageBox(_T("获取图像失败!"));return -1;}// 分配输出缓冲区unsigned int nBufferSize = stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight * 4 + 2048;unsigned char* pImageBuf = new unsigned char[nBufferSize];MV_SAVE_IMAGE_PARAM_EX stSaveParam = { 0 };stSaveParam.pData = stOutFrame.pBufAddr;stSaveParam.nDataLen = stOutFrame.stFrameInfo.nFrameLen;stSaveParam.enPixelType = stOutFrame.stFrameInfo.enPixelType;stSaveParam.nWidth = stOutFrame.stFrameInfo.nWidth;stSaveParam.nHeight = stOutFrame.stFrameInfo.nHeight;stSaveParam.pImageBuffer = pImageBuf;stSaveParam.nBufferSize = nBufferSize;stSaveParam.enImageType = MV_Image_Jpeg;  // 优先尝试JPEGstSaveParam.nJpgQuality = 95;stSaveParam.iMethodValue = 2;  // 最优插值nRet = MV_CC_SaveImageEx2(m_hDevHandle, &stSaveParam);if (MV_OK != nRet) {delete[] pImageBuf;MV_CC_FreeImageBuffer(m_hDevHandle, &stOutFrame);CString strError;strError.Format(_T("转换失败! 错误码: 0x%X"), nRet);AfxMessageBox(strError);return -2;}// 保存到文件CFile file;if (!file.Open(filePath, CFile::modeCreate | CFile::modeWrite)) {delete[] pImageBuf;MV_CC_FreeImageBuffer(m_hDevHandle, &stOutFrame);AfxMessageBox(_T("创建文件失败!"));return -3;}file.Write(pImageBuf, stSaveParam.nImageLen);file.Close();// 释放资源delete[] pImageBuf;MV_CC_FreeImageBuffer(m_hDevHandle, &stOutFrame);return 0;
}void CMvCamera::CloseCamera()
{// ch:停止取流 | en:Stop grab imagenRet = MV_CC_StopGrabbing(m_hDevHandle);if (MV_OK != nRet){AfxMessageBox(_T("Stop Grabbing fail! \n"));}// ch:关闭设备 | Close devicenRet = MV_CC_CloseDevice(m_hDevHandle);if (MV_OK != nRet){AfxMessageBox(_T("ClosDevice fail\n"));}// ch:销毁句柄 | Destroy handlenRet = MV_CC_DestroyHandle(m_hDevHandle);if (MV_OK != nRet){AfxMessageBox(_T("Destroy Handle fail!\n"));}m_hDevHandle = NULL;}int CMvCamera::SetEnumValue(IN const char * strKey, IN unsigned int nValue)
{return MV_CC_SetEnumValue(m_hDevHandle, strKey, nValue);
}int CMvCamera::CommandExecute(IN const char * strKey)
{return MV_CC_SetCommandValue(m_hDevHandle, strKey);
}

点击按钮进行软触发拍照显示

void CHalconImgTestDlg::OnBnClickedGetimg()
{// 执行软件触发int nRet = m_oMvCamera->CommandExecute("TriggerSoftware");if (MV_OK != nRet){AfxMessageBox(_T("执行软件触发失败"));return;}// 获取图像MV_FRAME_OUT stOutFrame = { 0 };nRet = MV_CC_GetImageBuffer(m_oMvCamera->m_hDevHandle, &stOutFrame, 1000);if (nRet != MV_OK){AfxMessageBox(_T("获取图像失败!"));return;}// 转换为Halcon图像HalconCpp::HObject hImage;nRet = theApp.ConverMono8ToHalcon(&hImage, stOutFrame.stFrameInfo.nHeight,stOutFrame.stFrameInfo.nWidth, stOutFrame.pBufAddr);// 释放图像缓冲区MV_CC_FreeImageBuffer(m_oMvCamera->m_hDevHandle, &stOutFrame);if (nRet != MV_OK){AfxMessageBox(_T("转换到Halcon图像失败!"));return;}// 显示图像HTuple hv_WindowHandle;HWND hWnd = GetDlgItem(IDC_IMG)->m_hWnd;// 检查窗口是否已创建if (!HDevWindowStack::IsOpen()){// 创建新窗口OpenWindow(0, 0, stOutFrame.stFrameInfo.nWidth / 2, stOutFrame.stFrameInfo.nHeight / 2,(Hlong)hWnd, "visible", "", &hv_WindowHandle);HDevWindowStack::Push(hv_WindowHandle);}// 在现有窗口中显示图像if (HDevWindowStack::IsOpen()){DispObj(hImage, HDevWindowStack::GetActive());}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟主播肖像权保护,数字时代的法律博弈

首席数据官高鹏律师团队 在虚拟主播行业蓬勃发展的表象之下&#xff0c;潜藏着一场关乎法律边界的隐形战争。当一位虚拟偶像的3D模型被非法拆解、面部数据被批量复制&#xff0c;运营方惊讶地发现——传统的肖像权保护体系&#xff0c;竟难以完全覆盖这具由代码与数据构成的“…

ArrayList-集合使用

自动扩容&#xff0c;集合的长度可以变化&#xff0c;而数组长度不变&#xff0c;集合更加灵活。 集合只能存引用数据类型&#xff0c;不能直接存基本数据类型&#xff0c;除非包装 ArrayList会拿[]展示数据

鸿蒙ArkUI体验:Hexo博客客户端开发心得

最近部门也在跟进鸿蒙平台的业务开发&#xff0c;自己主要是做 Android 开发&#xff0c;主要使用 Kotlin/Java 语言。&#xff0c;需要对新的开发平台和开发模式进行学习&#xff0c;在业余时间开了个项目练手&#xff0c;做了个基于 Hexo 博客内容开发的App。鸿蒙主要使用Ark…

【和春笋一起学C++】(十四)指针与const

将const用于指针&#xff0c;有两种情况&#xff1a; const int *pt; int * const pt; 目录 1. const int *pt 2. int * const pt 3. 扩展 1. const int *pt 首先看第一种情况&#xff0c;const在int的前面&#xff0c;有如下语句&#xff1a; int peoples12&#xff1…

本地缓存更新方案探索

文章目录 本地缓存更新方案探索1 背景2 方案探索2.1 初始化2.2 实时更新2.2.1 长轮询2.2.1.1 client2.2.2.2 server 本地缓存更新方案探索 1 背景 大家在工作中是否遇到过某些业务数据需要频繁使用&#xff0c;但是数据量不大的情况&#xff0c;一般就是几十条甚至几百条这种…

深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器

requestIdleCallback 核心作用 requestIdleCallback 是浏览器提供的 API&#xff0c;用于将非关键任务延迟到浏览器空闲时段执行&#xff0c;避免阻塞用户交互、动画等关键任务&#xff0c;从而提升页面性能体验。 基本语法 const handle window.requestIdleCallback(callb…

51单片机——交通指示灯控制器设计

设计目标 1、设计一交通灯控制&#xff0c;控制东西方向的红、黄、绿灯和南北方向的红、黄、绿灯。 2、可手动控制和自动控制&#xff0c;设置两个输入控制开关。 手动/自动开关&#xff0c;通过P11的按键输入控制 3、手动&#xff1a;设置开关P11&#xff0c;两种情况&#x…

神经网络语言模型(前馈神经网络语言模型)

神经网络语言模型 什么是神经网络&#xff1f;神经网络的基本结构是什么&#xff1f;输入层隐藏层输出层 神经网络为什么能解决问题&#xff1f;通用近似定理为什么需要权重和偏置&#xff1f;为什么需要激活函数&#xff1f;权重是如何确定的&#xff1f;1. 穷举2. 反向传播主…

信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)

个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的&#xff0c;做计算题要保持头脑清晰&#xff0c;认真读题把PV、…

unordered_map和unordered的介绍和使用

目录 unordered系列关联式容器 unordered_map unordered_map的接口说明 unordered_map的定义方式 unordered_map接口的使用 unordered_map的容量 unordered_map的迭代器 unordered_map的元素访问 unordered_map的查询 unordered_map的修改操作 unordered_multimap u…

设计模式7大原则与UML类图详解

设计模式7大原则与UML类图详解 引言 &#x1f31f; 在软件工程领域&#xff0c;设计模式和UML&#xff08;统一建模语言&#xff09;是提高代码质量、增强系统可维护性的重要工具。设计模式提供了解决软件设计中常见问题的通用方案&#xff0c;而UML则为我们提供了一种可视化的…

计算机视觉与深度学习 | Python实现ARIMA-LSTM时间序列预测(完整源码和数据)

ARIMA-LSTM混合模型 1. 环境准备2. 数据生成(示例数据)3. 数据预处理4. ARIMA建模5. LSTM残差建模6. 混合预测7. 结果可视化完整代码说明1. **数据生成**2. **ARIMA建模**3. **LSTM残差建模**4. **混合预测**5. **性能评估**参数调优建议扩展方向典型输出以下是使用Python实现…

Docker部署单节点Elasticsearch

1.Docker部署单节点ES 1.前置条件 配置内核参数 echo "vm.max_map_count262144" >> /etc/sysctl.conf sysctl -w vm.max_map_count262144准备密码 本文所有涉及密码的配置&#xff0c;均使用通用密码 Zzwl2024。 生产环境&#xff0c;请用密码生成器生成20…

pe文件二进制解析(用c/c++解析一个二进制pe文件)

pe文件二进制解析 c解析pe文件控制台版本 #include<iostream> #include<windows.h> #include<vector>/*RVA&#xff08;相对虚拟地址&#xff09;与FOA&#xff08;文件偏移地址&#xff09;的转换1.得到 的值&#xff1a;内存地址 - ImageBase2.判断是否位…

融智学视域下的系统性认知增强框架——基于文理工三类AI助理赋能HI四阶跃迁路径

融智学视域下的系统性认知增强框架 ——基于文理工三类AI助理赋能HI四阶跃迁路径 一、如何排除50个认知偏差&#xff1a;消除50类偏差的精准矫正系统 1. 技术架构 文科AI&#xff1a; 构建文化语义场&#xff08;Cultural Semantic Field, CSF&#xff09;&#xff0c;通过…

MMDetection环境安装配置

MMDetection 支持在 Linux&#xff0c;Windows 和 macOS 上运行。它需要 Python 3.7 以上&#xff0c;CUDA 9.2 以上和 PyTorch 1.8 及其以上。 MMDetection 至今也一直更新很多个版本了&#xff0c;但是对于最新的pytorch版本仍然不支持&#xff0c;我安装的时候仍然多次遇到m…

如何实现k8s高可用

一、控制平面高可用设计 多主节点部署 • API Server 冗余&#xff1a;部署至少 3 个 Master 节点&#xff0c;每个节点运行独立的 API Server&#xff0c;通过负载均衡器&#xff08;如 Nginx、HAProxy、云厂商 LB&#xff09;对外提供统一入口。 • 选举机制&#xff1a;Sche…

记录心态和工作变化

忙中带闲的工作 其实工作挺忙的, 总是在赶各种功能点. 好巧的是iOS那边因为上架的问题耽搁了一些时间, 从而让Android的进度有了很大的调整空间. 更巧的是后端那边因为对客户端的需求不是很熟悉, 加上Android海外这块的业务他也是第一次接触. 所以需要给他留一些时间把各个环节…

JVM 双亲委派机制

一、从 JDK 到 JVM&#xff1a;Java 运行环境的基石 在 Java 开发领域&#xff0c;JDK&#xff08;Java Development Kit&#xff09;是开发者的核心工具包。它不仅包含了编译 Java 代码的工具&#xff08;如 javac&#xff09;&#xff0c;还内置了 JRE&#xff08;Java Run…

java开发之异常

一 结构 Throwable分为Exception和error Exception分为RuntimeException&#xff08;运行时异常&#xff09;和其他异常 主动抛出运行时异常和非运行时异常的区别 1、throw RuntimeException&#xff08;或运行时异常的子类&#xff09; 编译时不会报错。 2、throw Excepti…