내 목표는 IP 카메라 스트림의 특정 영역에서 움직임을 감지하는 것입니다. 필자는 작업 코드를 작성했지만 개인적인 이해를 기반으로합니다.OpenCV가 파이썬에서 움직임을 감지합니다.
이 코드는 작동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의 결과를 얻습니다.
내 질문은 여기입니다 : 히스토그램을 읽고 데이터를 비교하는 다른 방법이 있습니까? 문서를 읽는 것이 도움이되지 않습니다.
관심있는 지역은 미리 정의와 안정? 올바르게 이해하면 그레이 스케일 그림/비디오로 작업하면서 "픽셀 값의 급격한 변화"와 같은 모션을 감지하고 싶습니까? –
예,이 지역은 사전 정의되었습니다. 히스토그램에서 값을 추출하려고했는데, 두 가지 색 (흑백) 만 있었기 때문에 행운이 없었기 때문입니다. 따라서 히스토그램의 전반부는 검은 색으로, 두 번째는 흰색으로 진행합니다. 내 질문은 이것을 달성하는 또 다른 방법이 존재 하는가? 내 주요 목표는 단순히 특정 지역의 움직임을 가능한 간단하게 감지하고 사용자에게 알리는 것입니다. – Aleksandar
나는 거의 무수한 다른 방법이 있다고 생각한다. 예를 들어 마지막 x 프레임의 점수를 유지하고 차이 그림을 계산하는 데 사용하는 "평균"그림을 계산할 수 있습니다. n * m 패치와 같은 영역의 차이가 임계 값보다 높으면 이동이라고 부르거나보고 할 수 있습니다. ROI를 명시 적으로 정의 할 필요없이 이동 영역을 식별하는데도 사용할 수 있습니다. –