2017-04-18 7 views
-1

ich über opencv auf Google gelesen und fand den folgenden Beispielcode online spielen:OpenCV Python Hintergrund Substraktion und Motion Tracking

import cv2 

def diffImg(t0, t1, t2): 
    d1 = cv2.absdiff(t2, t1) 
    d2 = cv2.absdiff(t1, t0) 
    return cv2.bitwise_and(d1, d2) 

cam = cv2.VideoCapture('vid1.mp4') 

winName = "Movement Indicator" 
cv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE) 

# Read three images first: 
t_minus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) 
t = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) 
t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) 

while True: 
    cv2.imshow(winName, diffImg(t_minus, t, t_plus)) 

    # Read next image 
    t_minus = t 
    t = t_plus 
    t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY) 

    key = cv2.waitKey(10) 
    if key == 27: 
    cv2.destroyWindow(winName) 
    break 

print "Goodbye" 

Es produziert die folgende Art der Ausgabe für eine Probe Video, das ich zu geben : opencv image difference frame output

So bekomme ich solche Ergebnisse mit diesem Skript. Nun, was ich versuche herauszufinden, ist - 1) Holen Sie sich die umschließende Rect für das bewegte Objekt in der Videodatei 2) kopieren Sie den Inhalt dieser Umgrenzung von Original-Videoframe zu einem anderen und schreiben Sie das fertige Video in eine Datei

, auch die Screenshots auf Kanishak Katahra Lösung versuchen, unter mir die folgenden Ausgabe im Ergebnisfenster auf der rechten Seite in der Abbildung unten bekommen -

+0

Könnten Sie bitte Ihre Frage auf den kleinstmöglichen Thema reduzieren? Fragen Sie, wie man mit OpenCV in eine Filmdatei schreibt? Fragen Sie, wie man mit OpenCV in ein neues Fenster schreibt? Fragen Sie, wie Sie "diffImg" in eine Variable speichern können, um eines dieser beiden Dinge zu erreichen? Könnten Sie Ihre Frage schließlich bearbeiten, um einen Link zu der Ressource hinzuzufügen, die Sie zum Schreiben dieses Skripts verwenden? – Seanny123

+0

Ich möchte die markierten Teile von diffimg abschneiden und nur die markierten Teile vom ursprünglichen Bild in eine Videodatei kopieren. – DeadMan

+0

Also, was hast du versucht, dies zu erreichen? Wenn Sie sich die Ergebnisse von 'diffImg' ansehen, können Sie sehen, wie es in eine Videodatei eingegeben wird? – Seanny123

Antwort

0

den Punkt von Interesse in der Ausgabe Machen Sie als 1s bekommen. Machen Sie den Rest als 0. Konvertieren Sie es in 3D-Array der Größe wie das Originalbild. Multiplizieren Sie das Originalbild mit der Ausgabe, die Sie erhalten.

import cv2 
import numpy as np 
from numpy import newaxis 
import time 

def diffimg (a,b,c): 
    t0 = cv2.absdiff(a,b) 
    t1 = cv2.absdiff(b,c) 
    t3 = cv2.bitwise_and(t0,t1) 
    return t3 

cap = cv2.VideoCapture(0) 
t = cap.read() [1] 
tp = cap.read() [1] 
tpp = cap.read() [1] 

t = cv2.cvtColor(t,cv2.COLOR_BGR2GRAY) 
tp = cv2.cvtColor(tp,cv2.COLOR_BGR2GRAY) 
tpp = cv2.cvtColor(tpp,cv2.COLOR_BGR2GRAY) 


while True: 

    img = diffimg(t,tp,tpp) 
    cv2.imshow("motion detct",img) 

    key = cv2.waitKey(10) 


    res,img2 = cap.read() 
    #print img2.shape 

    t = tp 
    tp = tpp 
    tpp = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) 

    cv2.imshow('image',img) 
    print img 
    img[img <= 10] = 0 #Try adjusting this value for better results. 
    img[img != 0] = 1 
    img = np.repeat(img[:, :, np.newaxis], 3, axis=2) 
    img3 = np.multiply(img,img2) 
    cv2.imshow('result',img3) 



    if key == 27: 
     cv2.destroyAllWindows() 
     break; 



print "Goodbye User" 
+0

Hallo, aktualisiere die Frage mit Screenshots der Ergebnisse mit deinem Code. Was ich versuche zu tun, ist die Region im Ergebnisfenster zu greifen, die aus dem Bildfenster sichtbar ist, so dass es mit allen Farben und inneren Details jetzt im Ergebnisfenster kommt, es zeigt nur pixelierte Grenze ich denke an bewegtes Objekt – DeadMan

+0

Es gibt Ihnen die Pixel, die sich geändert haben. Wenn Sie ein einfarbiges Objekt um eine kleine Entfernung verschieben, ändern sich nicht viele Pixel. Deshalb erhalten Sie diese Art von Ausgabe. Versuchen Sie denselben Code mit kleineren und bunten Objekten, um bessere Ergebnisse zu erzielen. –

+0

Zum besseren Verständnis eine Verzögerung von 0,5 Sekunden vor res einfügen, img2 = cap.read(). –