前提・実現したいこと
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度以上の組み合わせのみの交点を考慮したい場合
どのようなプログラムを作ればよいでしょうか?
お願いします.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/11 07:57