回答編集履歴

3

追記

2018/08/14 02:44

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -75,3 +75,31 @@
75
75
  self._cascade_path = r"C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml"
76
76
 
77
77
  ```
78
+
79
+
80
+
81
+ ---
82
+
83
+
84
+
85
+ 1,MasahikoHirataさんも指摘されていますが、まず日本語パス「卒業研究」こういうのが含まれていないパスにする。
86
+
87
+
88
+
89
+ `python`の`opencv`は`Unicode`パスに対応していないので、問題が起きやすいです。
90
+
91
+ 2,スレッドを使うのをやめる。
92
+
93
+ ```Python
94
+
95
+ th = FaceThread(frame)
96
+
97
+ th.start()
98
+
99
+ ```
100
+
101
+ 3,上でも指摘しましたが、`cap.read()`の戻り値を判定する。
102
+
103
+
104
+
105
+ 最後に質問文のコードは`minSize`とパス部分を変えたならば、編集して最新のコードにしてくださいな。

2

追記

2018/08/14 02:44

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -45,3 +45,33 @@
45
45
  2,`ret, frame = cap.read()`
46
46
 
47
47
  動画が正しく読み込まれたかの戻り値`ret`が`True`かどうかを直後にif文で確認してください。
48
+
49
+
50
+
51
+ ---
52
+
53
+ `haarcascade_frontalface_alt`の探し方。
54
+
55
+
56
+
57
+ ![イメージ説明](2fd0cb6ad3be6348850b671fa2c3e9a3.png)
58
+
59
+
60
+
61
+ クリップボードに以下のようなパスがコピーされるので、
62
+
63
+ ```
64
+
65
+ "C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml"
66
+
67
+ ```
68
+
69
+
70
+
71
+ **文字列の先頭にrをつけて**以下のように、質問文のコードを書き換えてください。
72
+
73
+ ```Python
74
+
75
+ self._cascade_path = r"C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_alt.xml"
76
+
77
+ ```

1

追記

2018/08/08 15:52

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -15,3 +15,33 @@
15
15
  opencvで日本語が含まれているパスを扱うのはお勧めしませんが
16
16
 
17
17
  カスケードファイルのパスを正しくしてくださいな。
18
+
19
+
20
+
21
+ ---
22
+
23
+ 1,今回の問題と関係ないですが、以下の部分で新規スレッドを起動しています。
24
+
25
+ プログラム初心者の内は別スレッドを起動するのはスレッドに起因するトラブルを無駄に持ち込むだけなので、避けたほうがよいです。シングルスレッドでプログラムが正しく動作することを確認後に、`ThreadPoolExecutor`や`ProcessPoolExecutor`あと`asyncio`を使って並列化してくださいな。
26
+
27
+ ```Python
28
+
29
+ if(threading.activeCount() == 1):
30
+
31
+ th = FaceThread(frame)
32
+
33
+ th.start()
34
+
35
+ ```
36
+
37
+ というかこのプログラム、`threading.activeCount() == 1`を判断しているので、
38
+
39
+ 並列化されていないのでは・・・
40
+
41
+ `k = cv2.waitKey(10)`でキー入力をすぐに返した後、`FaceThread#detectMultiScale`の処理に時間がかかれば、`threading.activeCount()`の値は2以上になる可能性があると思いますが。
42
+
43
+
44
+
45
+ 2,`ret, frame = cap.read()`
46
+
47
+ 動画が正しく読み込まれたかの戻り値`ret`が`True`かどうかを直後にif文で確認してください。