OpenCVで物体追跡(Object Tracking)の練習です。
わかりにくいのですが、中央のMacbookの内蔵カメラで赤いボールを撮影しています。動画をOpenCVで処理して赤い物体を検出し、Macbookの後ろのモニターに結果を表示しています。
ソースコードは下のサイトを参考にしましたが、別のサイトでもほぼ同じようなソースコードになるようです。condaで実行環境を作って走らせました。
https://temari.co.jp/blog/2017/11/16/opencv-6/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
import cv2 import numpy as np #マスク画像取得 def getMask(lower, upper): # HSVに変換 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) low = np.array(lower) up = np.array(upper) if low[0] >= 0: mask = cv2.inRange(hsv, low, up) else: #赤用(彩度、明度判定は簡略化) h = hsv[:, :, 0] s = hsv[:, :, 1] mask = np.zeros(h.shape, dtype=np.uint8) mask[((h < low[0]*-1) | (h > up[0])) & (s > low[1])] = 255 return cv2.bitwise_and(frame,frame, mask= mask) # 輪郭取得 def getContours(img,t,r): gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) ret, thresh = cv2.threshold(gray, t, 255, cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 一番大きい輪郭を抽出 contours.sort(key=cv2.contourArea, reverse=True) # 検出できなかったら終わり if len(contours) <= 0: return frame # 大きいものから調べる for cnt in contours: # 最小外接円を描く (x,y), radius = cv2.minEnclosingCircle(cnt) center = (int(x),int(y)) radius = int(radius) #大きすぎるものは無視する #if 100 < radius: # continue if radius > r: return cv2.circle(frame,center,radius,(0,255,0),2) else: return frame return frame try: #capture = cv2.VideoCapture('xxxx.mp4') # 任意の動画 capture = cv2.VideoCapture(0) # カメラ while(1): ret, frame = capture.read() if ret == False: print('カメラから映像を取得できませんでした。') continue # 白・赤マスク res_white = getMask([0,0,100], [180,45,255]) res_red = getMask([-10,45,30], [170,255,255]) # 輪郭取得 getContours(res_white, 45, 75) # (画像, 明度閾値, 最小半径) contours_frame = getContours(res_red, 45, 75) # 再生 cv2.imshow('video',contours_frame) k = cv2.waitKey(25) & 0xFF # Q で終了 if k == ord('q'): break cv2.destroyAllWindows() except: import sys print('Error: ', sys.exc_info()[0]) print(sys.exc_info()[1]) import traceback print(traceback.format_tb(sys.exc_info()[2])) |
コメント