Hikvision.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package HikNetSDK
  2. import (
  3. "fmt"
  4. "github.com/ebitengine/purego"
  5. "runtime"
  6. "unsafe"
  7. )
  8. var libc uintptr
  9. var (
  10. DVR_Init func() bool
  11. newHIKBallCamera func() unsafe.Pointer
  12. initBallCamera func(core unsafe.Pointer, ip string, port string, username string, password string, BallMachineType string) bool
  13. ptzTo func(core unsafe.Pointer, Action int, P float32, T float32, Z float32) bool
  14. ptzGet func(unsafe.Pointer, unsafe.Pointer, unsafe.Pointer, unsafe.Pointer) bool
  15. stopBus func(unsafe.Pointer, int) bool
  16. startBus func(unsafe.Pointer, int, int) bool
  17. newHIKNvr func() unsafe.Pointer
  18. initNvr func(unsafe.Pointer, string, string, string, string, int) bool
  19. checkTimeRegionWithMonth func(core unsafe.Pointer, year int, month int) string
  20. checkTimeRegionWithDay func(core unsafe.Pointer, year int, month int, day int) string
  21. nvrUTCDiff func(core unsafe.Pointer)
  22. )
  23. func init() {
  24. var err error
  25. libc, err = openLibrary(getSystemLibrary())
  26. if err != nil {
  27. panic(err)
  28. }
  29. purego.RegisterLibFunc(&DVR_Init, libc, "DVR_Init")
  30. purego.RegisterLibFunc(&newHIKBallCamera, libc, "NewHIKBallCamera")
  31. purego.RegisterLibFunc(&initBallCamera, libc, "InitBallCamera")
  32. purego.RegisterLibFunc(&ptzTo, libc, "PtzGotoPut")
  33. purego.RegisterLibFunc(&ptzGet, libc, "PtzGet")
  34. purego.RegisterLibFunc(&stopBus, libc, "StopBus")
  35. purego.RegisterLibFunc(&startBus, libc, "StartBus")
  36. purego.RegisterLibFunc(&newHIKNvr, libc, "NewHIKNvr")
  37. purego.RegisterLibFunc(&initNvr, libc, "InitNvr")
  38. purego.RegisterLibFunc(&checkTimeRegionWithMonth, libc, "CheckTimeRegionWithMonth")
  39. purego.RegisterLibFunc(&checkTimeRegionWithDay, libc, "CheckTimeRegionWithDay")
  40. purego.RegisterLibFunc(&nvrUTCDiff, libc, "NvrUTCDiff")
  41. }
  42. func getSystemLibrary() string {
  43. switch runtime.GOOS {
  44. case "linux":
  45. if runtime.GOARCH == "amd64" || runtime.GOARCH == "386" {
  46. return "libHikNetSDKPkg_linux_amd64.so"
  47. } else {
  48. return "libHikNetSDKPkg_linux_arm64.so"
  49. }
  50. case "windows":
  51. return "HikNetSDKPkg_win_amd64.dll"
  52. default:
  53. panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
  54. }
  55. }
  56. type HIKBallCamera struct {
  57. core unsafe.Pointer
  58. BallCameraCfg BallCamera
  59. }
  60. func NewHIKBallCamera(BallCameraCfg BallCamera) *HIKBallCamera {
  61. return &HIKBallCamera{
  62. core: newHIKBallCamera(),
  63. BallCameraCfg: BallCameraCfg,
  64. }
  65. }
  66. func (h *HIKBallCamera) Login() bool {
  67. return initBallCamera(h.core, h.BallCameraCfg.Ip, h.BallCameraCfg.Port, h.BallCameraCfg.User, h.BallCameraCfg.Password, h.BallCameraCfg.Type)
  68. }
  69. func (h *HIKBallCamera) PtzTo(Action int, P, T, Z float32) bool {
  70. return ptzTo(h.core, Action, P, T, Z)
  71. }
  72. func (h *HIKBallCamera) PTZGet(P, T, Z *float32) bool {
  73. return ptzGet(h.core, unsafe.Pointer(P), unsafe.Pointer(T), unsafe.Pointer(Z))
  74. }
  75. func (h *HIKBallCamera) StopBus(Direction int) bool {
  76. return stopBus(h.core, Direction)
  77. }
  78. func (h *HIKBallCamera) StartBus(Direction, Speed int) bool {
  79. return startBus(h.core, Direction, Speed)
  80. }
  81. type HIKNvr struct {
  82. core unsafe.Pointer
  83. NvrConfig Nvr
  84. }
  85. func NewHIKNvr(nvrConfig Nvr) *HIKNvr {
  86. return &HIKNvr{
  87. core: newHIKNvr(),
  88. NvrConfig: nvrConfig,
  89. }
  90. }
  91. func (h *HIKNvr) Login() bool {
  92. return initNvr(h.core, h.NvrConfig.Ip, h.NvrConfig.Port, h.NvrConfig.User, h.NvrConfig.Password, h.NvrConfig.Channel)
  93. }
  94. func (h *HIKNvr) CheckTimeRegionWithMonth(year int, month int) string {
  95. return checkTimeRegionWithMonth(h.core, year, month)
  96. }
  97. func (h *HIKNvr) CheckTimeRegionWithDay(year int, month int, day int) string {
  98. return checkTimeRegionWithDay(h.core, year, month, day)
  99. }
  100. func (h *HIKBallCamera) WarpingPtByHomography(matrix []float64, p Point) Point {
  101. var x, y, z float64
  102. x = matrix[0]*p.X + matrix[1]*p.Y + 1.*matrix[2]
  103. y = matrix[3]*p.X + matrix[4]*p.Y + 1.*matrix[5]
  104. z = matrix[6]*p.X + matrix[7]*p.Y + 1.*matrix[8]
  105. x /= z
  106. y /= z
  107. return Point{X: x, Y: y}
  108. }
  109. func (h *HIKBallCamera) mapping(startV float64, max float64, value float64, direction string, method string) float64 {
  110. if direction == "+" {
  111. if method == "inv" {
  112. if value > (max - startV) {
  113. return value - (max - startV)
  114. } else {
  115. return startV + value // 映射
  116. }
  117. } else {
  118. if value > startV {
  119. return value - startV
  120. } else {
  121. return (max - startV) + value // 映射
  122. }
  123. }
  124. } else {
  125. if value > startV {
  126. return startV + max - value
  127. } else {
  128. return startV - value
  129. }
  130. }
  131. }
  132. func (h *HIKBallCamera) OneClickToSeeInFullView(point Point) bool {
  133. TransPoint := h.WarpingPtByHomography(h.BallCameraCfg.Matrix.Matrix, point)
  134. return h.PtzTo(5,
  135. float32(h.mapping(h.BallCameraCfg.Matrix.PStart, h.BallCameraCfg.Matrix.PMax, TransPoint.X, h.BallCameraCfg.Matrix.PPositiveDirection, "inv")),
  136. float32(h.mapping(h.BallCameraCfg.Matrix.TStart, h.BallCameraCfg.Matrix.TMax, TransPoint.Y, h.BallCameraCfg.Matrix.TPositiveDirection, "inv")),
  137. 0.0,
  138. )
  139. }
  140. func (h *HIKBallCamera) PTZ2FullView() (Point, error) {
  141. var ptz PTZ
  142. if !h.PTZGet(&ptz.P, &ptz.T, &ptz.Z) {
  143. return Point{}, fmt.Errorf("PTZ Get Error")
  144. }
  145. return h.WarpingPtByHomography(h.BallCameraCfg.Matrix.InvMatrix, Point{
  146. X: h.mapping(h.BallCameraCfg.Matrix.PStart, h.BallCameraCfg.Matrix.PMax, float64(ptz.P), h.BallCameraCfg.Matrix.PPositiveDirection, ""),
  147. Y: h.mapping(h.BallCameraCfg.Matrix.TStart, h.BallCameraCfg.Matrix.TMax, float64(ptz.T), h.BallCameraCfg.Matrix.TPositiveDirection, "")}), nil
  148. }
  149. func (hikBC *HIKBallCamera) Invert3x3() bool {
  150. a := hikBC.BallCameraCfg.Matrix.Matrix[0]
  151. b := hikBC.BallCameraCfg.Matrix.Matrix[1]
  152. c := hikBC.BallCameraCfg.Matrix.Matrix[2]
  153. d := hikBC.BallCameraCfg.Matrix.Matrix[3]
  154. e := hikBC.BallCameraCfg.Matrix.Matrix[4]
  155. f := hikBC.BallCameraCfg.Matrix.Matrix[5]
  156. g := hikBC.BallCameraCfg.Matrix.Matrix[6]
  157. h := hikBC.BallCameraCfg.Matrix.Matrix[7]
  158. i := hikBC.BallCameraCfg.Matrix.Matrix[8]
  159. det := a*(e*i-f*h) - b*(d*i-f*g) + c*(d*h-e*g)
  160. if det == 0 {
  161. return false
  162. }
  163. invDet := 1.0 / det
  164. hikBC.BallCameraCfg.Matrix.InvMatrix = []float64{
  165. (e*i - f*h) * invDet,
  166. (c*h - b*i) * invDet,
  167. (b*f - c*e) * invDet,
  168. (f*g - d*i) * invDet,
  169. (a*i - c*g) * invDet,
  170. (c*d - a*f) * invDet,
  171. (d*h - e*g) * invDet,
  172. (b*g - a*h) * invDet,
  173. (a*e - b*d) * invDet,
  174. }
  175. return true
  176. }