1. ホーム
  2. python

[解決済み] OpenCV houghLinesP パラメータ

2022-02-05 03:40:27

質問内容

PythonのOpenCVでHoughLinesPを使って、この画像のチェス盤上の線を見つけるのに苦労しています。

HoughLinesPのパラメータを理解するために、以下のコードを思いつきました。

import numpy as np
import cv2
from matplotlib import pyplot as plt
from matplotlib import image as image

I = image.imread('chess.jpg') 
G = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY)

# Canny Edge Detection:
Threshold1 = 150;
Threshold2 = 350;
FilterSize = 5
E = cv2.Canny(G, Threshold1, Threshold2, FilterSize)

Rres = 1
Thetares = 1*np.pi/180
Threshold = 1
minLineLength = 1
maxLineGap = 100
lines = cv2.HoughLinesP(E,Rres,Thetares,Threshold,minLineLength,maxLineGap)
N = lines.shape[0]
for i in range(N):
    x1 = lines[i][0][0]
    y1 = lines[i][0][1]    
    x2 = lines[i][0][2]
    y2 = lines[i][0][3]    
    cv2.line(I,(x1,y1),(x2,y2),(255,0,0),2)

plt.figure(),plt.imshow(I),plt.title('Hough Lines'),plt.axis('off')
plt.show()

私が抱えている問題は、これが1行しか拾わないということです。maxLineGapを1に減らすと、数千行をピックアップします。

この理由は理解できますが、これらすべての共線がマージされるようにするには、どのように適切なパラメータセットを選択すればよいのでしょうか?何か見落としているのでしょうか?

この関数の動作例として使うので、コードはシンプルにしたいのですが。

よろしくお願いします。

更新:これはHoughLinesで完全に動作します。

また、Cannyが正常に動作しているので、エッジ検出の問題はないようです。

しかし、私はまだHoughLinesPを動作させる必要があります。何かいいアイデアはないでしょうか?

画像はこちら 結果

解決方法

OK、やっと問題を見つけたので、この問題で頭がおかしくなった人のために解決策を共有しようと思います。問題は、HoughLinesP関数の中に、"ines"という追加のパラメータがあり、関数の出力が同じであるため、冗長になっていることです。

cv2.HoughLinesP(image, rho, theta, threshold[, ライン [, minLineLength[, maxLineGap]]])

これでは、パラメータを読み込む順番を間違えてしまい、問題が発生します。パラメータの順番の混乱を避けるために、最も簡単な解決策は、関数内で次のようにパラメータを指定することです。

lines = cv2.HoughLinesP(E,rho = 1,theta = 1*np.pi/180,threshold = 100,minLineLength = 100,maxLineGap = 50)

これは私の問題を完全に解決し、他の人の助けになることを願っています。