Procházet zdrojové kódy

优化迭代相机模块代码, 新增接口SetWaitAEDoneForTakePhoto()函数

niujiuru před 1 měsícem
rodič
revize
b59984d559

+ 33 - 17
camera/camera.go

@@ -171,6 +171,14 @@ func GetSupportedCameraCount() int {
 	return GetHKCameraCount() + GetDHCameraCount()
 }
 
+// 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
+// 参数: waitAE: 0=不等待, 1=等待(默认)
+func SetWaitAEDoneForTakePhoto(waitAE int) int {
+	hk_takephoto.SetWaitAEDoneForTakePhoto(waitAE)
+	dh_takephoto.SetWaitAEDoneForTakePhoto(waitAE)
+	return 0
+}
+
 // 单次执行相机拍照, 并保存到文件, 成功返回: 本次拍照图像的水印信息, 失败返回: 错误原因和空的水印信息
 // 参数说明:
 // "imgType"     - 图像保存类型: 1-".bmp", 2-".jpg"
@@ -184,25 +192,33 @@ func TakePhoto(imgType int, saveImgPath string, timeout int) (SImgMark, error) {
 		return SImgMark{}, fmt.Errorf("invalid arguments")
 	}
 
-	hkMark, err := hk_takephoto.TakePhoto(imgType, saveImgPath, timeout)
-	if err == nil {
-		return SImgMark{
-			CamModelName:    hkMark.CamModelName,
-			CamSerialNum:    hkMark.CamSerialNum,
-			ImgExposureTime: hkMark.ImgExposureTime,
-		}, nil
+	if GetHKCameraCount() > 0 {
+		hkMark, err := hk_takephoto.TakePhoto(imgType, saveImgPath, timeout)
+		if err == nil {
+			return SImgMark{
+				CamModelName:    hkMark.CamModelName,
+				CamSerialNum:    hkMark.CamSerialNum,
+				ImgExposureTime: hkMark.ImgExposureTime,
+			}, nil
+		}
+		errs = append(errs, fmt.Errorf("HK: %w", err))
 	}
-	errs = append(errs, fmt.Errorf("HK: %w", err))
 
-	dhMark, err := dh_takephoto.TakePhoto(imgType, saveImgPath, timeout)
-	if err == nil {
-		return SImgMark{
-			CamModelName:    dhMark.CamModelName,
-			CamSerialNum:    dhMark.CamSerialNum,
-			ImgExposureTime: dhMark.ImgExposureTime,
-		}, nil
+	if GetDHCameraCount() > 0 {
+		dhMark, err := dh_takephoto.TakePhoto(imgType, saveImgPath, timeout)
+		if err == nil {
+			return SImgMark{
+				CamModelName:    dhMark.CamModelName,
+				CamSerialNum:    dhMark.CamSerialNum,
+				ImgExposureTime: dhMark.ImgExposureTime,
+			}, nil
+		}
+		errs = append(errs, fmt.Errorf("DH: %w", err))
 	}
-	errs = append(errs, fmt.Errorf("DH: %w", err))
 
-	return SImgMark{}, errors.Join(errs...)
+	if len(errs) == 0 {
+		return SImgMark{}, fmt.Errorf("no camera available")
+	} else {
+		return SImgMark{}, errors.Join(errs...)
+	}
 }

+ 7 - 0
dh_takephoto/bridge.go

@@ -42,6 +42,13 @@ func GetDHCameraCount() int {
 	return ret
 }
 
+// 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
+// 参数: waitAE: 0=不等待, 1=等待(默认)
+func SetWaitAEDoneForTakePhoto(waitAE int) int {
+	ret := int(C.DH_SetWaitAEDoneForTakePhoto(C.int(waitAE)))
+	return ret
+}
+
 // 单次执行相机拍照, 并保存到文件, 成功返回: 本次拍照图像的水印信息, 失败返回: 错误原因和空的水印信息
 // 参数说明:
 // "imgType"     - 图像保存类型: 1-".bmp", 2-".jpg"

+ 9 - 1
dh_takephoto/takephoto.c

@@ -17,6 +17,7 @@ static const char * const setTriggerMode = "Off"; /// 默认: "Off",  可选: "O
 #define AE_WAIT_MAX_MS     180000 // 最大曝光稳定等待的时间, 默认3分钟, 单位: ms
 #define AE_EXP_TIME_EPS_US     50 // 曝光时间稳定判定的误差, 防抖&区间, 单位: us
 #define AE_EXP_STABLE_FRAMES    4 // 相机处于自动曝光模式时, 累计曝光值稳定的帧数
+static int waitAEDone = 1; // 是否等待自动曝光完成: "1"-等待(默认), "0"-不等待//
 
 // 保存照片
 static int SavePhoto(HANDLE hCam, IMV_Frame *pFrame, DHImgType imgType, const char *imgPath);
@@ -60,7 +61,7 @@ static void OnFrameReceived(IMV_Frame *pFrame, void *pUser) // 数据帧的回
                 (unsigned int)pFrame->frameInfo.pixelFormat);
 
   // 2, 自动曝光模式
-  if(ctx->isExposureAuto)
+  if(ctx->isExposureAuto && waitAEDone != 0)
   {
     double curExpTime = 0.0;
     ret = IMV_GetDoubleFeatureValue(ctx->hCam, "ExposureTime", &curExpTime);
@@ -106,6 +107,13 @@ static int FrameSoftTrigger(unsigned long wParam, unsigned long lParam) // 线
   return -1;
 }
 
+// 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
+int DH_SetWaitAEDoneForTakePhoto(int waitAE)
+{
+  waitAEDone = (waitAE != 0);
+  return 0;
+}
+
 // 单次执行相机拍照, 并保存到文件, 成功返回: 0值, 失败返回:非0值
 // "imgType"     - 获取图像类型
 // "saveImgPath" - 保存的文件名

+ 3 - 0
dh_takephoto/takephoto.h

@@ -39,6 +39,9 @@ int DH_SetSysUsbfsMemSize(int val);
 // 获取当前已连接的海康相机的数量, 成功返回: >=0, 失败返回: <0值
 int DH_GetCameraCount();
 
+// 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
+int DH_SetWaitAEDoneForTakePhoto(int waitAE); // waitAE: 0=不等待, 1=等待(默认)
+
 // 单次执行相机拍照, 并保存到文件, 成功返回: 0值, 失败返回:非0值
 // "imgType"     - 获取图像类型
 // "saveImgPath" - 保存的文件名

+ 7 - 0
hk_takephoto/bridge.go

@@ -45,6 +45,13 @@ func GetHKCameraCount() int {
 	return ret
 }
 
+// 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
+// 参数: waitAE: 0=不等待, 1=等待(默认)
+func SetWaitAEDoneForTakePhoto(waitAE int) int {
+	ret := int(C.HK_SetWaitAEDoneForTakePhoto(C.int(waitAE)))
+	return ret
+}
+
 // 单次执行相机拍照, 并保存到文件, 成功返回: 本次拍照图像的水印信息, 失败返回: 错误原因和空的水印信息
 // 参数说明:
 // "imgType"     - 图像保存类型: 1-".bmp", 2-".jpg"

+ 9 - 1
hk_takephoto/takephoto.c

@@ -16,6 +16,7 @@ static MV_CAM_TRIGGER_MODE setTriggerMode = MV_TRIGGER_MODE_ON; /// 默认: 打
 #define AE_WAIT_MAX_MS     180000 // 最大曝光稳定等待的时间, 默认3分钟, 单位: ms
 #define AE_EXP_TIME_EPS_US     50 // 曝光时间稳定判定的误差, 防抖&区间, 单位: us
 #define AE_EXP_STABLE_FRAMES    4 // 相机处于自动曝光模式时, 累计曝光值稳定的帧数
+static int waitAEDone = 1; // 是否等待自动曝光完成: "1"-等待(默认), "0"-不等待//
 
 // 保存照片
 static int SavePhoto(HANDLE hCam, MV_FRAME_OUT *pFrame, HKImgType imgType, const char *imgPath);
@@ -69,7 +70,7 @@ static int PhotoProc(unsigned long wParam, unsigned long lParam) // 线程回调
                   frame.stFrameInfo.nWidth, frame.stFrameInfo.nHeight, frame.stFrameInfo.nFrameNum, frame.stFrameInfo.nFrameLen,
                   (unsigned int)frame.stFrameInfo.enPixelType);
 
-    if(ctx->isExposureAuto)
+    if(ctx->isExposureAuto && waitAEDone != 0)
     { // 自动曝光模式下, 等待曝光稳定或超时
       MVCC_FLOATVALUE stExposureTime = { 0 }; float curExpTime = 0;
       ret = MV_CC_GetExposureTime(ctx->hCam, &stExposureTime); if(MV_OK != ret) goto retp1;
@@ -109,6 +110,13 @@ retp2:
   return ret;
 }
 
+// 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
+int HK_SetWaitAEDoneForTakePhoto(int waitAE)
+{
+  waitAEDone = (waitAE != 0);
+  return 0;
+}
+
 // 单次执行相机拍照, 并保存到文件, 成功返回: 0值, 失败返回:非0值
 // "imgType"     - 获取图像类型
 // "saveImgPath" - 保存的文件名

+ 3 - 0
hk_takephoto/takephoto.h

@@ -37,6 +37,9 @@ int HK_SetSysUsbfsMemSize(int val);
 // 获取当前已连接的海康相机的数量, 成功返回: >=0, 失败返回: <0值
 int HK_GetCameraCount();
 
+// 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
+int HK_SetWaitAEDoneForTakePhoto(int waitAE); // waitAE: 0=不等待, 1=等待(默认)
+
 // 单次执行相机拍照, 并保存到文件, 成功返回: 0值, 失败返回:非0值
 // "imgType"     - 获取图像类型
 // "saveImgPath" - 保存的文件名