@fwettyan

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

python についての質問です

解決したいこと

pythonを用いて画面上のマーカーに座標(数字)を表示させたいと思っています

画像に表示されている赤の丸は緑色と赤色の面積が最大のものに対してマークがつくようになっています。ウェブカメラを用いているので緑と赤の物を動かすと中心を追従してくれます。 
そのマークに座標をそれぞれつけたいと考えているのですが可能でしょうか?
また、この2つのマークの角度をリアルタイムで抽出することは可能でしょうか?

ご教授お願い致します。
参考となるプログラムを書いていただければ幸いです。

Pythonのバージョンは3.7です
2021-07-16.png

下記のコードは画像で実行しているコードです。

-- 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

1Answer

OpenCVのページにあるように,cv2.putText() を用いて

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)

という感じで書きたい文字列"OpenCV"とその座標(10, 500)とその色(255,255,255)を指定することができます.
物体の中心座標は得られているみたいなので,その上下左右お好きな位置にずらして文字を入れてみたらいかがでしょうか.

0Like

Your answer might help someone💌