这应该是一个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()