HikCameraController/src/HikCamera.cpp
2025-06-08 14:51:23 +08:00

80 lines
2.2 KiB
C++

#include "HikCamera.hpp"
#include <memory>
#include <iostream>
// 静态成员函数作为SDK回调函数
static void __stdcall ImageCallback(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo, void *pUser) {
// 将用户数据转换为HikCamera实例
HikCamera *instance = static_cast<HikCamera *>(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);
}