いくつかのpython実装コードを共有する
#! /usr/bin/env python
# coding=utf-8import cv2
img = cv2.imread("trace_border2.bmp")[img_h, img_w, img_channel]= img.shape
trace =[]
start_x =0
start_y =0
gray = img[:,:,1]for h inrange(img_h):for w inrange(img_w):if(gray[h,w]128):
gray[h,w]=255else:
gray[h,w]=0
# Pythonは複数のループから飛び出します
# https://www.cnblogs.com/xiaojiayu/p/5195316.html
classgetoutofloop(Exception): pass
try:for h inrange(img_h -2):for w inrange(img_w -2):if gray[h,w]==0:
start_x = w
start_y = h
raise getoutofloop
except getoutofloop:
pass
print("Start Point (%d %d)"%(start_x, start_y))
trace.append([start_x, start_y])
# 8 近所の時計回りの検索
neighbor =[[-1,-1],[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0]]
neighbor_len =len(neighbor)
# 現在のポイントの左上から開始します。
# 左上も黒い点の場合(境界点):
# 検索方向を反時計回りに90i回転します-=2
# そうでなければ:
# 検索方向を時計回りに45i+=1
i =0
cur_x = start_x + neighbor[i][0]
cur_y = start_y + neighbor[i][1]
is_contour_point =0try:whilenot((cur_x == start_x)and(cur_y == start_y)):
is_contour_point =0while is_contour_point ==0:
# neighbor_x = cur_x +if gray[cur_y, cur_x]==0:
is_contour_point =1
trace.append([cur_x, cur_y])
i -=2if i <0:
i += neighbor_len
else:
i +=1if i = neighbor_len:
i -= neighbor_len
# print(i)
cur_x = cur_x + neighbor[i][0]
cur_y = cur_y + neighbor[i][1]
except:print("throw error")for i inrange(len(trace)-1):
cv2.line(img,(trace[i][0],trace[i][1]),(trace[i+1][0], trace[i+1][1]),(0,0,255),3)
cv2.imshow("img", img)
cv2.waitKey(10)
cv2.rectangle(img,(start_x, start_y),(start_x +20, start_y +20),(255,0,0),2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyWindow("img")
検索プロセス、赤いマーキングラインは次のとおりです。
補足知識:Pythonはターゲット追跡を実現します(opencv)
1. 単一ターゲット追跡
import cv2
importsys(major_ver, minor_ver, subminor_ver)=(cv2.__version__).split('.')print(major_ver, minor_ver, subminor_ver)if __name__ =='__main__':
# トラッカーを作成する
tracker_type ='MIL'
tracker = cv2.TrackerMIL_create()
# ビデオで読む
video = cv2.VideoCapture("./data/1.mp4")
# 最初のフレームで読む
ok, frame = video.read()if not ok:print('Cannot read video file')
sys.exit()
# バウンディングボックスを定義する
bbox =(287,23,86,320)
bbox = cv2.selectROI(frame, False)
# 最初のフレームで初期化します
ok = tracker.init(frame, bbox)while True:
ok, frame = video.read()if not ok:break
# Start timer
timer = cv2.getTickCount()
# Update tracker
ok, bbox = tracker.update(frame)
# Cakculate FPS
fps = cv2.getTickFrequency()/(cv2.getTickCount()- timer)
# Draw bonding box
if 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)else:
cv2.putText(frame,"Tracking failed detected",(100,80), cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),2)
# ディスプレイトラッカータイプ
cv2.putText(frame, tracker_type+"Tracker",(100,20), cv2.FONT_HERSHEY_SIMPLEX,0.75,(50,170,50),2)
# FPSを表示
cv2.putText(frame,"FPS:"+str(fps),(100,50), cv2.FONT_HERSHEY_SIMPLEX,0.75,(50,170,50),2)
# Result
cv2.imshow("Tracking", frame)
# Exit
k = cv2.waitKey(1)&0xffif k ==27:break
2. マルチターゲットトラッキング
GOTURNをトラッカーとして使用する場合、実行するには、goturn.caffemodelとgoturn.prototxtを作業ディレクトリに配置する必要があります。問題を解決するためのリンクはhttps://stackoverflow.com/questions/48802603/getting-deep-learning-tracker-goturn-to-です。 run-opencv-python
import cv2
importsys(major_ver, minor_ver, subminor_ver)=(cv2.__version__).split('.')print(major_ver, minor_ver, subminor_ver)if __name__ =='__main__':
# トラッカーを作成する
# ' BOOSTING','MIL','KCF','TLD','MEDIANFLOW','GOTURN','MOSSE'
tracker_type ='MIL'
tracker = cv2.MultiTracker_create()
# ウィンドウを作成
cv2.namedWindow("Tracking")
# ビデオで読む
video = cv2.VideoCapture("./data/1.mp4")
# 最初のフレームで読む
ok, frame = video.read()if not ok:print('Cannot read video file')
sys.exit()
# バウンディングボックスを定義する
box1 = cv2.selectROI("Tracking", frame)
box2 = cv2.selectROI("Tracking", frame)
box3 = cv2.selectROI("Tracking", frame)
# 最初のフレームで初期化します
ok = tracker.add(cv2.TrackerMIL_create(), frame, box1)
ok1 = tracker.add(cv2.TrackerMIL_create(), frame, box2)
ok2 = tracker.add(cv2.TrackerMIL_create(), frame, box3)while True:
ok, frame = video.read()if not ok:break
# Start timer
timer = cv2.getTickCount()
# Update tracker
ok, boxes = tracker.update(frame)print(ok, boxes)
# Cakculate FPS
fps = cv2.getTickFrequency()/(cv2.getTickCount()- timer)for box in boxes:
# Draw bonding box
if ok:
p1 =(int(box[0]),int(box[1]))
p2 =(int(box[0]+ box[2]),int(box[1]+ box[3]))
cv2.rectangle(frame, p1, p2,(255,0,0),2,1)else:
cv2.putText(frame,"Tracking failed detected",(100,80), cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),2)
# ディスプレイトラッカータイプ
cv2.putText(frame, tracker_type+"Tracker",(100,20), cv2.FONT_HERSHEY_SIMPLEX,0.75,(50,170,50),2)
# FPSを表示
cv2.putText(frame,"FPS:"+str(fps),(100,50), cv2.FONT_HERSHEY_SIMPLEX,0.75,(50,170,50),2)
# Result
cv2.imshow("Tracking", frame)
# Exit
k = cv2.waitKey(1)&0xffif k ==27:break
上記の画像の外側の境界追跡操作のpython実装は、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。
Recommended Posts