web-dev-qa-db-ja.com

Opencv3のLineSegmentDetectorとPython

Opencv 3.0とpythonでLSDを実装するためのサンプル実装コードまたはポインターを提供できますか? HoughLinesとHoughLinesPはpythonで望ましい結果を出していないので、pythonでLSDをテストしたいのですが、どこにも行きません。

私は次のことを試みました:

LSD=cv2.createLineSegmentDetector(0) lines_std=LSD.detect(mixChl) LSD.drawSegments(mask,lines_std)

ただし、マスクに線を引くと、次のエラーが発生します。LSD.drawSegments(mask、lines_std)TypeError:線は数値タプルではありません

誰かがこれを手伝ってくれませんか?前もって感謝します。

8
user1996684

次のようなcv2.drawSegments関数を使用できます。

#Read gray image
img = cv2.imread("test.png",0)

#Create default parametrization LSD
lsd = cv2.createLineSegmentDetector(0)

#Detect lines in the image
lines = lsd.detect(img)[0] #Position 0 of the returned Tuple are the detected lines

#Draw detected lines in the image
drawn_img = lsd.drawSegments(img,lines)

#Show image
cv2.imshow("LSD",drawn_img )
cv2.waitKey(0)

OpenCV ドキュメント を確認できます。

11
Flayn

OpenCV3.2.0で次のように線を引くことができました。

lsd = cv2.createLineSegmentDetector(0)
dlines = lsd.detect(gray_image)
  for dline in dlines[0]:
    x0 = int(round(dline[0][0]))
    y0 = int(round(dline[0][1]))
    x1 = int(round(dline[0][2]))
    y1 = int(round(dline[0][3]))
    cv2.line(mask, (x0, y0), (x1,y1), 255, 1, cv2.LINE_AA)

余分な[0]間接参照がすべてある理由はわかりませんが、それが座標を抽出するために必要なことのようです。

OpenCVの返品を開梱するとき、コンソールに印刷するだけで便利だと思いました。この場合、私はしました

print(dlines)

ネストされたすべての角かっこから、すべての理由と理由についてあまり心配することなく、解決策を見つけることができます。

私は以前、著者のソースからコンパイルしてctypesで呼び出したWindows DLLバージョンのLSDを使用していました。

4
R. Strickland

線を引くだけであれば、受け入れられた答えは問題なく機能します。ただし、線とその描画をより細かく制御したい場合は、線をループして、提案されているように個別に処理することができます。よりクリーンなバージョンは次のようになります。

mask = np.zeros((img.shape),np.uint8)
lsd = cv2.createLineSegmentDetector(0)
lines = lsd.detect(img)[0]
for l in lines:
    x0, y0, x1, y1 = l.flatten()
    //do whatever and plot using:
    cv2.line(mask, (x0, y0), (x1,y1), 255, 1, cv2.LINE_AA)
0