質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1886閲覧

外接矩形の座標取りと2点間の距離からの矩形幅の指定

uriuri

総合スコア47

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/08/24 09:15

認識したいものを外接矩形で検出しその際、余計なものを検出した際矩形幅で判断してあげたいと思っています。
ここでは白い線だけを検出したいと思っています。
回転の考慮した外接矩形の4点を取得し、そのうちの2点を用いて矩形幅を計算したのですが認識する物体の角度によって4点の座標の位置がバラバラになってしまいます。
座標がバラバラでも対応できるように2通りの計算方法で幅の値を出しました。
幅の値がいくつも出たりしてうまくいきません。
条件文を用いて、矩形幅のしきい値で指定する方法に手こずっています。

python

1import cv2 2import math 3import numpy as np 4 5img_src = cv2.imread("image.ppm") 6gauss = cv2.GaussianBlur(img_src,(11,11),0)#9,9 7gray = cv2.cvtColor(gauss,cv2.COLOR_BGR2GRAY) 8#dst = cv2.fastNlMeansDenoising(gray,None,10,10,7,21) 9ret,th1 = cv2.threshold(gray,200,255,cv2.THRESH_BINARY) 10#th1 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ 11# cv2.THRESH_BINARY,25,10) 12 13edges = cv2.Canny(th1,50,150)#(100,150) 14 15img, contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) 16if len(contours) > 0: 17 for i in range(0, len(contours)): 18 19 cnt = contours[i] 20 M = cv2.moments(cnt) 21 #print(M) 22 area = cv2.contourArea(cnt) 23 print(area) 24 if 500 < area < 5000: 25 26 rect = cv2.minAreaRect(contours[i]) 27 box = cv2.boxPoints(rect) 28 #print(box) 29 box = np.int0(box) 30 x1,x2,x3,x4 = np.int0(box) 31 a = np.array(x1) 32 b = np.array(x2) 33 c = np.array(x3) 34 d = np.array(x4) 35 #d = math.sqrt((x4-x1)** 2) 36 I = np.linalg.norm(c-b) 37 J = np.linalg.norm(d-c) 38 print(x1,x2,x3,x4) 39 print(I) 40 print(J) 41 #print(box) 42 im = cv2.drawContours(img_src,[box],0,(0,255,0),2) 43 44cv2.imshow('src', img_src) 45cv2.imshow("1", th1) 46cv2.imshow("2", edges) 47cv2.waitKey() 48cv2.destroyAllWindows() 49

イメージ説明
イメージ説明

イメージ説明
イメージ説明
<1枚目>
(①)
1194.5 (矩形面積)
[319 19] [222 19] [222 0] [319 0] (4点の座標)
19.0
97.0
20.5

(②)
2548.5
[318 117] [42 51] [45 39] [321 105]
12.3693168769
283.781606169

<2枚目>
(①)
1877.0
[ 0 39] [-2 10] [173 -5] [175 23]
175.641680703
28.0713376952

(②)
1487.0
[ 0 70] [-1 61] [268 1] [270 10]
275.610232031
9.21954445729
2.5
33.0
0.0

4点の座標の開始位置の固定方法や矩形幅の求め方など、なにか良い方法があれば教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

【4点{a,b,c,d}があって,それらが長方形の頂点であることはわかっているが,並び順がわからない】という話でしょうか?

長方形の頂点であることが確定しているのであれば,例えば
aとb, aとc, aとd の3つの距離を求めれば

  • 一番長いやつは対角線
  • あとの二つが,長辺と短辺

に対応する距離だと思いますが,それだと不十分でしょうか.

投稿2018/08/27 01:13

fana

総合スコア11654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uriuri

2018/08/27 10:09

ありがとうございます 実際に試してみたいと思います
guest

0

https://www.jaist.ac.jp/~uehara/course/2014/i481f/pdf/ppt-2.pdf

4点を凸になるように結びたいということでしょうか。

投稿2018/08/24 13:01

編集2018/08/24 13:02
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uriuri

2018/08/27 00:47

白線と対象物ではないものとの区別に幅の範囲で見分けようと思っています しかし幅を求める計算の際に、座標をa、b、c、dにした際aとbを用いた2点間の距離をおこなうと物体の角度により1枚目では[319 19] [222 19] [222 0] [319 0] 2枚目では[ 0 39] [-2 10] [173 -5] [175 23] この場合1枚目は幅ではなく横の長さを求めることになってしまいます 2枚目は幅を求めることができます 座標位置の開始点が一定ではないのでこのような場合の幅の求め方を教えていただきたいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問