回答編集履歴

3

修正

2020/11/04 04:17

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -23,3 +23,101 @@
23
23
  + print(f"{(cx, cy)} = {img[cy, cx]}")
24
24
 
25
25
  ```
26
+
27
+
28
+
29
+ ## 追記
30
+
31
+
32
+
33
+ q_sane_q さんがご指摘くださってるように円の中心の色を取得する前に円の中心に色を塗ってしまっているので、取得された色は元の画素値ではなく、その色になってしまいます。
34
+
35
+ 描画する画像はコピーをとっておいたほうがよいと思います。
36
+
37
+
38
+
39
+ ```python
40
+
41
+ import cv2
42
+
43
+
44
+
45
+ img = cv2.imread("c:/temp/test.jpg")
46
+
47
+
48
+
49
+ # グレースケールに変換する。
50
+
51
+ gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
52
+
53
+ grey_canny = cv2.Canny(img, 500.0, 300.0)
54
+
55
+
56
+
57
+ # ハフ変換で円検出する。
58
+
59
+ circles = cv2.HoughCircles(
60
+
61
+ grey_canny,
62
+
63
+ cv2.HOUGH_GRADIENT,
64
+
65
+ dp=1.0,
66
+
67
+ minDist=28,
68
+
69
+ param1=100,
70
+
71
+ param2=9,
72
+
73
+ minRadius=11,
74
+
75
+ maxRadius=15,
76
+
77
+ )
78
+
79
+
80
+
81
+ img_copy = img.copy() # 描画用にコピーしておく。
82
+
83
+
84
+
85
+ # 検出結果を描画する。
86
+
87
+ if circles is not None:
88
+
89
+ circles = circles.squeeze(axis=0) # (1, NumCircles, 3) -> (NumCircles, 3)
90
+
91
+
92
+
93
+ for cx, cy, r in circles:
94
+
95
+ # 円の円周を描画する。
96
+
97
+ cv2.circle(img_copy, (cx, cy), r, (0, 255, 0), 2)
98
+
99
+ # 円の中心を描画する。
100
+
101
+ cv2.circle(img_copy, (cx, cy), 2, (0, 255, 0), 2)
102
+
103
+
104
+
105
+ for cx, cy, r in circles.squeeze(axis=0).astype(int):
106
+
107
+ print(f"{(cx, cy)} = {img[cy, cx]}")
108
+
109
+
110
+
111
+
112
+
113
+ # 結果を保存する。
114
+
115
+ cv2.imwrite("c:/temp/test1.jpg", img_copy)
116
+
117
+ cv2.imshow("img", img_copy)
118
+
119
+ cv2.waitKey(0)
120
+
121
+ cv2.destroyAllWindows()
122
+
123
+ ```

2

修正

2020/11/04 04:17

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -12,8 +12,14 @@
12
12
 
13
13
  - centers = circles[:, :2]
14
14
 
15
- - for cx, cy, r in circles.squeeze(axis=0).astype(int):
15
+ - print(centers)
16
16
 
17
+ - color = img[centers]
18
+
19
+ - print(f"Image[{centers}] = BGRA{color}")
20
+
21
+ + for cx, cy, r in circles.squeeze(axis=0).astype(int):
22
+
17
- - print(f"{(cx, cy)} = {img[cy, cx]}")
23
+ + print(f"{(cx, cy)} = {img[cy, cx]}")
18
24
 
19
25
  ```

1

修正

2020/11/04 03:59

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,10 +1,10 @@
1
- 以下の処理を次のように置き換えてください。
1
+ 以下のようにすればいです
2
2
 
3
3
 
4
4
 
5
- * 円は複数検出されることもあるので、何個目の中心を見るのかを指定する
5
+ * 円は複数検出されることもある。
6
6
 
7
- * astype(int) で int 型にキャストした上で tuple() でタプルにする。
7
+ * astype(int) で int 型にキャストする。
8
8
 
9
9
 
10
10
 
@@ -12,8 +12,8 @@
12
12
 
13
13
  - centers = circles[:, :2]
14
14
 
15
- + i = 0 # 何個目の中心か
15
+ - for cx, cy, r in circles.squeeze(axis=0).astype(int):
16
16
 
17
- + center = tuple(circles[i, 0, :2].astype(int))
17
+ - print(f"{(cx, cy)} = {img[cy, cx]}")
18
18
 
19
19
  ```