python についての質問です
解決したいこと
pythonを用いて画面上のマーカーに座標(数字)を表示させたいと思っています
画像に表示されている赤の丸は緑色と赤色の面積が最大のものに対してマークがつくようになっています。ウェブカメラを用いているので緑と赤の物を動かすと中心を追従してくれます。
そのマークに座標をそれぞれつけたいと考えているのですが可能でしょうか?
また、この2つのマークの角度をリアルタイムで抽出することは可能でしょうか?
ご教授お願い致します。
参考となるプログラムを書いていただければ幸いです。
下記のコードは画像で実行しているコードです。
-- coding: utf-8 --
import cv2
import numpy as np
import time
def red_detect(img):
# HSV色空間に変換
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 赤色のHSVの値域1
hsv_min = np.array([0,127,0])
hsv_max = np.array([30,255,255])
mask1 = cv2.inRange(hsv, hsv_min, hsv_max)
# 赤色のHSVの値域2
hsv_min = np.array([60,127,0])
hsv_max = np.array([179,255,255])
mask2 = cv2.inRange(hsv, hsv_min, hsv_max)
return mask1 + mask2
def green_detect(img):
# HSV色空間に変換
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 緑色のHSVの値域1
hsv_min = np.array([30,64,0])
hsv_max = np.array([90,255,255])
mask1 = cv2.inRange(hsv, hsv_min, hsv_max)
return mask1
def calc_max_point(mask):
if np.count_nonzero(mask) <= 0:
return(-20, -20)
# ラベリング処理
label = cv2.connectedComponentsWithStats(mask)
# ブロブ情報を項目別に抽出
n = label[0] - 1
data = np.delete(label[2], 0, 0)
center = np.delete(label[3], 0, 0)
# ブロブ面積が最大のインデックス
max_index = np.argmax(data[:,4])
# 最大面積をもつブロブの中心座標を返す
return center[max_index]
def main():
# データ格納用のリスト
data = []
# カメラのキャプチャ
cap = cv2.VideoCapture(0)
# 開始時間
start = time.time()
while(cap.isOpened()):
# フレームを取得
ret, frame = cap.read()
# 赤色検出
mask = red_detect(frame)
# 面積最大ブロブの中心座標(x, y)を取得
x, y = calc_max_point(mask)
# 緑色検出
mask = green_detect(frame)
# 面積最大ブロブの中心座標(x1, y1)を取得
x1, y1 = calc_max_point(mask)
# 経過時間, x, yをリストに追加
data.append([time.time() - start, x, y])
# 赤色の物体の中心座標に赤丸を描く
cv2.circle(frame, (int(x), int(y)), 20, (0, 0, 255), 10)
cv2.circle(frame, (int(x1), int(y1)), 20, (0, 0, 255), 10)
# ウィンドウ表示
cv2.imshow("Frame", frame)
cv2.imshow("Mask", mask)
# qキーが押されたら途中終了
if cv2.waitKey(25) & 0xFF == ord('q'):
break
# CSVファイルに保存
np.savetxt("data.csv", np.array(data), delimiter=",")
# キャプチャ解放・ウィンドウ廃棄
cap.release()
cv2.destroyAllWindows()
if name == 'main':
main()
0 likes