Hikvision.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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) int
  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 *HIKNvr) UTCDiff() int {
  101. return nvrUTCDiff(h.core)
  102. }
  103. func (h *HIKBallCamera) WarpingPtByHomography(matrix []float64, p Point) Point {
  104. var x, y, z float64
  105. x = matrix[0]*p.X + matrix[1]*p.Y + 1.*matrix[2]
  106. y = matrix[3]*p.X + matrix[4]*p.Y + 1.*matrix[5]
  107. z = matrix[6]*p.X + matrix[7]*p.Y + 1.*matrix[8]
  108. x /= z
  109. y /= z
  110. return Point{X: x, Y: y}
  111. }
  112. func (h *HIKBallCamera) mapping(startV float64, max float64, value float64, direction string, method string) float64 {
  113. if direction == "+" {
  114. if method == "inv" {
  115. if value > (max - startV) {
  116. return value - (max - startV)
  117. } else {
  118. return startV + value // 映射
  119. }
  120. } else {
  121. if value > startV {
  122. return value - startV
  123. } else {
  124. return (max - startV) + value // 映射
  125. }
  126. }
  127. } else {
  128. if value > startV {
  129. return startV + max - value
  130. } else {
  131. return startV - value
  132. }
  133. }
  134. }
  135. func (h *HIKBallCamera) OneClickToSeeInFullView(point Point) bool {
  136. TransPoint := h.WarpingPtByHomography(h.BallCameraCfg.Matrix.Matrix, point)
  137. return h.PtzTo(5,
  138. float32(h.mapping(h.BallCameraCfg.Matrix.PStart, h.BallCameraCfg.Matrix.PMax, TransPoint.X, h.BallCameraCfg.Matrix.PPositiveDirection, "inv")),
  139. float32(h.mapping(h.BallCameraCfg.Matrix.TStart, h.BallCameraCfg.Matrix.TMax, TransPoint.Y, h.BallCameraCfg.Matrix.TPositiveDirection, "inv")),
  140. 0.0,
  141. )
  142. }
  143. func (h *HIKBallCamera) PTZ2FullView() (Point, error) {
  144. var ptz PTZ
  145. if !h.PTZGet(&ptz.P, &ptz.T, &ptz.Z) {
  146. return Point{}, fmt.Errorf("PTZ Get Error")
  147. }
  148. return h.WarpingPtByHomography(h.BallCameraCfg.Matrix.InvMatrix, Point{
  149. X: h.mapping(h.BallCameraCfg.Matrix.PStart, h.BallCameraCfg.Matrix.PMax, float64(ptz.P), h.BallCameraCfg.Matrix.PPositiveDirection, ""),
  150. Y: h.mapping(h.BallCameraCfg.Matrix.TStart, h.BallCameraCfg.Matrix.TMax, float64(ptz.T), h.BallCameraCfg.Matrix.TPositiveDirection, "")}), nil
  151. }
  152. func (hikBC *HIKBallCamera) Invert3x3() bool {
  153. a := hikBC.BallCameraCfg.Matrix.Matrix[0]
  154. b := hikBC.BallCameraCfg.Matrix.Matrix[1]
  155. c := hikBC.BallCameraCfg.Matrix.Matrix[2]
  156. d := hikBC.BallCameraCfg.Matrix.Matrix[3]
  157. e := hikBC.BallCameraCfg.Matrix.Matrix[4]
  158. f := hikBC.BallCameraCfg.Matrix.Matrix[5]
  159. g := hikBC.BallCameraCfg.Matrix.Matrix[6]
  160. h := hikBC.BallCameraCfg.Matrix.Matrix[7]
  161. i := hikBC.BallCameraCfg.Matrix.Matrix[8]
  162. det := a*(e*i-f*h) - b*(d*i-f*g) + c*(d*h-e*g)
  163. if det == 0 {
  164. return false
  165. }
  166. invDet := 1.0 / det
  167. hikBC.BallCameraCfg.Matrix.InvMatrix = []float64{
  168. (e*i - f*h) * invDet,
  169. (c*h - b*i) * invDet,
  170. (b*f - c*e) * invDet,
  171. (f*g - d*i) * invDet,
  172. (a*i - c*g) * invDet,
  173. (c*d - a*f) * invDet,
  174. (d*h - e*g) * invDet,
  175. (b*g - a*h) * invDet,
  176. (a*e - b*d) * invDet,
  177. }
  178. return true
  179. }