Проверять только определенную часть видео в OpenCV - PullRequest
2 голосов
/ 02 мая 2019

Как получить видео с веб-камеры, для определенной ширины и высоты?

У меня нет опыта работы с библиотекой OpenCV, поэтому мне нужна помощь в этом отношении.Этот код от geeksforgeeks.com.Это единственное, что у меня есть сейчас.

Я пытаюсь добиться того, чтобы я хотел обнаруживать движение только в указанной области видеопотока.

import cv2, time, pandas



from datetime import datetime 



static_back = None
motion_list = [ None, None ] 
time = [] 
df = pandas.DataFrame(columns = ["Start", "End"]) 
video = cv2.VideoCapture(0) 



while True: 
    check, frame = video.read() 
    motion = 0
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    gray = cv2.GaussianBlur(gray, (21, 21), 0)



if static_back is None: 
    static_back = gray 
    continue

diff_frame = cv2.absdiff(static_back, gray) 

thresh_frame = cv2.threshold(diff_frame, 30, 255, cv2.THRESH_BINARY)[1] 
thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2) 

(cnts, _) = cv2.findContours(thresh_frame.copy(),  
                   cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 

for contour in cnts: 
    if cv2.contourArea(contour) < 50000: 
        continue
    motion = 1

    (x, y, w, h) = cv2.boundingRect(contour) 
    # making green rectangle arround the moving object 
    cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3) 

motion_list.append(motion) 

motion_list = motion_list[-2:] 

if motion_list[-1] == 1 and motion_list[-2] == 0: 
    time.append(datetime.now()) 

if motion_list[-1] == 0 and motion_list[-2] == 1: 
    time.append(datetime.now()) 

cv2.imshow("Gray Frame", gray) 

cv2.imshow("Difference Frame", diff_frame) 

cv2.imshow("Threshold Frame", thresh_frame) 

cv2.imshow("Color Frame", frame) 

key = cv2.waitKey(1) 
if key == ord('q'): 
    # if something is movingthen it append the end time of movement 
    if motion == 1: 
        time.append(datetime.now()) 
    break


for i in range(0, len(time), 2): 
    df = df.append({"Start":time[i], "End":time[i + 1]}, ignore_index = True)

df.to_csv("Time_of_movements.csv") 
video.release() 
cv2.destroyAllWindows()

1 Ответ

4 голосов
/ 02 мая 2019

Кажется, что вы хотите получить интересующую область (ROI) для конкретной области каждого кадра.Чтобы сделать это в OpenCV, мы можем обрезать изображение, используя ограничительные рамки.Рассмотрите (0,0) как верхний левый угол изображения с слева направо как направление x и сверху вниз как направление y.Если у нас (x1, y1) как верхняя левая вершина и (x2,y2) как нижняя правая вершина ROI, мы можем обрезать изображение следующим образом:

ROI = frame[y1:y2, x1:x2]

Как иллюстрация:

-------------------------------------------
|                                         | 
|    (x1, y1)                             |
|      ------------------------           |
|      |                      |           |
|      |                      |           | 
|      |         ROI          |           |  
|      |                      |           |   
|      |                      |           |   
|      |                      |           |       
|      ------------------------           |   
|                           (x2, y2)      |    
|                                         |             
|                                         |             
|                                         |             
-------------------------------------------

Мы можем сделать это, поскольку изображения хранятся в виде массива Numpy в OpenCV. Здесь - отличный ресурс для индексации и нарезки массивов Numpy.Как только вы получите желаемую рентабельность инвестиций, вы сможете выполнять обнаружение движения в этом регионе.

...