私は最近ハフ変換を学んでおり、それらがどのように機能するかをよく理解していると思いますが、確率的ハフ変換で問題に遭遇しました。セグメントを返すことになっていることは知っていますが、返されたセグメントのいくつかが明らかに同じ行に属していることは問題です。以下のコードは、主に OpenCV Python チュートリアルからのもので、いくつか編集されています。
入力と出力に見られるように、同じ行のいくつかのセグメントが表示されます。プログラムのパラメーター (キャニー オプション、行の長さ、行の間隔、解像度、しきい値) を微調整しようと努力を尽くしましたが、何を試しても、接続された行を取得できないようです。ハフ変換がビニングまたは投票システムを使用していることは知っていますが、それを誤解しているか、間違って使用しています。私には、ビニングはほぼ同じローとシータを持つラインを取り、それらをグループ化して、ラインをマージする必要があるようです。
基本的にそれが私がやりたいことのすべてです: 最小 x,y と最大 x,y を保持して、マージする必要があるセグメントをマージできるようにします (ビンまたはパーセントの差によって決定されます)。押し続ければ、複雑な方法を見つけることができるかもしれませんが、この問題を解決するための簡単でより良い方法はありますか?
これが再投稿である場合は申し訳ありません。オンラインで他のリソースを見つけようとしましたが、ほとんどの質問はハフ変換のこの側面に対処していませんでした.
import cv2
import numpy as np
import math
from matplotlib import pyplot as plt
img = cv2.imread('hough_test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(img,50,200,apertureSize = 3)
minLineLength = 250
#maximum allowed distance bewteen two points on a line to count them as connected
maxLineGap = 10
#will return several segments of the same line
lines = cv2.HoughLinesP(edges,1,np.pi/180,80,minLineLength,maxLineGap)
edges=np.dstack((edges,edges,edges))
i=0
theta = np.zeros(lines.shape[0])
for x1,y1,x2,y2 in lines[:,0]:
theta[i] = math.atan2(y2-y1,x2-x1)
cv2.line(edges,(x1,y1),(x2,y2),(0,0,255),2)
i+=1
print sorted(theta)
plt.show()
cv2.namedWindow('frame',0)
cv2.imshow('frame',edges)
cv2.namedWindow('frame1',0)
cv2.imshow('frame1',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
入力イメージと出力イメージは次のとおりです。