bridge.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Author: NiuJiuRu
  2. // Email: niujiuru@qq.com
  3. package hk_takephoto
  4. /*
  5. #include "takephoto.h"
  6. */
  7. import "C"
  8. import (
  9. "fmt"
  10. "unsafe"
  11. )
  12. // 图像类型
  13. const (
  14. IMG_TYPE_BMP = 1 // 拍照输出"bmp"图像
  15. IMG_TYPE_JPG = 2 // 拍照输出"jpg"图像
  16. )
  17. // 图像水印
  18. type SImgMark struct {
  19. CamModelName string // 相机型号名
  20. CamSerialNum string // 相机序列号
  21. ImgExposureTime float64 // 曝光时间值
  22. ImgWidth uint // 图像的宽度
  23. ImgHeight uint // 图像的高度
  24. }
  25. // 获取系统当前USBFS内存大小(MB), 成功返回: >=0, 失败返回: <0值
  26. func getSysUsbfsMemCurrentSize() int {
  27. ret := int(C.HK_GetSysUsbfsMemCurrentSize())
  28. return ret
  29. }
  30. // 设置系统新的USBFS内存大小(MB), 成功返回: 0值, 失败返回: <0值
  31. func setSysUsbfsMemSize(val int) int {
  32. setNewV := C.int(val)
  33. ret := int(C.HK_SetSysUsbfsMemSize(setNewV))
  34. return ret
  35. }
  36. // 获取当前已连接的海康相机的数量, 成功返回: >=0, 失败返回: <0值
  37. func GetHKCameraCount() int {
  38. ret := int(C.HK_GetCameraCount())
  39. return ret
  40. }
  41. // 单次拍照时, 如果相机处于自动曝光模式, 是否等待曝光稳定后再拍照
  42. // 参数: waitAE: 0=不等待, 1=等待(默认)
  43. func SetWaitAEDoneForTakePhoto(waitAE int) int {
  44. ret := int(C.HK_SetWaitAEDoneForTakePhoto(C.int(waitAE)))
  45. return ret
  46. }
  47. // 单次执行相机拍照, 并保存到文件, 成功返回: 本次拍照图像的水印信息, 失败返回: 错误原因和空的水印信息
  48. // 参数说明:
  49. // "imgType" - 图像保存类型: 1-".bmp", 2-".jpg"
  50. // "saveImgPath" - 保存的文件名: 根据所选保存图像的类型, 程序会自动校检和处理文件的扩展名(智能)
  51. // "timeout" - 等待超时时间, 单位:秒: < 0 表示无超时; 无论超时怎么设置, 首次尝试拍照一定会
  52. // 执行, 但时间不确定; 拍照成功、超时(相机持续无数据的时间)或发生错误时会自动结束任务.
  53. func TakePhoto(imgType int, saveImgPath string, timeout int) (SImgMark, error) {
  54. if (imgType != IMG_TYPE_BMP && imgType != IMG_TYPE_JPG) || len(saveImgPath) == 0 {
  55. return SImgMark{}, fmt.Errorf("invalid arguments")
  56. }
  57. path := C.CString(saveImgPath)
  58. defer C.free(unsafe.Pointer(path))
  59. var imgMark C.HKImgMark
  60. ret := int(C.HK_TakePhoto(C.HKImgType(imgType), path, C.int(timeout), &imgMark))
  61. if ret != 0 {
  62. return SImgMark{}, fmt.Errorf("an error occurred while calling the C.HK_TakePhoto() function(%d)", ret)
  63. }
  64. return SImgMark{
  65. CamModelName: C.GoString((*C.char)(unsafe.Pointer(&imgMark.camModelName[0]))),
  66. CamSerialNum: C.GoString((*C.char)(unsafe.Pointer(&imgMark.camSerialNum[0]))),
  67. ImgExposureTime: float64(imgMark.imgExposureTime),
  68. ImgWidth: uint(imgMark.imgWidth),
  69. ImgHeight: uint(imgMark.imgHeight),
  70. }, nil
  71. }