多进程检测与追踪架构------KCF测试

本文介绍了一种使用Python和OpenCV实现KCF(Kernelized Correlation Filters)目标跟踪算法的方法。通过创建KCF跟踪器实例,应用鼠标事件选择目标区域,并实时更新跟踪窗口,实现了对视频中选定目标的精确跟踪。同时,该脚本展示了如何利用多进程进行数据处理和串口通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这应该是一个kcf测试的一个python脚本

# -*- coding: utf-8 -*-
import cv2
import time
import serial
import sys
import multiprocessing as mp
from multiprocessing import Process, Queue
selection = None
drag_start = None
track_window = None 
track_start = False
tracker = cv2.TrackerKCF_create()

#video = cv2.VideoCapture(0)

def KCF_p(strdata):
    def onmouse(event, x, y, flags, param):
        global selection, drag_start, track_window, track_start 
        if event == cv2.EVENT_LBUTTONDOWN: 
	    drag_start = (x, y) 
	    track_window = None
        if drag_start: 
	    xmin = min(x, drag_start[0]) 
	    ymin = min(y, drag_start[1]) 
	    xmax = max(x, drag_start[0]) 
	    ymax = max(y, drag_start[1]) 
	    selection = (xmin, ymin, xmax, ymax) 
        if event == cv2.EVENT_LBUTTONUP: 
   	    drag_start = None 
	    selection = None 
	    track_window = (xmin, ymin, xmax - xmin, ymax - ymin) 
	    if track_window and track_window[2] > 0 and track_window[3] > 0: 
	        track_start = True
	        tracker.init(frame, track_window) 
    dm1 = 0
    dm2 = 0
    #video = "/home/ubuntu/SSD/video_test.mp4"
    cap = cv2.VideoCapture(0)
    cap.set(3,1920)
    cap.set(4,1080)
    cv2.namedWindow('KCFTracker',cv2.WINDOW_NORMAL)
    cv2.setMouseCallback('KCFTracker', onmouse)
    tracker = cv2.TrackerKCF_create()
    if not cap.isOpened():
        #print('Could not open video') 
        sys.exit() 
    while True: 
        ok, frame = cap.read() 
        h,w,_ = frame.shape
    #print("h:%s    w:%d ",h,w)
        if not ok:
            break 
        if selection: 
    	    x0, y0, x1, y1 = selection 
    	    cv2.rectangle(frame, (x0, y0), (x1, y1), (255, 0, 0), 2, 1)
        timer = cv2.getTickCount() 
        track_ok = None 
        if track_start: 
	    track_ok, bbox = tracker.update(frame)
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer) 
        if track_ok: 
	    p1 = (int(bbox[0]), int(bbox[1])) 
	    p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3])) 
	    cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)
           # cv2.line(frame,(w/2,0),(w/2,h),(0,255,0))
	   # cv2.line(frame,(0,h/2),(w,h/2),(0,255,0))
	    left = p1[0]
            top = p1[1]
	    right = p2[0]
	    bottom = p2[1]
	    h,w,_ = frame.shape
	    dn1 = int((left+right)/2)-(w/2)
    #dn1 = 960-int((left1+right1)/2)
    	    dn2 = (h/2)-int((top+bottom)/2)
	    cv2.putText(frame, 'x:', (left, bottom), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0),1)
    	    cv2.putText(frame, 'y:', (left, bottom+15), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0),1)
            cv2.putText(frame, str(dn1), (left+15, bottom), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255),1)
    	    cv2.putText(frame, str(dn2), (left+15, bottom+30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255),1)     
	    
	    #dn1 = int((left+right)/2)-(w/2)
    #dn1 = 960-int((left1+right1)/2)
    	    #dn2 = (h/2)-int((top+bottom)/2)
	    #k1= 1

	    k1 = int(0.01*dn1 + 0.2*(dn1-dm1))
	    if 0.01*dn1 + 0.25*(dn1-dm1) <0 and 0.01*dn1 + 0.2*(dn1-dm1) >-1:
	        k1 = -1
	    if 0.01*dn1 + 0.25*(dn1-dm1) >0 and 0.01*dn1 + 0.2*(dn1-dm1) <1:
	        k1 =  1

	    #k1 = int(0.008*dn1)
    	    #k2 = int(0.01*dn2 + 0.25*(dn2-dm2))  
	    k2 = 0
	    print("k1----------------------",k1)
	    #print("dn1----------------------",dn1)
            data = [0x55, 0xaa, 0xdc, 0x13, 0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00]
            h1 = k1&(0xff00)
   	    h1 = h1>>8
   	    h2 = k1&(0x00ff)
       	    h3 = k2&(0xff00)
    	    h3 = h3>>8
    	    h4 = k2&(0x00ff)
	    #print("h1 h2--------------------",h1,h2)
    	    data[17] = h1
    	    data[18] = h2
    	    data[19] = h3
    	    data[20] = h4
    	    temp1 = data[3]
       	    n = len(data)
    	    dm1 = dn1
      	    dm2 = dn2
    	    for i in range(4,21):
        	temp1 = temp1^data[i]
    #print(hex(temp))
    	    data[n-1]=(temp1)
	    if not strdata.full():
          	strdata.put(data)
            else:
            	temp = strdata.get(True)
            	strdata.put(data)
        elif not track_start: 	
	    cv2.putText(frame, "No tracking target selected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) 
        elif not track_ok: 
	    cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) 
	    #data = [0x55, 0xaa, 0xdc, 0x13, 0x22, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x19]
	   # if not strdata.full():
           	#strdata.put(data)
          #  else:
            #   temp = strdata.get(True)
             #   strdata.put(data)
        cv2.putText(frame, "KCF Tracker", (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2) 
        cv2.putText(frame, "FPS : " + str(int(fps)), (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2) 
	#cv2.line(frame,(w/2,0),(w/2,h),(0,255,0))
	#cv2.line(frame,(0,h/2),(w,h/2),(0,255,0))
        cv2.imshow("KCFTracker", frame)
        k = cv2.waitKey(1) & 0xff 
        if k == 27: 
	    break 
    cap.release() 
    cv2.destroyAllWindows() 
def value_out(strdata):
    #start1 = time.clock
    ser = serial.Serial('/dev/ttyS0', 38400)
    data = strdata.get(True)
    while True:
	start = time.clock()
	if not strdata.empty():
	    data = strdata.get(True)
	    end1 = time.clock()
	    time.sleep(0.04-(end1-start))
	    #print("sleeping time-------------",0.04-(end1-start))
            #print(data)
	    ser.write(data)
            time_label = time.clock()
	    #print("time label ok-------------------------",time_label)
        else:
	    data_empty = data
	    #data_empty = [0x55, 0xaa, 0xdc, 0x13, 0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        # 0x00, 0x00, 0x00, 0x00]
	    #temp1 = data[3]
    	   # n = len(data)
    	  # for i in range(4,21):
        #	temp1 = temp1^data[i]
    #print(hex(temp))
    	#    data[n-1]=(temp1)
    	    end2 = time.clock()
	    
	    time.sleep(0.04-(end2-start))
	    #print("sleeping time-------------",0.04-(end2-start))
	    #print(data_empty)
	    ser.write(data_empty)
	    time_label = time.clock()
	    #print("time label failed-------------------------",time_label)
if __name__ == '__main__':
    
    strdata = Queue(maxsize = 1)
    pr = Process(target=value_out, args=(strdata, ))
    #pw = Process(target=det_p, args=(det_img, det_results))
    # img_q, det_img, ssd_img, det_results
    pw = Process(target=KCF_p, args=(strdata,))
    
    pw.start()
    pr.start()
    
    pw.join()
    pr.join()
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值