回答編集履歴
6
誤植修正
answer
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
> SimilarRects(double _eps) : eps(_eps) {}
|
29
29
|
> inline bool operator()(const Rect& r1, const Rect& r2) const
|
30
30
|
> {
|
31
|
-
> double delta = eps * ((std::min)(r1.width, r2.width) + (std::min)(r1.height,
|
31
|
+
> double delta = eps * ((std::min)(r1.width, r2.width) + (std::min)(r1.height, r2.height)) * 0.5;
|
32
32
|
> return std::abs(r1.x - r2.x) <= delta &&
|
33
33
|
> std::abs(r1.y - r2.y) <= delta &&
|
34
34
|
> std::abs(r1.x + r1.width - r2.x - r2.width) <= delta &&
|
5
import numpy as npをするように注意喚起
answer
CHANGED
@@ -70,7 +70,7 @@
|
|
70
70
|
facerect, _ = cv2.groupRectangles(np.array(facerect).tolist(), groupThreshold=3, eps=0.5)
|
71
71
|
```
|
72
72
|
|
73
|
-
[こちら](https://stackoverflow.com/questions/21689804/grouprectangles-opencv-not-working)を参考にしました。
|
73
|
+
[こちら](https://stackoverflow.com/questions/21689804/grouprectangles-opencv-not-working)を参考にしました。事前に`import numpy as np`するのを忘れずに。
|
74
74
|
|
75
75
|
---
|
76
76
|
[Githubのコード](https://github.com/opencv/opencv/tree/2.4)を舐め回して、ようやくここまでわかりました... 私自身もいい勉強になりました。
|
4
Pythonのテストコード追記
answer
CHANGED
@@ -52,23 +52,25 @@
|
|
52
52
|
> void groupRectangles(vector<Rect>& rectList, int groupThreshold, double eps=0.2);
|
53
53
|
> ```
|
54
54
|
|
55
|
-
ですので、groupRectanglesを自ら呼び出すようなコードを書けば、パラメータ`eps`を指定できることになります。次のようにして、実際に実行することが出来ました。(ただし、再現環境はOpenCV3
|
55
|
+
ですので、groupRectanglesを自ら呼び出すようなコードを書けば、パラメータ`eps`を指定できることになります。次のようにして、実際に実行することが出来ました。(ただし、再現環境はOpenCV3)
|
56
|
-
|
56
|
+
```C++
|
57
|
-
|
57
|
+
cascade.detectMultiScale(smallImg, faces,
|
58
58
|
1.1, // scaleFactor
|
59
59
|
0, // minNeighbors(仮)
|
60
60
|
CV_HAAR_SCALE_IMAGE,
|
61
61
|
cv::Size(30, 30));
|
62
|
-
|
62
|
+
// 以下の値は自由
|
63
|
-
|
63
|
+
int groupThreshold = 3;
|
64
|
-
|
64
|
+
double eps = 0.5;
|
65
|
-
|
65
|
+
cv::groupRectangles(faces, gourpThreshold, eps);
|
66
|
-
|
66
|
+
```
|
67
67
|
|
68
|
-
そして、`groupThreshold`も、`eps`も0にしたときの実行結果がこちら。
|
69
|
-

|
70
|
-
|
68
|
+
```Python
|
69
|
+
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.04, minNeighbors=0, minSize=(80, 80), maxSize=(200, 200))
|
71
|
-
(
|
70
|
+
facerect, _ = cv2.groupRectangles(np.array(facerect).tolist(), groupThreshold=3, eps=0.5)
|
71
|
+
```
|
72
72
|
|
73
|
+
[こちら](https://stackoverflow.com/questions/21689804/grouprectangles-opencv-not-working)を参考にしました。
|
74
|
+
|
73
75
|
---
|
74
76
|
[Githubのコード](https://github.com/opencv/opencv/tree/2.4)を舐め回して、ようやくここまでわかりました... 私自身もいい勉強になりました。
|
3
論理修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
まず、それぞれの言葉の意味について回答します。
|
2
2
|
- **minNeighborsについて**
|
3
|
-
『物体候補領域が何個以上重なっていたらそれを一つの物体として検出する』というイメージで大体あっていると思います。その重なり具合を指定するパラメータは存在します
|
3
|
+
『物体候補領域が何個以上重なっていたらそれを一つの物体として検出する』というイメージで大体あっていると思います。その重なり具合を指定するパラメータは存在します。詳しくは後述します。
|
4
4
|
|
5
5
|
- **scaleFactorについて**
|
6
6
|
OpenCVのカスケード分類器は、Sliding Windowという技法を使って候補となる矩形を検出しています。[この動画](https://www.youtube.com/watch?v=hPCTwxF0qf4)は、われらがマドンナ・[レナ姐さん](https://en.wikipedia.org/wiki/Lenna)の画像にSliding Windowを適用しているものです。文字通り、窓を滑らせて片端から候補を見つけ出しているんですが、一巡毎にこの窓枠は縮小します。この縮小率がscaleFactorです。(たまにscaleFactorを1.0にして困っている人を見ます。)
|
@@ -52,7 +52,7 @@
|
|
52
52
|
> void groupRectangles(vector<Rect>& rectList, int groupThreshold, double eps=0.2);
|
53
53
|
> ```
|
54
54
|
|
55
|
-
ですので、groupRectanglesを自ら呼び出すようなコードを書けば、パラメータ`eps`を指定できることになります。次のようにして、実際に実行することが出来ました。(ただし、環境はOpenCV3.1)
|
55
|
+
ですので、groupRectanglesを自ら呼び出すようなコードを書けば、パラメータ`eps`を指定できることになります。次のようにして、実際に実行することが出来ました。(ただし、再現環境はOpenCV3.1)
|
56
56
|
> ```C++
|
57
57
|
> cascade.detectMultiScale(smallImg, faces,
|
58
58
|
1.1, // scaleFactor
|
@@ -68,6 +68,7 @@
|
|
68
68
|
そして、`groupThreshold`も、`eps`も0にしたときの実行結果がこちら。
|
69
69
|

|
70
70
|
うまくいきました!
|
71
|
+
(よく考えたら、これじゃ実行結果として不十分ですね... タイミングを見て追記します。)
|
71
72
|
|
72
73
|
---
|
73
74
|
[Githubのコード](https://github.com/opencv/opencv/tree/2.4)を舐め回して、ようやくここまでわかりました... 私自身もいい勉強になりました。
|
2
成形
answer
CHANGED
@@ -56,7 +56,7 @@
|
|
56
56
|
> ```C++
|
57
57
|
> cascade.detectMultiScale(smallImg, faces,
|
58
58
|
1.1, // scaleFactor
|
59
|
-
|
59
|
+
0, // minNeighbors(仮)
|
60
60
|
CV_HAAR_SCALE_IMAGE,
|
61
61
|
cv::Size(30, 30));
|
62
62
|
> // 以下の値は自由
|
1
画像のアップ
answer
CHANGED
@@ -66,6 +66,7 @@
|
|
66
66
|
> ```
|
67
67
|
|
68
68
|
そして、`groupThreshold`も、`eps`も0にしたときの実行結果がこちら。
|
69
|
+

|
69
70
|
うまくいきました!
|
70
71
|
|
71
72
|
---
|