8 #include "daheng/GxIAPI.h"
9 #include "daheng/DxImageProc.h"
11 #include <opencv2/opencv.hpp>
20 GX_STATUS status = GX_STATUS_SUCCESS;
21 GX_DEV_HANDLE hDevice =
nullptr;
22 GX_FRAME_DATA frameData{};
23 void *pRaw8Buffer =
nullptr;
24 void *pMirrorBuffer =
nullptr;
25 void *pRGBframeData =
nullptr;
26 int64_t PixelFormat = GX_PIXEL_FORMAT_BAYER_GR8;
27 int64_t ColorFilter = GX_COLOR_FILTER_NONE;
32 int64_t SensorWidth = -1, SensorHeight = -1;
41 dahengCameraInit(
char *sn,
bool autoWhiteBalance =
false,
int expoosureTime = 2000,
double gainFactor = 1.0) {
44 auto *openParam =
new GX_OPEN_PARAM;
45 openParam->openMode = GX_OPEN_SN;
46 openParam->accessMode = GX_ACCESS_EXCLUSIVE;
47 openParam->pszContent = sn;
48 status = GXOpenDevice(openParam, &hDevice);
49 if (status != GX_STATUS_SUCCESS) {
53 int64_t nPayLoadSize = 0;
55 status = GXGetInt(hDevice, GX_INT_PAYLOAD_SIZE, &nPayLoadSize);
56 if (status != GX_STATUS_SUCCESS) {
60 frameData.pImgBuf = malloc((
size_t) nPayLoadSize);
61 GXGetInt(hDevice, GX_INT_SENSOR_WIDTH, &SensorWidth);
62 GXGetInt(hDevice, GX_INT_SENSOR_HEIGHT, &SensorHeight);
64 pRaw8Buffer = malloc(nPayLoadSize);
65 pMirrorBuffer = malloc(nPayLoadSize * 3);
66 pRGBframeData = malloc(nPayLoadSize * 3);
67 GXGetEnum(hDevice, GX_ENUM_PIXEL_FORMAT, &PixelFormat);
68 GXGetEnum(hDevice, GX_ENUM_PIXEL_COLOR_FILTER, &ColorFilter);
69 GXSetEnum(hDevice, GX_ENUM_ACQUISITION_MODE, GX_ACQ_MODE_CONTINUOUS);
71 GXSetEnum(hDevice, GX_ENUM_BALANCE_WHITE_AUTO,
72 autoWhiteBalance ? GX_BALANCE_WHITE_AUTO_CONTINUOUS : GX_BALANCE_WHITE_AUTO_OFF);
73 GXSetFloat(hDevice, GX_FLOAT_EXPOSURE_TIME, expoosureTime);
75 GXSetEnum(hDevice, GX_ENUM_GAIN_SELECTOR, GX_GAIN_SELECTOR_ALL);
76 GX_FLOAT_RANGE gainRange;
77 GXGetFloatRange(hDevice, GX_FLOAT_GAIN, &gainRange);
78 GXSetFloat(hDevice, GX_FLOAT_GAIN, gainRange.dMax * gainFactor);
80 status = GXSendCommand(hDevice, GX_COMMAND_ACQUISITION_START);
81 if (status != GX_STATUS_SUCCESS) {
88 status = GXSendCommand(hDevice, GX_COMMAND_ACQUISITION_STOP);
90 free(frameData.pImgBuf);
91 frameData.pImgBuf =
nullptr;
93 pRaw8Buffer =
nullptr;
95 pRGBframeData =
nullptr;
97 GXCloseDevice(hDevice);
101 Mat getFrame(
bool flip =
false,
bool mirror =
false) {
102 if (GXGetImage(hDevice, &frameData, 100) == GX_STATUS_SUCCESS) {
103 if (frameData.nStatus == 0) {
104 ProcessData(frameData.pImgBuf, pRaw8Buffer, pRGBframeData, frameData.nWidth, frameData.nHeight,
105 (
int) PixelFormat, mirror ? 2 : 4, flip, mirror);
107 Mat src(Size(frameData.nWidth, frameData.nHeight), CV_8UC3, pRGBframeData);
115 void ProcessData(
void *pImageBuf,
void *pImageRaw8Buf,
void *pImageRGBBuf,
int nImageWidth,
int nImageHeight,
116 int nPixelFormat,
int nPixelColorFilter,
bool flip =
false,
bool mirror =
false) {
117 switch (nPixelFormat) {
118 case GX_PIXEL_FORMAT_BAYER_GR12:
119 case GX_PIXEL_FORMAT_BAYER_RG12:
120 case GX_PIXEL_FORMAT_BAYER_GB12:
121 case GX_PIXEL_FORMAT_BAYER_BG12:
123 DxImageMirror(pImageBuf, pMirrorBuffer, nImageWidth, nImageHeight, HORIZONTAL_MIRROR);
124 DxRaw16toRaw8(pMirrorBuffer, pImageRaw8Buf, nImageWidth, nImageHeight, DX_BIT_4_11);
125 DxRaw8toRGB24(pImageRaw8Buf, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
126 DX_PIXEL_COLOR_FILTER(nPixelColorFilter), flip);
128 DxRaw16toRaw8(pImageBuf, pImageRaw8Buf, nImageWidth, nImageHeight, DX_BIT_4_11);
129 DxRaw8toRGB24(pImageRaw8Buf, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
130 DX_PIXEL_COLOR_FILTER(nPixelColorFilter), flip);
134 case GX_PIXEL_FORMAT_BAYER_GR10:
135 case GX_PIXEL_FORMAT_BAYER_RG10:
136 case GX_PIXEL_FORMAT_BAYER_GB10:
137 case GX_PIXEL_FORMAT_BAYER_BG10:
139 DxImageMirror(pImageBuf, pMirrorBuffer, nImageWidth, nImageHeight, HORIZONTAL_MIRROR);
140 DxRaw16toRaw8(pMirrorBuffer, pImageRaw8Buf, nImageWidth, nImageHeight, DX_BIT_2_9);
141 DxRaw8toRGB24(pImageRaw8Buf, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
142 DX_PIXEL_COLOR_FILTER(nPixelColorFilter), flip);
144 DxRaw16toRaw8(pImageBuf, pImageRaw8Buf, nImageWidth, nImageHeight, DX_BIT_2_9);
145 DxRaw8toRGB24(pImageRaw8Buf, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
146 DX_PIXEL_COLOR_FILTER(nPixelColorFilter), flip);
150 case GX_PIXEL_FORMAT_BAYER_GR8:
151 case GX_PIXEL_FORMAT_BAYER_RG8:
152 case GX_PIXEL_FORMAT_BAYER_GB8:
153 case GX_PIXEL_FORMAT_BAYER_BG8:
155 DxImageMirror(pImageBuf, pMirrorBuffer, nImageWidth, nImageHeight, HORIZONTAL_MIRROR);
156 DxRaw8toRGB24(pMirrorBuffer, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
157 DX_PIXEL_COLOR_FILTER(nPixelColorFilter), flip);
159 DxRaw8toRGB24(pImageBuf, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
160 DX_PIXEL_COLOR_FILTER(nPixelColorFilter), flip);
164 case GX_PIXEL_FORMAT_MONO12:
165 case GX_PIXEL_FORMAT_MONO10:
167 DxImageMirror(pImageBuf, pMirrorBuffer, nImageWidth, nImageHeight, HORIZONTAL_MIRROR);
168 DxRaw16toRaw8(pMirrorBuffer, pImageRaw8Buf, nImageWidth, nImageHeight, DX_BIT_4_11);
169 DxRaw8toRGB24(pImageRaw8Buf, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
170 DX_PIXEL_COLOR_FILTER(NONE), flip);
172 DxRaw16toRaw8(pImageBuf, pImageRaw8Buf, nImageWidth, nImageHeight, DX_BIT_4_11);
173 DxRaw8toRGB24(pImageRaw8Buf, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
174 DX_PIXEL_COLOR_FILTER(NONE), flip);
178 case GX_PIXEL_FORMAT_MONO8:
180 DxImageMirror(pImageBuf, pMirrorBuffer, nImageWidth, nImageHeight, HORIZONTAL_MIRROR);
181 DxRaw8toRGB24(pMirrorBuffer, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
182 DX_PIXEL_COLOR_FILTER(NONE), flip);
184 DxRaw8toRGB24(pImageBuf, pImageRGBBuf, nImageWidth, nImageHeight, RAW2RGB_NEIGHBOUR,
185 DX_PIXEL_COLOR_FILTER(NONE), flip);
197 #endif //RMCV_DAHENG_H