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