203 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package HikNetSDK
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"github.com/ebitengine/purego"
 | |
| 	"runtime"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| var libc uintptr
 | |
| 
 | |
| var (
 | |
| 	DVR_Init func() bool
 | |
| 
 | |
| 	newHIKBallCamera func() unsafe.Pointer
 | |
| 	initBallCamera   func(core unsafe.Pointer, ip string, port string, username string, password string, BallMachineType string) bool
 | |
| 	ptzTo            func(core unsafe.Pointer, Action int, P float32, T float32, Z float32) bool
 | |
| 	ptzGet           func(unsafe.Pointer, unsafe.Pointer, unsafe.Pointer, unsafe.Pointer) bool
 | |
| 	stopBus          func(unsafe.Pointer, int) bool
 | |
| 	startBus         func(unsafe.Pointer, int, int) bool
 | |
| 
 | |
| 	newHIKNvr                func() unsafe.Pointer
 | |
| 	initNvr                  func(unsafe.Pointer, string, string, string, string, int) bool
 | |
| 	checkTimeRegionWithMonth func(core unsafe.Pointer, year int, month int) string
 | |
| 	checkTimeRegionWithDay   func(core unsafe.Pointer, year int, month int, day int) string
 | |
| )
 | |
| 
 | |
| func init() {
 | |
| 	var err error
 | |
| 	libc, err = openLibrary(getSystemLibrary())
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 
 | |
| 	purego.RegisterLibFunc(&DVR_Init, libc, "DVR_Init")
 | |
| 
 | |
| 	purego.RegisterLibFunc(&newHIKBallCamera, libc, "NewHIKBallCamera")
 | |
| 	purego.RegisterLibFunc(&initBallCamera, libc, "InitBallCamera")
 | |
| 	purego.RegisterLibFunc(&ptzTo, libc, "PtzGotoPut")
 | |
| 	purego.RegisterLibFunc(&ptzGet, libc, "PtzGet")
 | |
| 	purego.RegisterLibFunc(&stopBus, libc, "StopBus")
 | |
| 	purego.RegisterLibFunc(&startBus, libc, "StartBus")
 | |
| 
 | |
| 	purego.RegisterLibFunc(&newHIKNvr, libc, "NewHIKNvr")
 | |
| 	purego.RegisterLibFunc(&initNvr, libc, "InitNvr")
 | |
| 	purego.RegisterLibFunc(&checkTimeRegionWithMonth, libc, "CheckTimeRegionWithMonth")
 | |
| 	purego.RegisterLibFunc(&checkTimeRegionWithDay, libc, "CheckTimeRegionWithDay")
 | |
| 
 | |
| }
 | |
| 
 | |
| func getSystemLibrary() string {
 | |
| 	switch runtime.GOOS {
 | |
| 	case "linux":
 | |
| 		if runtime.GOARCH == "amd64" || runtime.GOARCH == "386" {
 | |
| 			return "libHikNetSDKPkg_linux_amd64.so"
 | |
| 		} else {
 | |
| 			return "libHikNetSDKPkg_linux_arm64.so"
 | |
| 		}
 | |
| 	case "windows":
 | |
| 		return "HikNetSDKPkg_win_amd64.dll"
 | |
| 	default:
 | |
| 		panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
 | |
| 	}
 | |
| }
 | |
| 
 | |
| type HIKBallCamera struct {
 | |
| 	core          unsafe.Pointer
 | |
| 	BallCameraCfg BallCamera
 | |
| }
 | |
| 
 | |
| func NewHIKBallCamera(BallCameraCfg BallCamera) *HIKBallCamera {
 | |
| 	return &HIKBallCamera{
 | |
| 		core:          newHIKBallCamera(),
 | |
| 		BallCameraCfg: BallCameraCfg,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (h *HIKBallCamera) Login() bool {
 | |
| 	return initBallCamera(h.core, h.BallCameraCfg.Ip, h.BallCameraCfg.Port, h.BallCameraCfg.User, h.BallCameraCfg.Password, h.BallCameraCfg.Type)
 | |
| }
 | |
| func (h *HIKBallCamera) PtzTo(Action int, P, T, Z float32) bool {
 | |
| 	return ptzTo(h.core, Action, P, T, Z)
 | |
| }
 | |
| func (h *HIKBallCamera) PTZGet(P, T, Z *float32) bool {
 | |
| 	return ptzGet(h.core, unsafe.Pointer(P), unsafe.Pointer(T), unsafe.Pointer(Z))
 | |
| }
 | |
| func (h *HIKBallCamera) StopBus(Direction int) bool {
 | |
| 	return stopBus(h.core, Direction)
 | |
| }
 | |
| func (h *HIKBallCamera) StartBus(Direction, Speed int) bool {
 | |
| 	return startBus(h.core, Direction, Speed)
 | |
| }
 | |
| 
 | |
| type HIKNvr struct {
 | |
| 	core      unsafe.Pointer
 | |
| 	NvrConfig Nvr
 | |
| }
 | |
| 
 | |
| func NewHIKNvr(nvrConfig Nvr) *HIKNvr {
 | |
| 	return &HIKNvr{
 | |
| 		core:      newHIKNvr(),
 | |
| 		NvrConfig: nvrConfig,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (h *HIKNvr) Login() bool {
 | |
| 	return initNvr(h.core, h.NvrConfig.Ip, h.NvrConfig.Port, h.NvrConfig.User, h.NvrConfig.Password, h.NvrConfig.Channel)
 | |
| }
 | |
| 
 | |
| func (h *HIKNvr) CheckTimeRegionWithMonth(year int, month int) string {
 | |
| 	return checkTimeRegionWithMonth(h.core, year, month)
 | |
| }
 | |
| func (h *HIKNvr) CheckTimeRegionWithDay(year int, month int, day int) string {
 | |
| 	return checkTimeRegionWithDay(h.core, year, month, day)
 | |
| }
 | |
| 
 | |
| func (h *HIKBallCamera) WarpingPtByHomography(matrix []float64, p Point) Point {
 | |
| 	var x, y, z float64
 | |
| 	x = matrix[0]*p.X + matrix[1]*p.Y + 1.*matrix[2]
 | |
| 	y = matrix[3]*p.X + matrix[4]*p.Y + 1.*matrix[5]
 | |
| 	z = matrix[6]*p.X + matrix[7]*p.Y + 1.*matrix[8]
 | |
| 
 | |
| 	x /= z
 | |
| 	y /= z
 | |
| 	return Point{X: x, Y: y}
 | |
| }
 | |
| 
 | |
| func (h *HIKBallCamera) mapping(startV float64, max float64, value float64, direction string, method string) float64 {
 | |
| 	if direction == "+" {
 | |
| 		if method == "inv" {
 | |
| 			if value > (max - startV) {
 | |
| 				return value - (max - startV)
 | |
| 			} else {
 | |
| 				return startV + value // 映射
 | |
| 			}
 | |
| 		} else {
 | |
| 			if value > startV {
 | |
| 				return value - startV
 | |
| 			} else {
 | |
| 				return (max - startV) + value // 映射
 | |
| 			}
 | |
| 		}
 | |
| 	} else {
 | |
| 		if value > startV {
 | |
| 			return startV + max - value
 | |
| 		} else {
 | |
| 			return startV - value
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (h *HIKBallCamera) OneClickToSeeInFullView(point Point) bool {
 | |
| 	TransPoint := h.WarpingPtByHomography(h.BallCameraCfg.Matrix.Matrix, point)
 | |
| 	return h.PtzTo(5,
 | |
| 		float32(h.mapping(h.BallCameraCfg.Matrix.PStart, h.BallCameraCfg.Matrix.PMax, TransPoint.X, h.BallCameraCfg.Matrix.PPositiveDirection, "inv")),
 | |
| 		float32(h.mapping(h.BallCameraCfg.Matrix.TStart, h.BallCameraCfg.Matrix.TMax, TransPoint.Y, h.BallCameraCfg.Matrix.TPositiveDirection, "inv")),
 | |
| 		0.0,
 | |
| 	)
 | |
| }
 | |
| 
 | |
| func (h *HIKBallCamera) PTZ2FullView() (Point, error) {
 | |
| 	var ptz PTZ
 | |
| 	if !h.PTZGet(&ptz.P, &ptz.T, &ptz.Z) {
 | |
| 		return Point{}, fmt.Errorf("PTZ Get Error")
 | |
| 	}
 | |
| 	return h.WarpingPtByHomography(h.BallCameraCfg.Matrix.InvMatrix, Point{
 | |
| 		X: h.mapping(h.BallCameraCfg.Matrix.PStart, h.BallCameraCfg.Matrix.PMax, float64(ptz.P), h.BallCameraCfg.Matrix.PPositiveDirection, ""),
 | |
| 		Y: h.mapping(h.BallCameraCfg.Matrix.TStart, h.BallCameraCfg.Matrix.TMax, float64(ptz.T), h.BallCameraCfg.Matrix.TPositiveDirection, "")}), nil
 | |
| }
 | |
| 
 | |
| func (hikBC *HIKBallCamera) Invert3x3() bool {
 | |
| 
 | |
| 	a := hikBC.BallCameraCfg.Matrix.Matrix[0]
 | |
| 	b := hikBC.BallCameraCfg.Matrix.Matrix[1]
 | |
| 	c := hikBC.BallCameraCfg.Matrix.Matrix[2]
 | |
| 	d := hikBC.BallCameraCfg.Matrix.Matrix[3]
 | |
| 	e := hikBC.BallCameraCfg.Matrix.Matrix[4]
 | |
| 	f := hikBC.BallCameraCfg.Matrix.Matrix[5]
 | |
| 	g := hikBC.BallCameraCfg.Matrix.Matrix[6]
 | |
| 	h := hikBC.BallCameraCfg.Matrix.Matrix[7]
 | |
| 	i := hikBC.BallCameraCfg.Matrix.Matrix[8]
 | |
| 
 | |
| 	det := a*(e*i-f*h) - b*(d*i-f*g) + c*(d*h-e*g)
 | |
| 
 | |
| 	if det == 0 {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	invDet := 1.0 / det
 | |
| 	hikBC.BallCameraCfg.Matrix.InvMatrix = []float64{
 | |
| 		(e*i - f*h) * invDet,
 | |
| 		(c*h - b*i) * invDet,
 | |
| 		(b*f - c*e) * invDet,
 | |
| 		(f*g - d*i) * invDet,
 | |
| 		(a*i - c*g) * invDet,
 | |
| 		(c*d - a*f) * invDet,
 | |
| 		(d*h - e*g) * invDet,
 | |
| 		(b*g - a*h) * invDet,
 | |
| 		(a*e - b*d) * invDet,
 | |
| 	}
 | |
| 	return true
 | |
| }
 |