2017-12-13 15 views
1

OpenCVで輪郭が与えられた場合、幅と高さをcv2.boundingRect(contour)で抽出できます。左の図に示すように、境界矩形の幅と高さを返します。OpenCvで指定された角度での輪郭の幅を測定

右の図に示すように、角度を指定すると、回転した境界の長方形の幅/高さを抽出できますか?

Contour illustration

私は移動物体の長さを測定しようとしているが、私は時々、水平線から45度までとすることができる移動方向の長さを測定する必要があります。

私はがcv2.minAreaRectcv2.boxPointsを使用して、境界矩形回転が、私は必要な回転は常に最小面積の長方形と一致しませんので、私は何とか角度を指定できるようにする必要がを得るための方法がある知っています。

私は回転した幅と高さの値だけを必要とします。回転した輪郭は必要ありません。

+2

オブジェクトを回転させ、再び境界を適用します。 'getRotationMatrix2D' – ldgorman

+0

なぜでしょうか。あなたは角度を持っていることをサポートして、2つの直交線を作ることができます。 ptsと各行の間の距離を計算し、次に 'max_dist - min_dict'を計算すると、幅と高さが得られます。 – Silencer

答えて

1

Why not. Support you have an angle, then you can make two orthogonality lines. Calculate the distance between pts and each line, then calc max_dist - min_dict, you will get width and height.

My mother language is Chineseではなく、私は英語のライティングが得意です。だから、僕は、コードにそれを回す:

#!/usr/bin/python3 
# 2017.12.13 22:50:16 CST 
# 2017.12.14 00:13:41 CST 
import numpy as np 

def calcPointsWH(pts, theta=0): 
    # 计算离散点在特定角度的长宽 
    # Measuring width of points at given angle 
    th = theta * np.pi /180 
    e = np.array([[np.cos(th), np.sin(th)]]).T 
    es = np.array([ 
    [np.cos(th), np.sin(th)], 
    [np.sin(th), np.cos(th)], 
    ]).T 
    dists = np.dot(pts,es) 
    wh = dists.max(axis=0) - dists.min(axis=0) 
    print("==> theta: {}\n{}".format(theta, wh)) 

は、テストのために、このダイヤモンドを与える:

enter image description here

pts = np.array([[100, 200],[200, 26],[300, 200],[200, 373]], np.int32) 
for theta in range(0,91, 30): 
    calcPointsWH(pts, theta) 


==> theta: 0 
[ 200. 347.] 
==> theta: 30 
[ 173.60254038 300.51081511] 
==> theta: 60 
[ 300.51081511 173.60254038] 
==> theta: 90 
[ 347. 200.] 

今では2017.12.14 00:20:55 CST、おやすみです。

+0

ありがとう、これは私が欲しかったのとまったく同じようです。私はあなたが実際にすべての仕事をするつもりはなかったが、とても感謝しています! :) –

1

使用

cv2.minAreaRect(cnt) 

ここでは、here完全な例と説明を見つけることができます。

編集:minAreaRectは実際に必要なものですが、向きの長方形から幅と高さを取る際の問題点は何ですか?私のコメントとして

+0

ありがとうございますが、これについて間違った考え方をしていない限り、最小の四角形が常に移動方向に「直面」するとは限りません。たとえば、@ Silencerのダイヤモンドの場合、最小囲み矩形は一定ですが、移動方向は変わりません。 –

+0

この音が奇妙です。あなたのコードに何が起こっているのかのイメージの例を追加できますか? – Moia

+0

この100x100四角形を45度の角度で動かしてみましょう。https://i.imgur.com/PvHyHL6.png cv2.minAreaRectは正方形のように見える矩形を返します。それ?それは私に100の幅と100の高さを与えます。しかし、正方形が45度で動いているので、私は幅が約141度である45度にします。したがって、minAreaRectは動作しません(矩形、それは解決策かもしれないが、私は実際の回転を行うのを助ける必要があります:)) –

関連する問題