基于c++的马氏距离算法代码_监控警戒区基于掩码算法的简单实现(附代码)
生活随笔
收集整理的這篇文章主要介紹了
基于c++的马氏距离算法代码_监控警戒区基于掩码算法的简单实现(附代码)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
視頻地址:https://www.ixigua.com/6870543177913205251/
這是利用圖片掩碼實(shí)現(xiàn)的一個(gè)視頻監(jiān)控區(qū)域警戒功能代碼,當(dāng)人進(jìn)出警戒區(qū)域時(shí),自動記錄一張圖片到本地,效果視頻講解見連接:https://www.ixigua.com/6870543177913205251/
按代碼功能主要分為三個(gè)部分:
1、動態(tài)截屏
2、yolov5目標(biāo)檢測
3、掩碼生成及檢測目標(biāo)是否進(jìn)出該區(qū)域
完整代碼:
#動態(tài)截圖,識別目標(biāo),設(shè)置并記錄警戒區(qū)域的目標(biāo)import numpy as npfrom numpy import randomfrom PIL import ImageGrabimport cv2import timeimport win32apiimport torchimport torch.backends.cudnn as cudnnfrom models.experimental import attempt_loadfrom utils.general import (check_img_size, non_max_suppression, scale_coords, plot_one_box)from utils.torch_utils import select_device, load_classifierprint('Setup complete. Using torch %s %s' % (torch.__version__, torch.cuda.get_device_properties(0) if torch.cuda.is_available() else 'CPU'))# Initializedevice = select_device()frame_h = 480frame_w = 800obj_count = 0 #警戒區(qū)目標(biāo)obj_count_old = 0 #警戒區(qū)舊目標(biāo)take_photo_num = 0;#拍照次數(shù)#每個(gè)監(jiān)測不一定都檢測得到,所以做個(gè)緩沖區(qū)用于取平均值,因?yàn)橐苊饽硯哪繕?biāo)丟失,會造成目標(biāo)數(shù)量的跳變,引發(fā)拍照記錄obj_count_buf = np.array([0,0,0,0,0,0,0,0,0,0])#10個(gè)值# Load modelmodel = attempt_load('weights/yolov5s.pt', map_location=device) # load FP32 model cuda# Get names and colorsnames = model.module.names if hasattr(model, 'module') else model.namescolors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(names))]#imgsz = check_img_size(486, s=model.stride.max()) # check img_sizeframe_mask = np.zeros((frame_h,frame_w, 3),dtype = np.uint8)#做一個(gè)相同尺寸格式的圖片maskpostion = [(413,179),(275,391),(632,381),(571,204)]#警戒區(qū)位置點(diǎn)cv2.fillPoly(frame_mask, [np.array(postion)], (0,0,255))#警戒區(qū)內(nèi)數(shù)字填充255,0,0成為maskdef process_img(original_image):#原圖處理函數(shù) processed_img = cv2.cvtColor(original_image,cv2.COLOR_BGR2RGB)#BGR格式轉(zhuǎn)換RGB processed_img = cv2.resize(processed_img,(frame_w,frame_h))#改變輸入尺寸 return processed_imgdef MouseEvent(a,b,c,d,e):#鼠標(biāo)處理事件響應(yīng)函數(shù) if(a==1): #獲取左鍵點(diǎn)擊坐標(biāo)點(diǎn) print(b,c) cv2.namedWindow('frame')cv2.setMouseCallback('frame', MouseEvent) # 窗口與回調(diào)函數(shù)綁定while(1): # get a frame frame = np.array(ImageGrab.grab(bbox=(0, 100, 800,600)))#截屏 if np.shape(frame): #frame有數(shù)據(jù)才能往下執(zhí)行 #processing frame = process_img(frame)#圖片處理 img = frame.copy()#拷貝一份到img #print("img:",np.shape(img)) img = np.transpose(img,(2,0,1))#torch.Size([480, 800, 3])轉(zhuǎn)torch.Size([3, 480, 800]) #print("img:",np.shape(img)) img = torch.from_numpy(img).to(device) #img為gpu格式后,常規(guī)方法不能讀取 img = img.float() # uint8 to fp32 img /= 255.0 # 0 - 255 to 0.0 - 1.0 #print(np.shape(img))#>>>torch.Size([3, 416, 352]) if img.ndimension() == 3: img = img.unsqueeze(0)#這個(gè)函數(shù)主要是對數(shù)據(jù)維度進(jìn)行擴(kuò)充,在0的位置加了一維 #print(np.shape(img))#>>>torch.Size([1, 3, 416, 352]) pred = model(img)[0] # Apply NMS 非極大值抑制 pred = non_max_suppression(pred, 0.5, 0.5)#大于0.4閾值的輸出,只顯示classes:>= 1,不能顯示0? #繪圖 if pred != [None]: for i,det in enumerate(pred): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords(img.shape[2:], det[:, :4], frame.shape).round() # Write results for *xyxy, conf, cls in reversed(det): if cls == 0:#只顯示0(person)的標(biāo)簽,因?yàn)閚on_max_suppression(只顯示classes:>= 1)的標(biāo)簽 label = '%s %.2f' % (names[int(cls)], conf) plot_one_box(xyxy, frame, label=label, color=colors[int(cls)], line_thickness=1)#utils.general專用畫框標(biāo)注函數(shù) xy = torch.tensor(xyxy).tolist()#張量轉(zhuǎn)換成列表形式 x,y,x1,y1 = int(xy[0]),int(xy[1]),int(xy[2]),int(xy[3])#獲取左頂右底坐標(biāo) center_xy = (int(np.average([x,x1])),int(np.average([y,y1])))#計(jì)算中心點(diǎn) if (frame_mask[(center_xy[1],center_xy[0])] == [0,0,255]).all():#中心點(diǎn)在警戒區(qū) obj_color = (255, 0, 0)#改變中心點(diǎn)顏色 obj_count += 1 else: obj_color = (255, 255, 0)#改變中心點(diǎn)顏色 cv2.circle(frame, center_xy, 10, obj_color, 4)#開始畫點(diǎn) obj_count_buf = np.append(obj_count_buf[1:],obj_count)#保持更新10個(gè)緩沖區(qū) cbr = int(np.around(np.average(obj_count_buf))) cv2.putText(frame, 'obj_count :%s obj take_photo: %s'%(cbr,take_photo_num), (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 2)#文字信息顯示 frame = cv2.addWeighted(frame,1.0,frame_mask,0.1,0.0)#疊加掩碼圖片進(jìn)實(shí)時(shí)圖 if (obj_count_old != cbr) : take_photo_num += 1 cv2.imwrite("./photo/%s.jpg"%take_photo_num, frame, [int(cv2.IMWRITE_JPEG_QUALITY),50])#保存圖片 print('take photo number :%s'%take_photo_num)#顯示記錄的照片張數(shù) cv2.putText(frame, 'take photo', (100, 300), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 0, 255), 3)#文字信息顯示 obj_count_old = cbr #保存上個(gè)數(shù)據(jù) obj_count = 0#目標(biāo)顯示清零,等待下次探測 # show a frame #cv2.imshow("capture", frame[:,:,::-1]) cv2.imshow("frame", frame) cv2.imshow("frame_mask", frame_mask[:,:,::-1]) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows()總結(jié)
以上是生活随笔為你收集整理的基于c++的马氏距离算法代码_监控警戒区基于掩码算法的简单实现(附代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux部署vue项目_Vue项目部署
- 下一篇: java 模板引擎_极简 Spring