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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

855閲覧

直線間の角度が30度以上の組み合わせの交点の導出

waesrd

総合スコア7

OpenCV

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2019/12/10 09:22

前提・実現したいこと

Hough変換で検出した直線の交点を検出したいです.
今回は余分な交点を検出しないように,直線間の角度が30度以上の組み合わせについて扱いたいです.

###試したこと
houghLines関数,houghLinesP関数を使っていますが,
理想を言えば最小距離を設定できる後者のhoughLinesP関数を用いて検出を行いたいです.

houghLines関数

この場合の原点から距離rと角度θが出力となり,r=xcosθ+ysinθから
y=(-cosθ/sinθ)x+(r/sinθ)
で直線が表現できます.

houghLinesP関数

この場合検出される線分の始点(x1,y1),終点(x2,y2)が出力され
y=((y1-y2)/(x1-x2))x+y2-((y1-y2)/(x1-x2))x2
で直線が表現できます.

今回javaを用いて交点を上記の条件で達成したく,(30°は考慮できていません!)
それぞれの交点を求めて,出力しました.

houghLines関数

java

1// Standard Hough Line Transform 2Imgproc.HoughLines(canny, lines, 1, Math.PI/360, 150); // runs the actual detection 3// Draw the lines,Find intersection 4for (int x = 0; x < lines.rows(); x++){ 5 double rho1 = lines.get(x, 0)[0], 6 theta1 = lines.get(x, 0)[1]; 7 double c1 = Math.cos(theta1), s1 = Math.sin(theta1); 8 double x0 = c1*rho1, y0 = s1*rho1; 9 Point pt1 = new Point(Math.round(x0 + 1000*(-s1)), Math.round(y0 + 1000*(c1))); 10 Point pt2 = new Point(Math.round(x0 - 1000*(-s1)), Math.round(y0 - 1000*(c1))); 11 12Imgproc.line(cdst, pt1, pt2, new Scalar(0, 0, 255), 1, Imgproc.LINE_AA, 0); 13 for(int y = 0; y < lines.rows(); y++) { 14 double rho2 = lines.get(y, 0)[0], 15 theta2 = lines.get(y, 0)[1]; 16 double c2=Math.cos(theta2),s2=Math.sin(theta2); 17 if((s1!=s2) && (c1!=c2)) { 18 double pt_x=(rho2*(s1*s2*s2+s1*c2*c2)-rho1*(c1*c1*s2+s1*s1*s2))/(s1*c2-c1*s2); 19 double pt_y=(rho1*(s1*s1*c2+c1*c2*c2)-rho2*(s2*s2*c1+c1*c2*c2))/(s1*c2-c1*s2); 20 21Imgproc.line(dst01, pt1, pt2, new Scalar(0, 0, 255), 1, Imgproc.LINE_AA, 0); 22Imgproc.circle(dst01,new Point(pt_x,pt_y),8,new Scalar(0,255,0),2); 23 }else{} 24 } 25}

houghLinesP関数

java

1// Probabilistic Line Transform 2Imgproc.HoughLinesP(canny, linesP, 1, Math.PI/360, 50, 100, 10); // runs the actual detection 3// Draw the lines 4 for(int x = 0; x < linesP.rows(); x++){ 5 for(int x1=0;x1<linesP.rows();x1++){ 6 double[] l = linesP.get(x, 0); 7 double[] m = linesP.get(x1,0); 8 double a=l[0]-l[2],b=l[1]-l[3],c=m[0]-m[2],d=m[1]-m[3],e=m[3]-l[3],f=m[2]-l[2]; 9 double A=b/a, B=l[3]-(b/a)*l[2], Ad=d/c, Bd=m[3]-(d/c)*m[2]; 10////////////////////////////////////////////////////////////////////////////// 11/* a=x1-x2, b=y1-y2, c=x1'-x2', d=y1'-y2', e=y2'-y2, f=x2'-x2 12* 傾き1:A, 傾き2:A', 切片1:B, 切片2:B' */ 13////////////////////////////////////////////////////////////////////////////// 14 if(Math.abs(A-Ad)< 0.05 || Math.abs(B-Bd)<20.0){ 15 l[0]= m[0];l[1]= m[1];l[2]= m[2];l[3]= m[3]; 16 17a=l[0]-l[2];b=l[1]-l[3];c=m[0]-m[2];d=m[1]-m[3];e=m[3]-l[3];f=m[2]-l[2]; 18A=b/a; B=l[3]-(b/a)*l[2]; Ad=d/c; Bd=m[3]-(d/c)*m[2]; 19 } 20 21Imgproc.line(cdstP, new Point(l[0], l[1]), new Point(l[2], l[3]), new Scalar(0, 0, 255), 1, Imgproc.LINE_AA, 0); 22 23 if((x!=x1)&&((b/a)!=(d/c))){ 24    double pt_x1=(a*c*e+l[2]*b*c-m[2]*a*d)/(b*c-a*d), 25   pt_y1=(b*d*f+l[3]*a*d-m[3]*b*c)/(a*d-b*c); 26Imgproc.line(dst02, new Point(l[0], l[1]), new Point(l[2], l[3]), new Scalar(0, 0, 255), 1, Imgproc.LINE_AA, 0); 27Imgproc.circle(dst02,new Point(pt_x1,pt_y1),8,new Scalar(0,255,0),2); 28 }else {} 29 } 30}

聞きたいこと

とても初歩的な質問になってしまうかもしれないのですが,
直線間の角度が30度以上の組み合わせのみの交点を考慮したい場合
どのようなプログラムを作ればよいでしょうか?
お願いします.

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

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

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

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

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

guest

回答1

0

ベストアンサー

houghLinesの場合は直線の

角度θが出力

されているので自明であると思いますので,問題はhoughLinesPの側の場合でしょうか.

ベクトルの内積を考えて(おさらいして)みると良いでしょう.
2つのベクトル V1(X1,Y1) と V2(X2,Y2) の内積は,

  1. X1X2 + Y1Y2 であり,
  2. また,|V1||V2|cosΘ です.

|V1|はV1の長さ,|V2|はV2の長さ,ΘはV1とV2とが成す角度です.

  • V1をある直線に沿う方向を向いたベクトル
  • V2を別の直線に沿う方向を向いたベクトル

として与えれば,上記の 1.=2. という関係から,2本の直線の成す角を知ることができます.

投稿2019/12/10 10:24

fana

総合スコア11660

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

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

waesrd

2019/12/11 07:57

なるほど,ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問