とりあえず動きますが、詳細は調整ください。
mask[(h > 240) & ((150 > s) & (s < 100))] = 255
((150 > s) & (100 > s))
を変形すると(150 > s) & (s < 100))
となります。
これはsが150より小さくて100より小さい
となります。
私には具体的な値の範囲がわかりませんので、より広い (150 > s)
にしました。
cv2.findContours
帰ってくる値が3つ、と指定されていましたが、contours, hierarchy
の2つが正解でしたので、そのように修正しました。
- ファイルの読み出し
今回はとりあえず動くことが重要だと思いますので、以下のように決め打ちしました。
img_list = ['/home/pi/picture/test1.png','/home/pi/picture/test2.png','/home/pi/picture/test3.png']
実際にはファイル検索のような方法でリストを作った方がスマートだと思います。
- 連結
for文の外側で連結しています。'np.vstack'や'np.hstack'で連結できます。
Python3
1
2import cv2
3import numpy as np
4
5def find_rect_of_target_color(image):
6 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL)
7 h = hsv[:, :, 0]
8 s = hsv[:, :, 1]
9 mask = np.zeros(h.shape, dtype=np.uint8)
10 mask[(h > 240) & (150 > s)] = 255
11 cv2.imshow("mask",mask)
12
13 # mask, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
14 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
15
16 rects = []
17 for contour in contours:
18 approx = cv2.convexHull(contour)
19 rect = cv2.boundingRect(approx)
20 rects.append(np.array(rect))
21 return rects
22
23
24#####################
25# 読み出し元の定義
26#####################
27img_list = ['/home/pi/picture/test1.png','/home/pi/picture/test2.png','/home/pi/picture/test3.png']
28
29#####################
30# 繰り返し処理 (img_list の中のaddrを一つずつ読み込む)
31#####################
32for addr in img_list:
33
34 #####################
35 #ファイルを読み出す実体
36 #####################
37 img = cv2.imread(addr)
38 rects = find_rect_of_target_color(img)
39 if len(rects) > 0:
40 rect = max(rects, key=(lambda x: x[2] * x[3]))
41 cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness=2)
42
43 #####################
44 #画像を表示
45 #####################
46 cv2.imshow("red", img)
47 cv2.waitKey(0)
48
49 #####################
50 #画像を連結
51 #####################
52 img_array.append(img)
53
54
55#####################
56#画像を表示
57#####################
58img_stacked = np.vstack(np.array(img_array))
59
60cv2.imshow("STACKED",img_stacked)
61cv2.waitKey(0)
62cv2.destroyAllWindows()
63
64
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/02 03:54
退会済みユーザー
2019/11/03 21:41 編集