質問編集履歴

1

画像を添付いたしました。全体のプログラムを載せました。

2019/02/22 03:54

投稿

mosu
mosu

スコア15

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,7 @@
1
+ ![エラーが起きた時の二値画像です。](ba4735b1d34959486b1d58dccd60d030.jpeg)
2
+
3
+ ![![エラー時のframe画像](4fd4e31e49de3ee458c7268cd4741b53.jpeg)](36e5b912e9878415d5a4158bc0ef14c2.jpeg)
4
+
1
5
  opencv,pythonにおいて、検知物に対して重心を求めそれを描画したいのですがエラーメッセージが表示され描画することができません。どのようにしたらよいでしょうか。
2
6
 
3
7
  エラーメッセージ:
@@ -24,7 +28,81 @@
24
28
 
25
29
  ```python
26
30
 
31
+ import numpy as np
32
+
33
+ import cv2
34
+
35
+ import sys
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+ bodycascade = cv2.CascadeClassifier(r'C:\Users\Gen\Desktop\bodycascades.xml')
46
+
47
+ #2動画のパス、ウェブカメラを使用する際は引数を0、別のカメラを使うなら1にする。
48
+
49
+ path=(r"Pro.mp4")
50
+
51
+ cv2.ocl.setUseOpenCL(False)
52
+
53
+
54
+
55
+
56
+
57
+ #3パス先の動画を格納、1で0を指定したのならウェブカメラからの映像を格納
58
+
59
+ cap = cv2.VideoCapture(path)
60
+
61
+ #4背景差分処理を行う関数 (history,閾値(どの程度の変化までを読み込むか)、影の描画の有無(Falseはなし))
62
+
63
+ fgbg = cv2.createBackgroundSubtractorMOG2(5000,100,False)
64
+
65
+
66
+
67
+ #5cap(動画読み込み)が行われている間以下の処理を行う
68
+
69
+ while (cap.isOpened):
70
+
71
+
72
+
73
+ #6retがTrue(きちんと動画が読み込まれている)なら動画を読み込む
74
+
75
+ ret, frame = cap.read()
76
+
77
+
78
+
79
+ #7retがTrueなら
80
+
81
+ if ret==True:
82
+
83
+ gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
84
+
85
+
86
+
87
+ #84を読み込んだ映像に適用
88
+
89
+ fgmask = fgbg.apply(frame)
90
+
91
+ #9ガウシアンぼかしを使うことで白ゴマ(ノイズを除去)
92
+
93
+ blur=cv2.GaussianBlur(fgmask,(15,15),0)
94
+
95
+ (im2, contours, hierarchy) = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
96
+
97
+ cnt = contours[0]
98
+
99
+
100
+
101
+
102
+
103
+ #11:輪郭を抽出したらそれを処理し続ける
104
+
27
- for c in contours:
105
+ for c in contours:
28
106
 
29
107
  #12:輪郭の大きさが13000以下ははじく
30
108
 
@@ -56,12 +134,56 @@
56
134
 
57
135
  maxCont=c
58
136
 
59
- mu = cv2.moments(cnt)
137
+ mu = cv2.moments(cnt)
60
138
 
61
- z,w= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])
139
+ z,w= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])
62
140
 
141
+ print(mu,cnt)
142
+
63
- cv2.circle(frame, (z,w), 4, (0,0,255),3 )
143
+ cv2.circle(frame, (z,w), 4, (0,0,255),3 )
144
+
145
+
64
146
 
65
147
 
66
148
 
149
+
150
+
151
+ #15:AIを導入
152
+
153
+ #bodyrect = bodycascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(5,5))
154
+
155
+ #for rect in bodyrect:
156
+
157
+ #text = 'person'
158
+
159
+ #font = cv2.FONT_HERSHEY_PLAIN
160
+
161
+ #16:人を検知したらpersonと表示する。
162
+
163
+ #cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (255, 255, 255), 2, cv2.LINE_AA)
164
+
165
+ #cv2.line(frame,(0,531),(1300,560),(255,0,0),2)
166
+
167
+ #17:結果を表示
168
+
169
+ cv2.imshow('foreground and background',fgmask)
170
+
171
+ cv2.imshow('rgb',frame)
172
+
173
+ if cv2.waitKey(1) & 0xFF == ord("q"):
174
+
175
+ break
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+ cap.release()
184
+
185
+ cv2.destroyAllWindows()
186
+
187
+
188
+
67
189
  ```