前提・実現したいこと
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