#include "HikCamera.hpp" #include #include // 静态成员函数作为SDK回调函数 static void __stdcall ImageCallback(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo, void *pUser) { // 将用户数据转换为HikCamera实例 HikCamera *instance = static_cast(pUser); if (instance) { instance->handleFrameData(pData, pFrameInfo); } } void HikCamera::init() { // 初始化 SDK int nRet = MV_OK; MV_CC_Initialize(); // 枚举相机 MV_CC_DEVICE_INFO_LIST stDeviceList; memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST)); nRet = MV_CC_EnumDevices(MV_USB_DEVICE, &stDeviceList); // 创建相机实例,也即绑定句柄 nRet = MV_CC_CreateHandle(&m_handler, stDeviceList.pDeviceInfo[0]); // 打开相机 nRet = MV_CC_OpenDevice(m_handler); // 设置像素格式为 RGB8 nRet = MV_CC_SetEnumValue(m_handler, "PixelFormat", PixelType_Gvsp_RGB8_Packed); if (nRet == MV_OK) { std::cout << "Set pixel fomat succeed" << std::endl; } } void HikCamera::deinit() { // 关闭相机 int nRet = MV_OK; nRet = MV_CC_CloseDevice(m_handler); // 销毁相机实例 nRet = MV_CC_DestroyHandle(m_handler); // 去初始化 SDK MV_CC_Finalize(); } void HikCamera::startGrabbing() { int nRet = MV_OK; nRet = MV_CC_StartGrabbing(m_handler); } void HikCamera::stopGrabbing() { int nRet = MV_OK; nRet = MV_CC_StopGrabbing(m_handler); } void HikCamera::setExposure(double exposure) {} void HikCamera::setGain(double gain) {} void HikCamera::registerImageCallback() { int nRet = MV_OK; nRet = MV_CC_RegisterImageCallBackEx(m_handler, ImageCallback, this); nRet = MV_CC_SetImageNodeNum(m_handler, 10); } void HikCamera::handleFrameData(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo) { if (!pData) { std::cout << "New image nullptr" << std::endl; } const int width = pFrameInfo->nExtendWidth; const int height = pFrameInfo->nExtendHeight; const int dataBytesPerLine = pFrameInfo->nExtendWidth * 3; QImage deepCopy(width, height, QImage::Format_RGB888); if (pData) { memcpy(deepCopy.bits(), pData, pFrameInfo->nFrameLenEx); } emit newImage(deepCopy); }