python
1import cv2 2import numpy as np 3import matplotlib.pyplot as plt 4from matplotlib.patches import Polygon 5 6#赤 7def find_rect_of_target_color(image): 8 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 9 h = hsv[:, :, 0] 10 s = hsv[:, :, 1] 11 mask = np.zeros(h.shape, dtype=np.uint8) 12 mask[(h == 60) & (s == 255)] = 255 13 #輪郭抽出 14 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 15 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_color(image): 25 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 26 h = hsv[:, :, 0] 27 s = hsv[:, :, 1] 28 mask = np.zeros(h.shape, dtype=np.uint8) 29 mask[(h == 60) & (s == 225)] = 42 30 #輪郭抽出 31 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 32 rects2 = [] 33 for contour in contours: 34 approx = cv2.convexHull(contour) 35 rect = cv2.boundingRect(approx) 36 rects2.append(np.array(rect)) 37 return rects2 38 39#青 40def find_rect_of_target_color(image): 41 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 42 h = hsv[:, :, 0] 43 s = hsv[:, :, 1] 44 mask = np.zeros(h.shape, dtype=np.uint8) 45 mask[((h > 220) | (h < 260)) & (s > 150)] = 255 46 #輪郭抽出 47 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 48 rects3 = [] 49 for contour in contours: 50 approx = cv2.convexHull(contour) 51 rect = cv2.boundingRect(approx) 52 rects3.append(np.array(rect)) 53 return rects3 54 55#緑 56def find_rect_of_target_color(image): 57 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 58 h = hsv[:, :, 0] 59 s = hsv[:, :, 1] 60 mask = np.zeros(h.shape, dtype=np.uint8) 61 mask[((h > 100) | (h < 140)) & (s > 150)] = 85 62 #輪郭抽出 63 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 64 rects4 = [] 65 for contour in contours: 66 approx = cv2.convexHull(contour) 67 rect = cv2.boundingRect(approx) 68 rects4.append(np.array(rect)) 69 return rects4 70 71if __name__ == "__main__": 72 img = cv2.imread('./sample.jpg') 73 74 #赤 75 rects1 = find_rect_of_target_color(img) 76 if len(rects1) > 0: 77 rect = max(rects1, key=(lambda x: x[2] * x[3])) 78 cv2.rectangle(img, tuple(rect[0:2]), 79 tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness=2) 80 81 #黄 82 rects2 = find_rect_of_target_color(img) 83 if len(rects2) > 0: 84 rect = max(rects2, key=(lambda x: x[2] * x[3])) 85 cv2.rectangle(img, tuple(rect[0:2]), 86 tuple(rect[0:2] + rect[2:4]), (0, 255, 255), thickness=2) 87 88 #青 89 rects3 = find_rect_of_target_color(img) 90 if len(rects3) > 0: 91 rect = max(rects3, key=(lambda x: x[2] * x[3])) 92 cv2.rectangle(img, tuple(rect[0:2]), 93 tuple(rect[0:2] + rect[2:4]), (255, 0, 0), thickness=2) 94 95 #緑 96 rects4 = find_rect_of_target_color(img) 97 if len(rects4) > 0: 98 rect = max(rects4, key=(lambda x: x[2] * x[3])) 99 cv2.rectangle(img, tuple(rect[0:2]), 100 tuple(rect[0:2] + rect[2:4]), (0, 255, 0), thickness=2) 101 102cv2.imshow('findrect', img) 103k = cv2.waitKey(0) 104if k == ord('q'): 105 cv2.destroyAllWindows() 106 if k == ord('s'): 107 cv2.imwrite("./findrect.jpg", img) 108 cv2.destroyAllWindows() 109
画像の各H値
三角 :(0)
半円 :(61)
長方形:(221)
正方形:(147)
現在、上記のコードで入力画像の図形を色によって認識し、外接矩形を表示するプログラムの作成を行なっております。方法としては、入力画像をhsv画像に変換し、H成分とS成分を指定することでそれぞれの図形を認識するようになっています。しかしこれを実行すると全ての矩形が赤い三角形の周りに表示されるようになってしまい、値を調節してみましたがダメでした。下記の参考サイトをもとに画像版を作ろうと思っているのですが、うまくいきません。どなたかこの問題の解決方法を教えていただきたく質問させていただきました。よろしくお願いいたします。参考サイト
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/07 01:59
2019/01/07 03:58
2019/01/07 04:25