From f83e7202247bbecc71c77534a45d6ad5853b2ca2 Mon Sep 17 00:00:00 2001 From: lijun Date: Sat, 18 Jan 2025 14:21:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=88=86=E7=A6=BB=E7=9A=84?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F=E5=AD=98=E5=82=A8=E5=B8=A7?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E7=94=A8map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/tool.go | 3 +-- main.go | 6 +++++ service/tool.go | 69 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/handler/tool.go b/handler/tool.go index d7db1fa..22b66c6 100644 --- a/handler/tool.go +++ b/handler/tool.go @@ -164,8 +164,7 @@ func subscribeAndHandleMessagesV3(ws *websocket.Conn, device_id int) { t_count := 0 for { //从service获取当前帧 - var img gocv.Mat - c := service.GetDeviceCurrentFrameV2(&img, device_id) + img, c := service.GetDeviceCurrentFrameV3(device_id) if c != count { //将img转[]byte if img.Empty() { diff --git a/main.go b/main.go index 21ef9d6..b326656 100644 --- a/main.go +++ b/main.go @@ -104,6 +104,12 @@ func ReadConfigAndSetSystem() { service.DeviceIsGettingFrame.Store(device.ID, false) } if is_get == false && device.NextStop == false { //如果设备流已经停止且不暂停,则开启 + switch device.ID { + case 1: + service.Device1CurrentFrame = gocv.NewMat() + case 50: + service.Device50CurrentFrame = gocv.NewMat() + } go service.GetVideoStream(device.ID) log.Printf("device:%d has started!\n", device.ID) } diff --git a/service/tool.go b/service/tool.go index b8081e0..7e02d10 100644 --- a/service/tool.go +++ b/service/tool.go @@ -18,6 +18,8 @@ var DeviceRWMap = &sync.Map{} var DeviceCurrentFrameMap = &sync.Map{} var DeviceFrameCount = &sync.Map{} var DeviceIsGettingFrame = &sync.Map{} +var Device1CurrentFrame gocv.Mat +var Device50CurrentFrame gocv.Mat func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error { //获取读写锁 @@ -51,6 +53,32 @@ func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error { return nil } +func SetDeviceCurrentFrameV2(frame gocv.Mat, device_id int) error { + //获取读写锁 + mutex_, ok := DeviceRWMap.Load(device_id) + if !ok { + return fmt.Errorf("设备:%s 读写锁不存在", device_id) + } + mutex := mutex_.(*sync.RWMutex) + mutex.Lock() + defer mutex.Unlock() + //设置当前帧 + switch device_id { + case 1: + Device1CurrentFrame = frame + case 50: + Device50CurrentFrame = frame + } + frame_count, ok := DeviceFrameCount.Load(device_id) + if !ok { + return fmt.Errorf("设备:%s 当前帧计数不存在", device_id) + } + frame_count_ := frame_count.(int) + frame_count_++ + DeviceFrameCount.Store(device_id, frame_count_) + return nil +} + func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) int { defer func() { if err := recover(); err != nil { @@ -92,6 +120,45 @@ func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) int { return frame_count } +func GetDeviceCurrentFrameV3(deviceId int) (gocv.Mat, int) { + defer func() { + if err := recover(); err != nil { + log.Printf("设备:%d 错误: %v\n", deviceId, err) + } + }() + + //获取读写锁 + mutex_, ok := DeviceRWMap.Load(deviceId) + if !ok { + log.Printf("DeviceRWMap 读写锁不存在,device_id: %d \n", deviceId) + return gocv.NewMat(), -1 + } + mutex, ok := mutex_.(*sync.RWMutex) + if !ok { + log.Printf("DeviceRWMap 存储的不是 *sync.RWMutex 类型,device_id: %d \n", deviceId) + return gocv.NewMat(), -1 + } + mutex.RLock() + defer mutex.RUnlock() + //获取当前帧 + var frame gocv.Mat + switch deviceId { + case 1: + frame = Device1CurrentFrame + case 50: + frame = Device50CurrentFrame + } + + frame_countIface, ok := DeviceFrameCount.Load(deviceId) + if !ok { + return gocv.NewMat(), -1 + } + frame_count, ok := frame_countIface.(int) + if !ok { + log.Printf("DeviceFrameCount 存储的不是 int 类型,device_id: %d", deviceId) + } + return frame, frame_count +} func GetDeviceCurrentFrame(deviceId int) (gocv.Mat, int) { defer func() { if err := recover(); err != nil { @@ -185,7 +252,7 @@ func getVideoFrame(device proto.DeviceInfo) { currentTime := time.Now().Format("2006-01-02 15:04:05") gocv.PutText(&frame, currentTime, image.Point{10, 20}, font, fontScale, fontColor, lineType) //需要将帧付给全局变量 - err3 := SetDeviceCurrentFrame(frame, device.ID) + err3 := SetDeviceCurrentFrameV2(frame, device.ID) if err3 != nil { log.Printf("设备:%d 错误: 无法设置当前帧,err:%s \n", device.ID, err3.Error()) }