HoughLinesPの引数調整ガイド|検出しすぎる・線が出ない時の見直し方
HoughLinesPの引数調整でまず見るべきポイント
HoughLinesPで思った通りに線が取れない時は、いきなり全部の引数を動かすより、検出しすぎているのか、線が足りないのか、文字やノイズを拾っているのかを分けて見ると調整しやすくなります。
この記事で分かること
この記事では、PythonのOpenCVで使う `HoughLinesP` の引数を実際に変えながら、線の検出結果がどう変わるかを整理します。
対象にしているのは、表の罫線のような直線を取りたいのに、文字の一部まで線として拾ってしまったり、反対に必要な線が出なかったりする場面です。
単に引数の意味を並べるのではなく、どの症状の時にどの引数を見るとよいかを、実験結果に沿ってまとめます。
`HoughLinesP` は引数の名前だけを見ると難しく感じますが、結果画像と並べて見ると、どの値がどんな失敗につながるのかが少しずつ見えてきます。
この記事では、理論を細かく追うよりも、まず「値を変えると見た目がどう変わるか」を優先して整理します。
そのうえで、実際に自分の画像へ当てはめる時に、どの順番で確認すると迷いにくいかもまとめます。
HoughLinesPは万能の固定値ではなく画像ごとに調整が必要
HoughLinesPは便利ですが、画像の大きさ、線の太さ、文字の量、前処理の状態によって結果がかなり変わります。
そのため、この記事で出てくる値は万能の正解ではなく、調整の方向をつかむための材料として見たほうが安全です。
特に表の罫線を取りたい場合は、線だけでなく文字の縦棒や横棒も直線として見えてしまうため、検出結果が増えたから成功とは限りません。
たとえば、見た目では「たくさん線が取れている」ように見えても、実際には文字の一部や小さなノイズまで混ざっている場合があります。
後続処理で罫線だけを使いたい場合、このような余分な線はむしろ邪魔になります。
つまり、HoughLinesPの調整では「線を増やすこと」ではなく、「ほしい線を残して、不要な線を減らすこと」を目標にしたほうがよいです。
先に確認したい調整順
最初に見ると分かりやすいのは、`threshold`、`minLineLength`、`maxLineGap` の3つです。
`threshold` は線として採用する強さに関係し、`minLineLength` はどれくらいの長さを線とみなすかに関係します。
`maxLineGap` は途切れた線をどこまでつなげるかに関係するため、文字やノイズを拾いやすい時にも影響します。
`rho` と `theta` は検出の細かさに関係しますが、最初から大きく動かすと結果の見方が難しくなります。
まずは `threshold` で線の候補の多さを見て、次に `minLineLength` で短すぎる線を減らし、最後に `maxLineGap` で途切れの扱いを見ると整理しやすいです。
それでも狙った線が残らない場合に、`rho` や `theta` を動かして比較すると、どこで結果が変わったのかを追いやすくなります。
HoughLinesPを使う前提と6つの引数の役割
HoughLinesPを調整する前に、まず関数に渡している画像と6つの引数が何を担当しているのかをざっくり押さえておきます。
HoughLinesPで線を検出する基本の流れ
今回使う関数は、次の形です。
`lines = cv2.HoughLinesP(img, rho, theta, threshold, minLineLength, maxLineGap)`
`img` は判断対象の画像で、白黒の2値画像として扱う前提になります。
実際にはグレースケール化や二値化などの前処理をした後に、線として拾わせたい部分が目立つ状態にしておく必要があります。
前処理がうまくいっていないと、どれだけ引数を調整しても狙った線が安定しないことがあります。
線が薄い、文字が濃い、背景にノイズが多いといった状態では、HoughLinesPの引数だけで完全に整えるのは難しくなります。
HoughLinesPで画像から線を取得する基本手順を先に確認したい場合は、HoughLinesPで画像から線を取得する基本手順を見ると全体の流れをつかみやすいです。
rho・theta・threshold・minLineLength・maxLineGapの役割
`rho` は距離方向の扱いに関係する引数です。
`theta` は角度方向の扱いに関係する引数です。
`threshold` は線として採用するための強さや投票数のような基準として見ると、調整のイメージを持ちやすいです。
`minLineLength` は、どれくらいの長さ以上なら線として残すかに関係します。
`maxLineGap` は、途切れている点や線分をどこまで1本の線としてつなぐかに関係します。
この中で、実際の調整で変化が分かりやすいのは `threshold`、`minLineLength`、`maxLineGap` です。
`rho` と `theta` も重要ですが、画像や前処理の状態によって見え方が変わりやすく、最初に触ると何が原因で変わったのか分かりにくくなることがあります。
まずは役割を細かく暗記するより、どの引数が「線を減らす」「短い線を消す」「途切れた線をつなぐ」に関係するのかを覚えると扱いやすいです。
サンプル画像と今回の目的
今回のサンプル画像は、横313px、縦132pxの表画像です。
目的は、表の中にある罫線をできるだけ安定して取得することです。

ただし、この画像には英字や日本語の文字も入っているため、文字の直線部分まで線として拾われやすい条件になっています。
この条件があるからこそ、引数を少し変えただけで、線の出方やノイズの増え方が見えやすくなります。
表の罫線だけを取りたい場合、文字の一部が線として拾われると、後から縦線や横線を分ける処理でも迷いやすくなります。
そのため、今回のような画像では、検出結果を見ながら「罫線が残っているか」と「文字由来の線が増えていないか」を両方確認する必要があります。
thetaを変えると線の検出結果はどう変わるか
`theta` は角度方向に関係する引数なので、値を変えると検出される線の向きや細かさの見え方が変わります。
thetaは角度方向の細かさに関係する引数
まずは `theta` だけを変えた時の結果を見ます。
ベースにした条件は次の形です。
`cv2.HoughLinesP(img, rho=1, theta=**, threshold=1, minLineLength=10, maxLineGap=0)`
`threshold=1` のようにかなり拾いやすい条件にしているため、線だけでなく文字の一部も反応しやすい状態です。
この状態でthetaを変えると、罫線だけでなく、文字の直線部分も一緒に変化して見えます。
そのため、thetaの比較では「線がたくさん出たか」だけではなく、「不要な線も増えていないか」を見る必要があります。
theta=10

theta=45

theta=90

theta=180

theta=360

thetaを変えた時に文字の直線部を拾いやすくなるケース
結果を見ると、表の罫線だけでなく、文字の一部も黄色い線として拾われています。
特に `threshold` が低い状態では、thetaだけを動かしても目的の罫線だけに絞るのは難しいです。
同じような長さに見える線でも拾われたり拾われなかったりするため、thetaの変更だけで安定させようとすると迷いやすくなります。
この結果から見ると、thetaは単独でノイズを消すための引数というより、角度方向の検出の仕方を調整する引数として見たほうがよさそうです。
文字が多い画像では、文字の縦線や横線も候補に入ってくるため、thetaだけで罫線と文字をきれいに分けるのは難しくなります。
罫線だけを残したい場合は、thetaを動かす前に、`threshold` や `minLineLength` で候補を絞るほうが分かりやすいです。
thetaを最初に大きく動かしすぎないほうがよい理由
thetaは重要な引数ですが、最初に大きく動かすと結果が散らばって見えやすいです。
今回のように文字を含む画像では、thetaより先に `threshold` や `minLineLength` を見直したほうが、どのノイズを減らしたいのか判断しやすくなります。
まずはthetaを固定し、他の引数で線の数や長さを整えてから、最後に必要なら微調整する流れが扱いやすいです。
thetaを先に大きく変えると、線が増えた理由が角度の影響なのか、もともと条件がゆるすぎた影響なのか分かりにくくなります。
そのため、初心者ほど最初はthetaを固定して、他の引数を1つずつ動かしたほうが比較しやすいです。
検出結果を確認する時は、毎回同じ画像と同じ前処理を使い、1回に変える引数をできるだけ少なくするのがポイントです。
thresholdを変えると検出しすぎ・検出不足が変わる
`threshold` は、線を拾いすぎる時にも、必要な線が出ない時にも最初に確認したい引数です。
thresholdは線として採用する強さに関係する
次は `threshold` を変えてみます。
ベースにした条件は次の形です。
`cv2.HoughLinesP(img, rho=1, theta=10, threshold=**, minLineLength=10, maxLineGap=0)`
thresholdは、線として採用するための基準に関係します。
値が小さいと候補を拾いやすくなり、値が大きいとより強い候補だけが残りやすくなります。
つまり、線が多すぎる時にも、線が少なすぎる時にも、最初に見直す価値がある引数です。
threshold=1

threshold=10

threshold=100

thresholdを上げるとノイズは減りやすいが線も消えやすい
thresholdを上げると、文字の一部のような弱い反応は減りやすくなります。
今回の画像でも、値を大きくすることで、文字よりも表の罫線が残りやすい方向に近づいています。
ただし、`threshold=1000` まで上げると線を認識しなくなったため、大きければよいという引数ではありません。
この結果から、thresholdは「不要な線を減らすために上げる」が、「上げすぎると必要な線まで消える」と考えると分かりやすいです。
特に薄い罫線や短い罫線を取りたい場合、thresholdを強くしすぎると、ほしい線まで消えてしまう可能性があります。
まずは小さめの値から少しずつ上げて、文字やノイズが減るポイントを探すのが扱いやすいです。
thresholdを下げると線は拾いやすいが文字やノイズも増えやすい
thresholdを下げると、線として採用される候補が増えやすくなります。
必要な線を拾いやすくなる一方で、文字の横棒や縦棒、画像の細かいノイズまで線として出てくることがあります。
検出結果が多すぎる時は、まずthresholdを少し上げて、不要な線が減るか確認するのが分かりやすいです。
反対に、ほしい罫線がまったく出ていない時は、thresholdを下げることで候補が出てくる場合があります。
ただし、下げすぎると一気に不要な線も増えるため、結果画像を見ながら少しずつ調整する必要があります。
線が出たかどうかだけでなく、残った線が本当に使いたい罫線かどうかを見ることが大切です。
threshold調整で失敗しやすい例
thresholdで失敗しやすいのは、線が増えたことだけを見て成功と判断することです。
本当に必要なのは、欲しい罫線が残り、文字やノイズが減っている状態です。
反対に、線が出ないからといってthresholdだけを下げ続けると、今度は不要な線が増えて見づらくなります。
もう1つの失敗は、thresholdだけで全部を解決しようとすることです。
短いノイズが残る場合は `minLineLength`、途切れた線の扱いが気になる場合は `maxLineGap` も一緒に確認したほうがよいです。
thresholdは調整の入口として便利ですが、最後は他の引数との組み合わせで判断する必要があります。
minLineLengthとmaxLineGapはセットで見る
`minLineLength` と `maxLineGap` は別々の引数ですが、実際の調整ではセットで見たほうが結果を理解しやすいです。
minLineLengthは短い線を拾うかどうかに関係する
`minLineLength` は、どれくらいの長さ以上を線として認識するかに関係します。
短くすると短い線も拾いやすくなりますが、文字の一部や小さなノイズも拾いやすくなります。
長くすると短いノイズは減りやすくなりますが、必要な短い罫線まで消える可能性があります。
たとえば表の横線や縦線が十分に長い場合は、`minLineLength` を少し長めにしても問題ないことがあります。
一方で、細かく分かれた罫線や短い区切り線を取りたい場合は、長くしすぎると目的の線が消えてしまいます。
この引数は、画像内で「ほしい線がどれくらいの長さなのか」を意識しながら決める必要があります。
maxLineGapは途切れた線をつなぐかどうかに関係する
`maxLineGap` は、少し途切れている線を1本の線として扱うかどうかに関係します。
値を大きくすると、途切れた罫線をつなげて拾いやすくなります。
ただし、大きくしすぎると、本来別の部分として見たい線や文字の一部までつながって見えることがあります。
表画像では、罫線が文字や背景の影響で少し途切れて見える場合があります。
このような場合は `maxLineGap` を少し上げることで、1本の線として拾いやすくなることがあります。
しかし、文字が多い画像では、文字の一部までつながってしまうこともあるため、上げすぎには注意が必要です。
minLineLengthとmaxLineGapを変えた比較
ここでは、`minLineLength` と `maxLineGap` を組み合わせて変えています。
ベースにした条件は次の形です。
`cv2.HoughLinesP(img, rho=1, theta=360, threshold=100, minLineLength=**, maxLineGap=**)`
`minLineLength` だけを見ても、`maxLineGap` だけを見ても、結果の変化を正しくつかみにくいことがあります。
短い線を許す設定にして、さらに離れた点をつなぎやすくすると、文字やノイズも線として残りやすくなります。
反対に、長い線だけを許して、ギャップも小さくすると、不要な線は減りやすい一方で、必要な罫線まで消えることがあります。
minLength=10,maxgGap=0

minLength=100,maxgGap=0

minLength=10,maxgGap=1

minLength=100,maxgGap=1

minLength=10,maxgGap=3

minLength=100,maxgGap=3

minLength=10,maxgGap=5

minLength=100,maxgGap=5

minLength=10,maxgGap=10

minLength=100,maxgGap=10
)
短い線長と大きいギャップで文字を拾いやすくなる理由
比較すると、`minLineLength` が小さく、`maxLineGap` が大きいほど、文字などのノイズを線として認識しやすくなっています。
これは短い線も候補に入り、さらに少し離れた部分までつながりやすくなるためです。
表の罫線を取りたい場合は、短い線を許しすぎないことと、離れた点をつなぎすぎないことの両方を見る必要があります。
文字の一部は、見た目では短い線の集まりになっていることがあります。
`minLineLength` が短いと、このような文字の一部も候補に入りやすくなります。
そこに `maxLineGap` の大きい設定が加わると、離れている線分までつながって、さらに線らしく見えてしまうことがあります。
縦線だけ・横線だけを取りたい場合の内部リンク導線
縦線だけを取りたい場合は、引数を調整するだけでなく、検出後の線の向きや座標を使って絞り込む考え方も必要になります。
その場合は、HoughLinesPで縦線だけを取得する実装例を合わせて見ると、引数調整後にどう線を分けるかを確認しやすいです。
横線だけを取りたい場合も同じで、引数だけで完全に分けようとせず、検出後の条件で絞るほうが考えやすいです。
横方向の線を取りたい場合は、HoughLinesPで横線だけを取得する実装例を見ると、用途別の使い方につなげやすいです。
特に表画像では、縦線と横線が同時に検出されることが多いため、HoughLinesPの結果をそのまま使うだけでは目的に合わないことがあります。
まずは引数で不要な線を減らし、その後に座標や角度で分類する流れにすると、縦線だけ、横線だけの処理へつなげやすくなります。
rhoはどこまで調整すべきか
`rho` は距離方向に関係する引数ですが、今回の実験では他の引数よりも結果の解釈が難しい印象でした。
rhoは距離方向の扱いに関係する引数
ここでは `rho` を変えながら、`minLineLength` も10と100で比較しています。
ベースにした条件は次の形です。
`cv2.HoughLinesP(img, rho=**, theta=360, threshold=100, minLineLength=10/100, maxLineGap=3)`
rhoは、線を検出する時の距離方向の解像度に関係する引数として見ると理解しやすいです。
ただし、実際の画像でどのような変化として現れるかは、他の引数や画像の状態にも左右されます。
そのため、rhoを動かす時は、同時に他の引数を大きく変えすぎないほうが比較しやすいです。
rho=1,minLength=10

rho=1,minLength=100

rho=5,minLength=10

rho=5,minLength=100

rhoを変えた時に対象記事で見えた傾向
rhoを大きくすると、文字などを区別せず線として認識しているように見える結果がありました。
特に `rho=5` や `rho=10` の一部では、表の罫線だけでなく、文字の周辺も大きく反応しています。
rho=10,minLength=10

rho=10,minLength=100
<線検出せず>
rho=100,minLength=10

rho=100,minLength=100
<線検出せず>
rho=1000,minLength=10

rho=1000,minLength=100
<線検出せず>
この結果だけを見ると、rhoを大きくしたから必ず良くなるとは言えません。
むしろ、文字を含む表画像では、rhoを大きくした時に余分な反応が目立つ場面もあります。
また、`minLineLength=100` のように長い線だけを残す条件と組み合わせると、線が検出されないケースも出ています。
rhoは最後の微調整として扱うと迷いにくい
今回の結果だけで見ると、まずは `rho=1` を基準にして、他の引数を先に調整するほうが迷いにくいです。
線が多すぎる、線が足りない、文字を拾うという症状は、`threshold`、`minLineLength`、`maxLineGap` のほうが切り分けやすいです。
rhoを動かすのは、他の引数で大まかな方向が決まった後の微調整として扱うと、結果の比較がしやすくなります。
特に初心者の場合、rhoを大きく変えながら同時にthresholdやminLineLengthも変えると、何が効いたのか分からなくなりやすいです。
まずはrhoを固定して、線の数、線の長さ、途切れの扱いを整えるほうが、結果画像を見比べやすくなります。
それでも思った線が残らない時に、rhoを少し動かして変化を見ると、試行錯誤の範囲を狭めやすくなります。
症状別に見るHoughLinesPの調整チェック
ここからは、実際につまずきやすい症状ごとに、どの引数を見直すとよいかを整理します。
線が多すぎる時に見るポイント
線が多すぎる時は、最初に不要な候補まで線として拾っていないかを確認します。
`threshold` が低すぎると候補が増えやすいため、少し上げて文字やノイズが減るかを見ると分かりやすいです。
それでも短い線が残る場合は、`minLineLength` を上げて、短いノイズを線として扱わない方向に調整します。
さらに、離れた線分までつながって見える場合は、`maxLineGap` が大きすぎないかも確認します。
線が多い時にありがちなのは、検出数が増えたことを良い結果だと思ってしまうことです。
しかし、表の罫線だけが必要な場合は、文字やノイズの線が増えるほど後処理が難しくなります。
必要な線が検出されない時に見るポイント
必要な線が検出されない時は、条件を厳しくしすぎていないかを見ます。
`threshold` を上げすぎている場合、線として採用される候補が減りすぎることがあります。
`minLineLength` が長すぎる場合、短い罫線や途中で切れた線が消えやすくなります。
途切れた罫線を1本の線として扱いたい場合は、`maxLineGap` を少し上げることで改善する可能性があります。
ただし、`maxLineGap` を上げすぎると不要な線までつながるため、結果画像を確認しながら少しずつ動かす必要があります。
線が出ない時は、HoughLinesPの引数だけでなく、二値化やエッジ抽出の段階で線が十分に残っているかも見直したほうがよいです。
文字やノイズを線として拾う時に見るポイント
文字やノイズを拾う時は、短い線を拾いすぎていないかを確認します。
`minLineLength` が短すぎると、文字の縦棒や横棒も線の候補になりやすいです。
`maxLineGap` が大きすぎると、離れた文字の一部や本来つながってほしくない部分まで線として見えることがあります。
この場合は、まず `minLineLength` を少し上げて、短い線を候補から外す方向で試します。
次に `maxLineGap` を小さくして、離れた点をつなげすぎていないかを見ます。
それでも文字が残る場合は、前処理で文字を弱める、罫線を強調する、検出後に角度や長さで絞るといった対策も考えます。
縦線・横線の用途別実装へ進む判断基準
縦線だけ、横線だけを取りたい場合は、HoughLinesPの引数だけで完全に解決しようとしないほうがよいです。
まずは線をある程度安定して検出し、その後に角度や座標の条件で縦線と横線を分ける流れが考えやすいです。
用途がはっきりしている場合は、対象記事で引数のクセをつかんだ後に、用途別の記事へ進むと理解しやすくなります。
たとえば縦線だけを取りたい場合は、検出された線のx座標や傾きを見て、縦方向に近いものだけを残す考え方があります。
横線だけを取りたい場合も、y座標や傾きを使って横方向に近いものを残す流れになります。
HoughLinesPの引数調整は、線を検出しやすくするための土台であり、最終的な用途別の分け方とは役割を分けて考えると整理しやすいです。
HoughLinesPの引数調整でよくある注意点
HoughLinesPの調整では、値を変えた結果だけを見るのではなく、画像側の条件や前処理の状態も合わせて確認することが大切です。
画像サイズや前処理によって最適値は変わる
同じ引数でも、画像サイズが違えば線の長さや間隔の意味が変わります。
線が太い画像、線が薄い画像、文字が多い画像では、同じ値でも結果が変わります。
そのため、この記事の値をそのまま使うより、自分の画像で少しずつ変えながら比較するほうが安全です。
たとえば、横幅が大きい画像では、同じ `minLineLength=100` でも短く感じることがあります。
反対に、小さい画像では `minLineLength=100` が長すぎて、必要な線まで消えることがあります。
値だけを見て判断するのではなく、画像の大きさに対してその値がどのくらいの意味を持つのかを見ることが大切です。
1つの引数だけで判断しない
HoughLinesPは複数の引数が同時に効くため、1つの値だけを変えて結論を出すと判断を誤りやすいです。
たとえば線が多すぎる時でも、`threshold` が低い場合と、`minLineLength` が短い場合と、`maxLineGap` が大きい場合では対処が違います。
まず症状を分けてから、影響しそうな引数を1つずつ動かすと結果を比較しやすくなります。
一度に複数の値を変えると、良くなった理由も悪くなった理由も分かりにくくなります。
比較する時は、変更前の画像と変更後の画像を残しておくと、どの引数が効いたのか見返しやすくなります。
今回のように画像を並べて確認すると、文字が増えたのか、罫線が残ったのか、線が消えたのかを判断しやすくなります。
検出結果が増えることを成功と見なさない
検出結果が増えると、一見うまく線を拾えているように見えます。
しかし、文字やノイズまで線として拾っているなら、後続処理ではかえって扱いにくくなります。
特に表の罫線を取りたい場合は、線の本数よりも、欲しい罫線が安定して残っているかを見たほうがよいです。
検出された線が多すぎると、縦線と横線を分ける処理や、線の交点を探す処理でも余計な候補が増えます。
結果として、後の処理で条件分岐が増えたり、不要な線を消すための処理が必要になったりします。
HoughLinesPの段階である程度ノイズを減らしておくと、後続処理もシンプルにしやすくなります。
この記事が向いている人・向いていない人
この記事は、PythonとOpenCVで線検出を試していて、HoughLinesPの引数調整に迷っている人に向いています。
表の罫線を取りたい人、文字まで線として拾ってしまう人、線が多すぎる原因を切り分けたい人にも向いています。
一方で、PythonやOpenCVのインストール方法だけを知りたい人、OCRそのものの精度改善を知りたい人には主題が少し違います。
また、HoughLinesP以外の線検出手法を比較したい場合も、この記事だけでは範囲が足りないかもしれません。
この記事では、あくまでHoughLinesPの引数をどう見ていくかに絞っています。
基本コード、縦線だけの抽出、横線だけの抽出は、関連する別記事と合わせて読むと流れをつかみやすくなります。
まとめ:HoughLinesPはthreshold・minLineLength・maxLineGapから整える
HoughLinesPの引数はどれも大切ですが、調整の入口としては `threshold`、`minLineLength`、`maxLineGap` を先に見ると整理しやすいです。
まず確認する引数の優先順位
検出結果が多すぎる時は、まず `threshold` を上げて不要な候補が減るか確認します。
短い線や文字を拾う時は、`minLineLength` を上げて短い候補を減らします。
途切れた線をつなぎたい時は `maxLineGap` を上げますが、上げすぎると不要な部分までつながる点に注意します。
`rho` と `theta` は、最初の大きな調整というより、他の引数で傾向を見た後に確認すると迷いにくいです。
まずは「線が多いのか」「線が足りないのか」「文字やノイズを拾っているのか」を分けると、調整する引数を選びやすくなります。
そのうえで、1つずつ値を変えて結果画像を比べると、自分の画像に合う設定を探しやすくなります。
今回の実験結果から残したい学び
今回の実験で分かりやすかったのは、値を大きくすればよいわけでも、小さくすればよいわけでもないという点です。
`threshold` は上げるとノイズが減りやすい一方で、上げすぎると線が消えます。
`minLineLength` と `maxLineGap` は組み合わせで効くため、短い線を許しすぎたり、離れた点をつなぎすぎたりすると文字を拾いやすくなります。
`theta` や `rho` も結果に影響しますが、最初に大きく動かすと比較が難しくなります。
今回のような文字を含む表画像では、まず候補の多さ、線の長さ、途切れの扱いを整えるほうが、罫線だけを残す方向へ進めやすいです。
実際に値を振って画像を並べて見ると、どの引数がどの失敗につながりやすいかが分かりやすくなります。
関連記事から次に確認できること
まず線を取る基本コードを確認し、次に引数ごとのクセを見て、最後に縦線や横線など用途別の実装へ進むと理解しやすいです。
この記事では引数の感度と調整の考え方を扱い、基本コードや用途別の取り方は別記事で役割を分けています。
HoughLinesPは画像ごとに結果が変わるため、最終的には自分の画像で値を少しずつ変え、欲しい線だけが残る条件を探すのが近道です。
線が検出できない時は、引数だけでなく、前処理後の画像に線がしっかり残っているかも確認すると原因を切り分けやすくなります。
線が多すぎる時は、検出結果の本数ではなく、使いたい線だけが残っているかを基準に見ます。
この流れで確認していくと、HoughLinesPの引数調整で迷う場面を減らしやすくなります。