From 5b3ef982eb7bdeb6222f207d9865c0e7e7fad7c6 Mon Sep 17 00:00:00 2001 From: lijun Date: Thu, 16 Jan 2025 14:06:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA=EF=BC=8C?= =?UTF-8?q?=E7=A9=BA=E6=8C=87=E9=92=88=E5=AF=BC=E8=87=B4=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E5=87=BA=E9=94=99,=E9=87=8D=E5=86=99=E9=87=8A=E6=94=BE?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/tool.go | 3 ++- service/tool.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/handler/tool.go b/handler/tool.go index 7197e7a..d7db1fa 100644 --- a/handler/tool.go +++ b/handler/tool.go @@ -164,7 +164,8 @@ func subscribeAndHandleMessagesV3(ws *websocket.Conn, device_id int) { t_count := 0 for { //从service获取当前帧 - img, c := service.GetDeviceCurrentFrame(device_id) + var img gocv.Mat + c := service.GetDeviceCurrentFrameV2(&img, device_id) if c != count { //将img转[]byte if img.Empty() { diff --git a/service/tool.go b/service/tool.go index e8fbfcc..c74c990 100644 --- a/service/tool.go +++ b/service/tool.go @@ -51,6 +51,47 @@ func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error { return nil } +func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) 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 -1 + } + mutex, ok := mutex_.(*sync.RWMutex) + if !ok { + log.Printf("DeviceRWMap 存储的不是 *sync.RWMutex 类型,device_id: %d \n", deviceId) + return -1 + } + mutex.RLock() + defer mutex.RUnlock() + var frame_ gocv.Mat + //获取当前帧 + frameIface, ok := DeviceCurrentFrameMap.Load(deviceId) + if !ok { + return -1 + } + frame_, ok = frameIface.(gocv.Mat) + if !ok { + log.Printf("DeviceCurrentFrameMap 存储的不是 gocv.Mat 类型,device_id: %d \n", deviceId) + } + *frame = frame_ + frame_countIface, ok := DeviceFrameCount.Load(deviceId) + if !ok { + return -1 + } + frame_count, ok := frame_countIface.(int) + if !ok { + log.Printf("DeviceFrameCount 存储的不是 int 类型,device_id: %d", deviceId) + } + return frame_count +} + func GetDeviceCurrentFrame(deviceId int) (gocv.Mat, int) { defer func() { if err := recover(); err != nil {