🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

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

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

3894閲覧

複数の直線から交点検出を行いたい

junaa

総合スコア9

OpenCV

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

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2019/12/04 08:37

編集2019/12/11 10:34

前提・実現したいこと

javaで,複数の直線から交点を検出し,より多くの交点が検出された部分を認識させるプログラムを作成したいです.

今行っていること

現在,取り込んだ画像をCanny処理し,Hough変換をすることにより,
直線検出しました.
以下にコードを記します.

java

1public class HoughClass { 2 static{ 3 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 4 } 5 6 public static void main(String[] args) { 7 8 Mat src = new Mat();//SourceMat 9 Mat cdst= new Mat();//CannyDestinationMat 10 Mat cdstP= new Mat();//CannyColorDestinationMat 11 Mat gray= new Mat();//GrayMat 12 Mat canny=new Mat();//CannyEdgeMat 13 14 Mat lines= new Mat();//HoughlineMat 15 Mat linesP= new Mat();//HoughlinePMat 16 17 src = Imgcodecs.imread(path_in);//read image 18 19 //Check Input-Image 20 if(src.empty()) { 21 System.out.println("Error opening image!"); 22 System.exit(-1); 23 } 24 25 //ToGray 26 Imgproc.cvtColor(src,gray,Imgproc.COLOR_RGB2GRAY); 27 28 // Edge detection 29 Imgproc.Canny(gray, canny, 10, 50); 30 31 //Copy edges to the images that will display the results in BGR 32 Imgproc.cvtColor(canny, cdst, Imgproc.COLOR_GRAY2BGR); 33 cdstP= cdst.clone(); 34 35 // Standard Hough Line Transform 36 Imgproc.HoughLines(canny, lines, 1, Math.PI/360, 150); // runs the actual detection 37 // Draw the lines 38 for (int x = 0; x < lines.rows(); x++) { 39 double rho = lines.get(x, 0)[0], 40 theta = lines.get(x, 0)[1]; 41 double a = Math.cos(theta), b = Math.sin(theta); 42 double x0 = a*rho, y0 = b*rho; 43 Point pt1 = new Point(Math.round(x0 + 1000*(-b)), Math.round(y0 + 1000*(a))); 44 Point pt2 = new Point(Math.round(x0 - 1000*(-b)), Math.round(y0 - 1000*(a))); 45 Imgproc.line(cdst, pt1, pt2, new Scalar(0, 0, 255), 1, Imgproc.LINE_AA, 0); 46 } 47 48 // Probabilistic Line Transform 49 Imgproc.HoughLinesP(canny, linesP, 1, Math.PI/360, 50, 60, 10); // runs the actual detection 50 // Draw the lines 51 for (int x = 0; x < linesP.rows(); x++) { 52 double[] l = linesP.get(x, 0); 53 Imgproc.line(cdstP, new Point(l[0], l[1]), new Point(l[2], l[3]), new Scalar(0, 0, 255), 1, Imgproc.LINE_AA, 0); 54 } 55 } 56}

ここから行いたいこと

複数の直線が検出されましたが,交点検出には至っていません.
調べたところ,2つの直線の交点を求める記事はありましたが,
複数の直線の場合どうすればよいでしょうか?
ご教授願います.

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

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

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

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

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

fana

2019/12/04 09:27

例えばこの画像の例の場合だと,どんな結果(どこ?)を得たいのでしょうか?
junaa

2019/12/04 09:49

下の画像で赤線が3本交わっている部分を検出したいです.
pepperleaf

2019/12/04 11:32

> 赤線が3本交わっている部分 交点リストを作成し、それぞれの距離を求める? まずは、その辺から、初めては。
junaa

2019/12/05 10:21

近傍の線を消すの難航しています,,,汗 うまくいけば,交点の相関関係を調べていきたいと思います, ありがとうございます!
guest

回答2

0

ベストアンサー

処理の目的次第でアプローチが異なりそうですが,
想像するに,画像の赤線のように線が多重に出ていると面倒なんじゃないかなぁ(処理次第で,それが「重み」としてダイレクトに影響しそうなので)と思いますので,
「あの線とこの線とは近いから,この2本の線の交点は考えないものとする」みたいな判断をする必要があるんじゃないかと思います.
(ハフ空間のrの解像度を下げる等の手段で,最初から多重に出ることをある程度抑制するような工夫もできるかもしれません)

…で,複数の線が交わる位置を見つける方法ですが,例えば……

他の方が回答されているような総当たりな方法で,ただし「互いに近い」線のペアは無視するような形で,2本の線の交点を算出した時に【その交点との距離が閾値以内であって,且つ,その交点を計算した2本の線のどちらにも「近くない」線の本数】を数えて,最もこの数が多かった交点を結果とする

ような方法が考えられるのではないかと思います.

投稿2019/12/04 10:13

編集2019/12/04 10:15
fana

総合スコア11990

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

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

junaa

2019/12/05 02:57

なるほど,とても参考になります. ということは,交点が密集している箇所を交点を推定するということでしょうか?
fana

2019/12/05 03:08

そういう話になりますね. 前半側は「密集(≒個数)」を考える場合には,n重に出ている線をそのまま個別のn本として単純に扱うとまずいよね,という話です.
junaa

2019/12/05 08:05

なるほど,ありがとうございます. 試行錯誤してみます.
guest

0

複数の直線の場合どうすればよいでしょうか?

直線の配列で得られると思うので、全ての組み合わせで、それぞれ、交点を求めるしかないと思いますが、、、。

荒っぽく書けば、

for (int x = 0; x < lines.rows(); x++) {

を二重ループにして、

for (int x = 0; x < lines.rows(); x++) { for (int x1 = x; x1 < lines.rows(); x1++) { // ここで、x と x1の交点を求める (平行線に注意) } }

みたいにして。

投稿2019/12/04 09:23

pepperleaf

総合スコア6385

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

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

junaa

2019/12/05 02:51

そうですね!やってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問