私の目標は、IPカメラストリーム上の特定の領域の動きを検出することです。私は作業コードを書くことができましたが、私の個人的な理解に基づいています。OpenCVは動きをPythonで検出します
import cv2
import numpy as np
import os
import time
import datetime
import urllib
import pynotify
stream=urllib.urlopen('http://user:[email protected]/video.mjpg')
bytes=''
fgbg = cv2.createBackgroundSubtractorMOG2()
while True:
bytes+=stream.read(16384)
a = bytes.find('\xff\xd8')
b = bytes.find('\xff\xd9')
if a!=-1 and b!=-1:
jpg = bytes[a:b+2]
bytes= bytes[b+2:]
img = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8),cv2.IMREAD_COLOR)
rows,cols,c = img.shape
mask = np.zeros(img.shape, dtype=np.uint8)
roi_corners = np.array([[(940,220),(1080,240), (1080,310), (940,290)]], dtype=np.int32)
channel_count = img.shape[2]
ignore_mask_color = (255,)*channel_count
cv2.fillPoly(mask, roi_corners, ignore_mask_color)
masked_image = cv2.bitwise_and(img, mask)
fgmask = fgbg.apply(masked_image)
iii = fgmask[220:310,940:1080]
hist,bins = np.histogram(iii.ravel(),256,[0,256])
black, white, cnt1, cnt2 = 0,0,0,0
for i in range(0,127):
black += hist[i]
cnt1+=1
bl = float(black/cnt1)
for i in range(128,256):
white += hist[i]
cnt2+=1
wh = float(white/cnt2)
finalResult = ((bl+1)/(wh+1))/10
if finalResult < 1.0:
pynotify.init("cv2alert")
notice = pynotify.Notification('Alert', 'Alert text')
try:
notice.show()
except gio.Error:
print "Error"
このコードは動作しますが、私はとてもよくヒストグラムを理解していないとして、私は値を直接得ることができたが、ヒストグラムの左側のようないくつかの「ハック」と黒で、右、白ではありませんでしたblack/white
私が望む結果が得られます。私はこれが正しくないことを知っていますが、誰もROIにないときは4-9の結果を、誰かがこのROIを入力すると0.5-2.0の結果を得ます。
私の質問はここにあります: ヒストグラムを読み、データを比較する、または他の方法がありますか?ドキュメントを読むことは私を助けません。
関心領域は、事前に定義し、安定していますか?私が正しく理解している場合は、グレースケールの画像/ビデオで作業していて、「急激なピクセル値の変化」などの動きを検出したいのですか? –
はい、この領域はあらかじめ定義されています。ヒストグラムから値を抽出しようとしました。なぜなら2色(黒と白)しかないからですが、運がないからです。だから、黒のヒストグラムの前半と白の二番目のヒストグラムを使ってみましょう。私の質問は、これを達成する別の方法が存在するかどうかです。私の主な目標は、特定の地域での動きをできるだけ単純に検出し、ユーザーに通知することです。 – Aleksandar
私は、ほとんど無限の数の方法があると思います。たとえば、最後のxフレームのスコアを保持し、差分画像を計算するために使用する「平均」画像を計算することができます。 n * mパッチなどの任意の領域の差がしきい値より高い場合は、それを動きと呼んで報告することができます。 ROIを明示的に定義しなくても、これを使って動きの範囲を特定することもできます –