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

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

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

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

Java

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

アルゴリズム

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

Q&A

解決済

2回答

2793閲覧

opencvで検出した直線と描画した直線の交点を求めたい

tukim

総合スコア8

OpenCV

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

Java

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

アルゴリズム

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

0グッド

0クリップ

投稿2020/07/11 23:22

編集2020/07/13 05:28

前提・実現したいこと

opencvで検出した直線と描画した直線の交点を求めようと二つの直線のポインタを配列に入れて、それらを使って交点を計算し、表示したいのですが交点がない場合をうまく区別できていないため描画するときにエラーが起こってしまいます。交点のみをうまくとるにはどうしたらよいでしょうか。
お願いいたします。

該当のソースコード

java

1      //認識した直線の描画    2 Mat bmpmat2 = new Mat(); 3 Utils.bitmapToMat(bmp, bmpmat2); 4 double[] data2; 5 Point pt12 = new Point(); 6 Point pt22 = new Point(); 7 int rows2 = dst.rows(); 8 double[][] lineData = new double[4][rows2]; 9 for (int i = 0; i < rows2; i++) { 10 11 data2 = dst.get(i, 0); 12 pt12.x = data2[0]; 13 pt12.y = data2[1]; 14 pt22.x = data2[2]; 15 pt22.y = data2[3]; 16 Imgproc.line(bmpmat2, pt12, pt22, new Scalar(255, 0, 0), 1); 17 lineData[0][i] = pt12.x; 18 lineData[1][i] = pt12.y; 19 lineData[2][i] = pt22.x; 20 lineData[3][i] = pt22.y; 21 } 22 //垂線の描画 23 int rows =bmpmat.rows(); 24 int cols = bmpmat.cols(); 25 double[][] lineData2 = new double[4][rows2]; 26 for(int i=1 ; i<8 ; i++) { 27 28 Imgproc.line(bmpmat2, new Point(cols*i/8, 0), new Point(cols*i/8, rows), new Scalar(255, 0, 0), 1); 29 lineData[0][i-1] = cols*i/8; 30 lineData[1][i-1] = 0; 31 lineData[2][i-1] = cols*i/8; 32 lineData[3][i-1] = rows; 33 } 34 35 //交点の座標を求める 36 Point[] xpoint = new Point[8*rows2]; 37 int pcon=0; 38 double a1,a2,x1,x2,x3,x4,y1,y2,y3,y4,x,y; 39 40 for(int i=0 ; i<rows2 ; i++) { 41 x1=lineData[0][i]; 42 x2=lineData[2][i]; 43 y1=lineData[1][i]; 44 y2=lineData[3][i]; 45 46 for(int j=0 ; j<8 ; j++){ 47 48 x3=lineData2[0][j]; 49 x4=lineData2[2][j]; 50 y3=lineData2[1][j]; 51 y4=lineData2[3][j]; 52 a1 = (y2-y1)/(x2-x1); 53 a2 = (y4-y3)/(x4-x3); 54 55 x = (a1*x1-y1-a2*x3+y3)/(a1-a2); 56 y = (y2-y1)/(x2-x1)*(x-x1)+y1; 57 58 59 xpoint[pcon]=new Point(x,y); 60 } 61 } 62 63 64 Imgproc.circle(bmpmat2, xpoint[50],2,new Scalar(0,255,0),-1); 65

実行画面

![実行画面]
赤の横線と縦線の交点を求め五線譜の座標を求めようと思っています。
よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/13 02:30

一応 歌詞の掲載利用にも JASRAC 等の関係団体の許諾が必要になります。 著作権の失効している曲、もともとない曲等に差し替えましょう。
tukim

2020/07/13 05:30

ご指摘ありがとうございます。 そうですよね、失念していました。 違うものに変えておきます。 ありがとうございます。
guest

回答2

0

ベストアンサー

この話の場合,「縦線」と「横線」は直交していると見なせそうな題材に思えますので,
「横線」群の検出結果(と,必要なら「縦線」群の検出結果も)を用いて,
それぞれの線の方向を示すベクトルを決めてしまうと楽なのではないでしょうか.

すなわち,この「楽譜の上での縦横」を2軸とする"楽譜座標系"を定めて,
諸々の画像ピクセル座標系の値をその"楽譜座標系"での値に読み替えて
"楽譜座標系"の上で処理を行うと楽なのでは?と.

「座標軸に平行な縦線と横線」の交点なら,考えやすいでしょう.

投稿2020/07/12 02:00

fana

総合スコア11996

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

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

tukim

2020/07/12 21:30

回答ありがとうございます。自分の理解力の問題で申し訳ないのですが縦線横線のうちから二本選んでそれをx、y軸にするということであっていますか? また、横線群は Imgproc.HoughLinesP(bin, linesMat, 1d, Math.PI / 360d, 200, 200d, 23); で取得したもので https://qiita.com/Anadreline/items/4cf6e88c743a65b7da2c こちらを参考にしており、つながっていない多くの線のつながりなのですがどのようにベクトルを決めればよいのでしょうか。linesMatがベクトルなのはわかるのですがノイズもありうまくやる方法が分かりません。
fana

2020/07/13 01:10

提示画像を見る感じ,それほどノイズがどうとか,向きにバラつきがあるとかいう雰囲気にも見えないですし,また,パースが付いているとかそういう絵でもなさそうです. 赤色で示された横線群は相応に「五線に沿う,互いに平行な」形で得られているのだろうと思います. なので,横向き(五線に沿った)方向のベクトルというのは… 例えば,検出した横線群の中で「長いやつ」上位数本を選んでそれらの向きの平均とかで出してしまっても良いように思います. 縦方向のベクトルは… 画像の縦線の像を使わずとも,簡単に,「上記で求めた横方向ベクトルに垂直なベクトル」としてもOKかもしれません.
tukim

2020/09/17 15:33 編集

返信が遅れてしまい申し訳ございません。色々試していたところ別のエラーが出てしまい解決に手こずってしまいました。 分かりやすく説明していただきありがとうございます。 何とかうまくできそうです!ありがとうございます!
guest

0

(既存回答とは別の方向性の話なので,別回答として分けます)

横線群 と 縦線群 が検出されているとき…

元画像と同じサイズの画像バッファを2つ用意し,(どちらのバッファも全画素の画素値を0で初期化されているとして)

  • バッファ1には,横線群だけを(非0な画素値で)描画する
  • バッファ2には,縦線群だけを(↑と同じ画素値で)描画する

で,両者のANDを取れば,(精度は[pixel]レベルですが)交点だけが残ったマスクが作れます.

#線を描くときの幅は,少し太くしないと交点が取れない場合がある
#特定の線だけを描画して行えば,特定の線群の間の交点だけを見つけることも可能

投稿2020/07/13 01:20

fana

総合スコア11996

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

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

tukim

2020/08/23 06:54

}新しい画像バッファをつくるために BufferedImage img = new BufferedImage(120, 40, BufferedImage.TYPE_3BYTE_BGR); をしたのですが BufferedImageがエラーになってしまいインポートもできませんでした。今は使えないのでしょうか? またMatの初期化を http://ya-yuki.hatenablog.com/entry/2015/06/04/190000 を参考に書こうと思ったのですがinit.data[y * init.cols + x] = 0; のjavaでのMat操作が分かりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問