teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

誤植修正

2017/07/21 04:34

投稿

LouiS0616
LouiS0616

スコア35678

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, > r2.height)) * 0.5;
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をするように注意喚起

2017/07/21 04:34

投稿

LouiS0616
LouiS0616

スコア35678

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のテストコード追記

2017/07/20 09:49

投稿

LouiS0616
LouiS0616

スコア35678

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.1)
55
+ ですので、groupRectanglesを自ら呼び出すようなコードを書けば、パラメータ`eps`を指定できることになります。次のようにして、実際に実行することが出来ました。(ただし、再現環境はOpenCV3)
56
- > ```C++
56
+ ```C++
57
- > cascade.detectMultiScale(smallImg, faces,
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
- > int groupThreshold = 3;
63
+ int groupThreshold = 3;
64
- > double eps = 0.5;
64
+ double eps = 0.5;
65
- > cv::groupRectangles(faces, gourpThreshold, eps);
65
+ cv::groupRectangles(faces, gourpThreshold, eps);
66
- > ```
66
+ ```
67
67
 
68
- そして、`groupThreshold`も、`eps`も0にしたときの実行結果がこちら。
69
- ![われらがレナ姐さん](71c836fd084b1ada99b4ed5dce2170be.jpeg)
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

論理修正

2017/07/20 09:45

投稿

LouiS0616
LouiS0616

スコア35678

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
  ![われらがレナ姐さん](71c836fd084b1ada99b4ed5dce2170be.jpeg)
70
70
  うまくいきました!
71
+ (よく考えたら、これじゃ実行結果として不十分ですね... タイミングを見て追記します。)
71
72
 
72
73
  ---
73
74
  [Githubのコード](https://github.com/opencv/opencv/tree/2.4)を舐め回して、ようやくここまでわかりました... 私自身もいい勉強になりました。

2

成形

2017/07/19 19:08

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -56,7 +56,7 @@
56
56
  > ```C++
57
57
  > cascade.detectMultiScale(smallImg, faces,
58
58
  1.1, // scaleFactor
59
- 0, // minNeighbors(仮)
59
+ 0, // minNeighbors(仮)
60
60
  CV_HAAR_SCALE_IMAGE,
61
61
  cv::Size(30, 30));
62
62
  > // 以下の値は自由

1

画像のアップ

2017/07/19 18:01

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -66,6 +66,7 @@
66
66
  > ```
67
67
 
68
68
  そして、`groupThreshold`も、`eps`も0にしたときの実行結果がこちら。
69
+ ![われらがレナ姐さん](71c836fd084b1ada99b4ed5dce2170be.jpeg)
69
70
  うまくいきました!
70
71
 
71
72
  ---