Hikvision.go 6.0 KB

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