python
1import cv2 2import math 3import numpy as np 4 5img_src = cv2.imread("test.jpg") 6 7gauss = cv2.GaussianBlur(img_src, (11, 11), 0) 8gray = cv2.cvtColor(gauss, cv2.COLOR_BGR2GRAY) 9ret,th1 = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY) 10edges = cv2.Canny(th1, 50, 150) 11 12img, contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) 13for i in range(0, len(contours)): 14#for cnt in contours: 15 cnt = contours[i] 16 area = cv2.contourArea(cnt) 17 #print(area) 18 19 if 500 < area < 5000: 20 rect = cv2.minAreaRect(cnt) 21 box = cv2.boxPoints(rect) 22 23 (cx, cy), (width, height), angle = rect 24 diag = np.linalg.norm([width, height]) 25 #print(width, height, diag) 26 27 A = width 28 B = height 29 C = diag 30 31 if A < B: 32 min = A 33 else: 34 min = B 35 if C < min: 36 min = C 37 print("min", min) 38 if 5 < min < 25: 39 # 40 cv2.drawContours(img_src, [box.astype(int)], -1, (0, 255, 0), 2) 41 42def within(line, rect): 43 44 p1, p2 = tuple(line[:2]), tuple(line[2:]) 45 #print("p1",p1) 46 #print("p2",p2) 47 #print("line",line) 48 return cv2.pointPolygonTest(box, p1, False) >= 0 and \ 49 cv2.pointPolygonTest(box, p2, False) >= 0 50 51LSD = cv2.createLineSegmentDetector() 52lines, width, prec, nfa = LSD.detect(edges) 53if lines is not None: 54 lines = np.squeeze(lines,axis=1) 55 for line in lines: 56 p1, p2 = tuple(line[:2]), tuple(line[2:]) 57 print("line",line) 58 59 if within(line, rect): 60 61 cv2.line(img_src, p1, p2, (0, 0, 255), 2) 62 63 #else: 64 65 # cv2.line(img_src, p1, p2, (255, 0, 0), 2) 66 67 68 69cv2.imshow('src', img_src) 70cv2.waitKey() 71cv2.destroyAllWindows() 72
今回、上記の処理をカメラを用いてリアルタイムで処理したのですが、矩形検出と直線検出が別処理で行われてしまいました。
理想としては矩形内に直線が含まれていた時、認識したいものとして出力1を出すようなコードを目指しています
編集部分
python
1def contains_lines(rect, lines): 2 3 cnt = 0 4 for line in lines: 5 p1, p2 = tuple(line[:2]), tuple(line[2:]) 6 if cv2.pointPolygonTest(rect, p1, False) >= 0 and \ 7 cv2.pointPolygonTest(rect, p2, False) >= 0: 8 cnt += 1 9 10 return cnt == 2
テストに使った画像もUPすると話早いと思います
回答1件
あなたの回答
tips
プレビュー