質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

2049閲覧

Python OpenCV 直線検出のプログラムでループ処理を行った場合の直線の描画

mairam

総合スコア5

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/02/01 08:29

前提・実現したいこと

http://rikoubou.hatenablog.com/entry/2019/04/03/163751
の直線検出プログラムをもとに, 閾値(threshold)をループ処理して最後のループの直線のみを描画したいです.

発生している問題

threshold値35~70全てのループの直線を描画してしまう状態です. (イメージとしては紙に絵の具で何本も線を書いて, さらにその上から同じ色の絵の具で別の線を描くような感覚です.) つまり最後のループの直線のみを描画するか, threshold値35で描画した直線をthreshold値36になったときに一度消す方法があれば教えていただけたら幸いです. (画像ごとに閾値が自動で変わる, つまりループがどの閾値で終わるかわからないというプログラムを想定しているので, 初めから閾値を70にして直線を描画するという方法は無しでお願いします.)

該当のソースコード

Python

1import numpy as np 2import cv2 3 4IMAGE_PATH = "./test.jpg" # 読み込む画像 5 6Z = 34 # threshold(閾値)の初期値 7 8def main(): 9 image = cv2.imread(IMAGE_PATH) # 画像読み込み 10 image2 = cv2.imread(IMAGE_PATH) # 画像読み込み 11 gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) # グレースケール化 12 outLineImage = cv2.Canny(gray, 220, 250, apertureSize = 3) # 輪郭線抽出 13 14 cv2.imwrite("./outLine.png", outLineImage) # ファイル保存 15 16 hough = hough_lines(image, outLineImage) # ハフ変換による直線抽出 17 cv2.imwrite("./result_hough.png", image) # ファイル保存 18 19 20# ハフ変換で直線を抽出する関数 21def hough_lines(image, outLineImage): 22 while True: 23 global Z 24 Z += 1 25    result = image 26   lines = cv2.HoughLines(outLineImage, rho=1, theta=np.pi/180, threshold=Z) # ハフ変換で直線抽出 27   print("hough_lines: ", len(lines)) 28 29   for line in lines: 30   rho, theta = line[0] 31   a = np.cos(theta) 32   b = np.sin(theta) 33   x0 = a*rho 34   y0 = b*rho 35   x1 = int(x0 + 1000*(-b)) 36   y1 = int(y0 + 1000*(a)) 37   x2 = int(x0 - 1000*(-b)) 38   y2 = int(y0 - 1000*(a)) 39 40 cv2.line(result,(x1,y1),(x2,y2),(0,0,255),2) # 赤色で直線を引く 41 42  if threshold < 71 43     break # 閾値が適正値になったので終了 44   45  lines = np.zeros_like(lines) # linesの初期化 46 47 return result 48 49if __name__ == '__main__': 50 main()

補足情報(FW/ツールのバージョンなど)

Python3.7, OpenCV4.1.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/02/01 09:31

リンクは「リンクの挿入」で記入してください。
can110

2020/02/01 16:39

提示コードにはインデントに全角空白がふくまれているようです。 また「if threshold < 71」にて「:」がないため文法エラーになります。 第三者が実行できるようにコードを修正ください。
guest

回答1

0

閾値を変えるごとに,線を描画しているバッファを適切に初期化すればよいだけではないでしょうか.
(元絵の上に線を描いたような結果が欲しいならば,最も簡単には,毎度Matをcloneして描画バッファを用意すればよいのでは)


あと,質問内容とは無関係ですが,HoughLinesへの入力画像は,
"8-bit, single-channel binary source image. The image may be modified by the function. "
とされているので,そのようなループで処理するのはまずい予感.

投稿2020/02/03 10:00

編集2020/02/03 10:05
fana

総合スコア11645

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問