80 lines
2.2 KiB
C++
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);
|
|
}
|