LoginSignup
dechio
@dechio

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

OpenCV-Python で四角形の頂点の座標検出

Q&AClosed

解決したいこと

PythonでOpenCVを使ってPCに接続しているwebカメラで撮影している四角形の頂点の座標を取得したいです。
また、座標を取得した後に取得した座標の情報を使って座標計算の処理をしたいと考えています。
(例えば重心の計算、頂点の中点の計算など簡易的なもの)

ネット上で調べるとcv2.findCounerが良さそうだと思い、試しましたが、
望んでいる四隅以外の大量の点も拾ってきてしまい、思ったような処理ができておりません。
findContoursで指定しているcv2.CHAIN_APPROX_SIMPLEはシンプルに頂点のみ検出してくれると
予想していましたが、異なる働きをしているように感じています。

前段の処理で何かまずことをしているのでしょうか。
あるいはもっと根本に問題があるのでしょうか。
何か試してみたら良いことなどアドバイスを頂けますと助かります。

以下に作成したコード、得られた結果と画像を示します。

該当するソースコード

import cv2
import numpy as np

capture = cv2.VideoCapture(0)

while(True):
    ret, frame = capture.read()
    gray =cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    threshold = 255/2
    ret, img_thresh = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY_INV)
    contours, hierarchy = cv2.findContours(img_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(frame, contours, -1, (0,255,0), 1)
    cv2.imshow("title",frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

capture.release()
cv2.destroyAllWindows()

出力される結果

#contoursの中身を確認
contours

#contoursの中身
array([[[141,  39]],
 
        [[139,  41]],
 
        [[139,  95]],
 
        [[140,  96]],
 
        [[140,  97]],
 
        [[139,  98]],
 
        [[139, 106]], ~多数


#contoursの中身を撮影画像と重ねて可視化
import matplotlib.pyplot as plt
%matplotlib qt5
cv2.drawContours(frame, contours, -1, (0,255,255))
plt.imshow(frame)

###可視化結果 webカメラで撮影した画像にcontoursを描画。四角の縁すべてを読み取っている?
Figure_1.png

1

1Answer

Comments

  1. @dechio

    Questioner
    回答頂きありがとうございます。
    御礼が遅くなり失礼しました。

    処理が必要になるのですね。
    少し考えてみます。

    また、ハリスコーナー検出などの方法も試してうまくいったら記事にしようと思います。

    重ね重ねになりますが反応頂きありがとうございました。

Your answer might help someone💌