python初心者です
水槽内のメダカの軌跡を見るためにメダカの重心の値を求めるプログラムを作っています.(動画orリアルタイムで)
現状だと2値化して映ったものすべてに重心が出てしまうので対処法がわかりません(水槽内のごみなどにも)
メダカの重心のみを出すにはどうすればいいでしょうか.また光を当てている影響でメダカの体にも影ができてしまっているのでメダカの体をすべて映せるようにする方法も教えてくださるとうれしいです.
環境:Spyder(anaconda3),opencv4.5.4-dev
import cv2 import time import numpy as np movie = cv2.VideoCapture('sample3.mp4') before = None # 前回の画像を保存する変数 fps = int(movie.get(cv2.CAP_PROP_FPS)) #動画のFPSを取得 while True: /画像を取得 ret, frame = movie.read() /再生が終了したらループを抜ける if ret == False: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) if before is None: before = gray.astype("float") continue /現在のフレームと移動平均との差を計算 cv2.accumulateWeighted(gray, before, 0.6) frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(before)) /frameDeltaの画像を2値化 thresh = cv2.threshold(frameDelta, 6, 255, cv2.THRESH_BINARY)[1] label = cv2.connectedComponentsWithStats(thresh) /オブジェクト情報を項目別に抽出 n = label[0] - 1 data = np.delete(label[2], 0, 0) center = np.delete(label[3], 0, 0) /ラベリング結果書き出し用に二値画像をカラー変換 color_src = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) /オブジェクト情報を利用してラベリング結果を表示 for i in range(n): x1 = data[i][0] + data[i][2] y1 = data[i][1] + data[i][3] /各オブジェクトの重心座標をに黄文字で表示 cv2.putText(color_src, "X: " + str(int(center[i][0])), (x1-10 , y1+15),cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) cv2.putText(color_src, "Y: " + str(int(center[i][1])), (x1-10 , y1+30),cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255)) time.sleep(0.25/fps) cv2.imshow('movie',color_src) cv2.imshow('target_bh', thresh) /Enterキーが押されたらループを抜ける if cv2.waitKey(1) == 13: break cv2.destroyAllWindows() # ウィンドウを破棄
回答2件
あなたの回答
tips
プレビュー