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

質問編集履歴

1

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

2019/02/22 03:54

投稿

mosu
mosu

スコア15

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,5 @@
1
+ ![エラーが起きた時の二値画像です。](ba4735b1d34959486b1d58dccd60d030.jpeg)
2
+ ![![エラー時のframe画像](4fd4e31e49de3ee458c7268cd4741b53.jpeg)](36e5b912e9878415d5a4158bc0ef14c2.jpeg)
1
3
  opencv,pythonにおいて、検知物に対して重心を求めそれを描画したいのですがエラーメッセージが表示され描画することができません。どのようにしたらよいでしょうか。
2
4
  エラーメッセージ:
3
5
  ZeroDivisionError Traceback (most recent call last)
@@ -11,7 +13,44 @@
11
13
  ZeroDivisionError: float division by zero
12
14
 
13
15
  ```python
16
+ import numpy as np
17
+ import cv2
18
+ import sys
19
+
20
+
21
+
22
+
23
+ bodycascade = cv2.CascadeClassifier(r'C:\Users\Gen\Desktop\bodycascades.xml')
24
+ #2動画のパス、ウェブカメラを使用する際は引数を0、別のカメラを使うなら1にする。
25
+ path=(r"Pro.mp4")
26
+ cv2.ocl.setUseOpenCL(False)
27
+
28
+
29
+ #3パス先の動画を格納、1で0を指定したのならウェブカメラからの映像を格納
30
+ cap = cv2.VideoCapture(path)
31
+ #4背景差分処理を行う関数 (history,閾値(どの程度の変化までを読み込むか)、影の描画の有無(Falseはなし))
32
+ fgbg = cv2.createBackgroundSubtractorMOG2(5000,100,False)
33
+
34
+ #5cap(動画読み込み)が行われている間以下の処理を行う
35
+ while (cap.isOpened):
36
+
37
+ #6retがTrue(きちんと動画が読み込まれている)なら動画を読み込む
38
+ ret, frame = cap.read()
39
+
40
+ #7retがTrueなら
41
+ if ret==True:
42
+ gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
43
+
44
+ #84を読み込んだ映像に適用
45
+ fgmask = fgbg.apply(frame)
46
+ #9ガウシアンぼかしを使うことで白ゴマ(ノイズを除去)
47
+ blur=cv2.GaussianBlur(fgmask,(15,15),0)
48
+ (im2, contours, hierarchy) = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
49
+ cnt = contours[0]
50
+
51
+
52
+ #11:輪郭を抽出したらそれを処理し続ける
14
- for c in contours:
53
+ for c in contours:
15
54
  #12:輪郭の大きさが13000以下ははじく
16
55
  if cv2.contourArea(c) < 13000:
17
56
  continue
@@ -27,8 +66,30 @@
27
66
  for c in contours:
28
67
  if len(cnt)<len(c):
29
68
  maxCont=c
30
- mu = cv2.moments(cnt)
69
+ mu = cv2.moments(cnt)
31
- z,w= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])
70
+ z,w= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])
71
+ print(mu,cnt)
32
- cv2.circle(frame, (z,w), 4, (0,0,255),3 )
72
+ cv2.circle(frame, (z,w), 4, (0,0,255),3 )
73
+
33
74
 
75
+
76
+ #15:AIを導入
77
+ #bodyrect = bodycascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(5,5))
78
+ #for rect in bodyrect:
79
+ #text = 'person'
80
+ #font = cv2.FONT_HERSHEY_PLAIN
81
+ #16:人を検知したらpersonと表示する。
82
+ #cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (255, 255, 255), 2, cv2.LINE_AA)
83
+ #cv2.line(frame,(0,531),(1300,560),(255,0,0),2)
84
+ #17:結果を表示
85
+ cv2.imshow('foreground and background',fgmask)
86
+ cv2.imshow('rgb',frame)
87
+ if cv2.waitKey(1) & 0xFF == ord("q"):
88
+ break
89
+
90
+
91
+
92
+ cap.release()
93
+ cv2.destroyAllWindows()
94
+
34
95
  ```