python
1import cv2 2import numpy as np 3import matplotlib.pyplot as plt 4from matplotlib.patches import Polygon 5 6#三角(赤) 7def find_rect_of_target_color1(image): 8 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 9 h = hsv[:, :, 0] 10 s = hsv[:, :, 1] 11 v = hsv[:, :, 2] 12 mask = np.zeros(h.shape, dtype=np.uint8) 13 mask[(h > 240) & (s > 100) & (v > 100)] = 251 14 #輪郭抽出 15 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 16 rects1 = [] 17 for contour in contours: 18 approx = cv2.convexHull(contour) 19 rect = cv2.boundingRect(approx) 20 rects1.append(np.array(rect)) 21 return rects1 22 23#半円(黄) 24def find_rect_of_target_color2(image): 25 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 26 h = hsv[:, :, 0] 27 s = hsv[:, :, 1] 28 v = hsv[:, :, 2] 29 mask = np.zeros(h.shape, dtype=np.uint8) 30 mask[((h > 20) & (h < 40)) & (s > 100) & (v > 200)] = 30 31 #輪郭抽出 32 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 33 rects2 = [] 34 for contour in contours: 35 approx = cv2.convexHull(contour) 36 rect = cv2.boundingRect(approx) 37 rects2.append(np.array(rect)) 38 return rects2 39 40if __name__ == "__main__": 41 img = cv2.imread('./sample.jpg') 42 43 #赤 44 rects1 = find_rect_of_target_color1(img) 45 if len(rects1) > 0: 46 rect = max(rects1, key=(lambda x: x[2] * x[3])) 47 cv2.rectangle(img, tuple(rect[0:2]), 48 tuple(rect[0:2] + rect[2:4]), (0, 0, 255), 2) 49 # B G R 50 #黄 51 rects2 = find_rect_of_target_color2(img) 52 if len(rects2) > 0: 53 rect = max(rects2, key=(lambda x: x[2] * x[3])) 54 cv2.rectangle(img, tuple(rect[0:2]), 55 tuple(rect[0:2] + rect[2:4]), (0, 255, 255), 2) 56 57cv2.imshow('findrect', img) 58k = cv2.waitKey(0) 59if k == ord('q'): 60 cv2.destroyAllWindows() 61
上記は画像をHSV変換して特定色の外接矩形を表示するプログラムになります。
表示した外接矩形の縦の長さと横の長さ、面積とアスペクト比を計算するコードを追加したいのですが、いまいちわかりません。
様々なサイトを参考にして実行してみましたがpython初心者なものでコンパイルエラーが多数出てしまいます。
どなたか解決方法がわかる方いらっしゃいましたらご教授願います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/08 06:13
2019/01/08 06:19 編集
2019/01/08 06:45