[Reproduziert] Einführung in die Videoverarbeitung der OpenCV-Python-Serie (6)

Die Videoverarbeitung ist in OpenCV äußerst wichtig, und verschiedene Echtzeit-Bildverarbeitungsalgorithmen wie die Ziel-Echtzeitverfolgung basieren auf Video.

Video von der Kamera aufnehmen

Schauen wir uns zunächst die Verwendung der mit dem Computer gelieferten Kamera zum Aufnehmen von Videos an. Normalerweise müssen wir eine Kamera verwenden, um den Live-Stream aufzunehmen. OpenCV bietet eine sehr einfache Schnittstelle, um diesen Vorgang auszuführen. Lassen Sie uns Videos von der Kamera aufnehmen (ich verwende die eingebaute Webcam auf dem Laptop). Wir müssen einige Funktionen verstehen:

Obergrenze = cv2.VideoCapture (0)

Der Parameter in VideoCapture () ist 0, was bedeutet, dass die eingebaute Kamera des Notebooks geöffnet wird, und der Parameter ist der Videodateipfad zum Öffnen des Videos, z. B. cap = cv2.VideoCapture ("... / test.avi"), wenn Sie andere trennen Kamera, dann können Sie andere Parameter wie 1 ersetzen, um es aufzurufen.

ret , frame = cap.read ((

cap.read () liest das Video Frame für Frame, ret, Frame sind die beiden Rückgabewerte der gewonnenen Methode cap.read (). Wenn ret ein boolescher Wert ist und der Leserahmen korrekt ist, gibt er True zurück. Wenn die Datei bis zum Ende gelesen wird, ist ihr Rückgabewert false. Der Frame ist das Bild jedes Frames, bei dem es sich um eine dreidimensionale Matrix handelt. Wir alle wissen, dass das Video aus einem Frame für einen Frame besteht. OpenCV dient dazu, das Bild jedes Frames bei der Verarbeitung des Bildes schnell zu verarbeiten.

cv2.waitkey ((

Die waitKey () -Methode selbst bedeutet das Warten auf Tastatureingaben. Der Parameter ist 1, was bedeutet, dass der Wechsel zum nächsten Bildbild um 1 ms verzögert wird. Für Video ist der Parameter 0, z. B. cv2.waitKey (0), das nur das aktuelle Bildbild anzeigt, das der Videopause entspricht Wenn der Parameter zu groß ist, z. B. cv2.waitKey (1000), bleibt er aufgrund der langen Verzögerung hängen.

c erhält den von der Tastatur eingegebenen ASCII-Code, der der Esc-Taste entsprechende ASCII-Code ist 27, dh wenn die Esc-Taste gedrückt wird, wird der if-bedingte Satz festgelegt.

befreit()

Rufen Sie release () auf, um die Kamera freizugeben, und rufen Sie destroyAllWindows () auf, um alle Bildfenster zu schließen.

Jetzt führen wir zuerst ein Codeexperiment durch und dann werden einige Erklärungen abgegeben:

	查看普通副本到剪贴板打印?
 1. 将numpy导入为np   
 2. 将cv2导入为cv   
 3. cap = cv.VideoCapture(04. 如果 不是cap.isOpened():  
 5.     打印(“无法打开相机” )  
 6.     出口()   
 7.True8.     #逐帧捕获  
 9.     ret,frame = cap.read()  
 10.    #  如果 正确读取帧,ret为True  
 11.    如果 不退回:  
 12.        打印(“无法接收帧(流的末尾?)。正在退出...” )  
 13.        打破  
 14.    #我们对框架的操作来到这里  
 15.    #灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)  
 16.    #显示结果帧  
 17.    cv.imshow('frame' ,灰色)  
 18.    如果 cv.waitKey(1== ord'q' ):  
 19.        打破   
 20. #完成所有操作后,释放捕获   
 21. cap.release()   
 22. cv.destroyAllWindows()

Fügen Sie hier eine Bildbeschreibung ein

isOpened kann bestimmen, ob die Kamera geöffnet ist, fortfahren, wenn sie geöffnet ist, fortfahren, wenn sie geöffnet ist, und automatisch beenden, wenn sie nicht erfolgreich geöffnet wird. Wie bereits erwähnt, bezieht sich Frame auf jedes Frame des Kameravideos. Bei der Anzeige wird also auch jedes Frame angezeigt. Wenn die Graustufenverarbeitung für jedes Bild ausgeführt wird, ist das angezeigte Video ein Graustufenvideo. Natürlich wurde die Graustufen noch nicht erwähnt, aber Sie können zuerst ein kleines Experiment durchführen. Schauen wir uns den Code an:

	查看普通副本到剪贴板打印?
1.将numpy导入为np  
2.将cv2导入为cv  
3.cap = cv.VideoCapture(04.如果 不是cap.isOpened():  
5.    打印(“无法打开相机” )  
6.    出口()  
7.True8.  #逐帧捕获  
9.  ret,frame = cap.read()  
10. #  如果 正确读取帧,ret为True  
11. 如果 不退回:  
12.     打印(“无法接收帧(流的末尾?)。正在退出...” )  
13.     打破  
14. #我们对框架的操作来到这里  
15. 灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)  
16. #显示结果帧  
17. cv.imshow('frame' ,灰色)  
18. 如果 cv.waitKey(1== ord'q' ):  
19.     打破  
20.#完成所有操作后,释放捕获  
21.cap.release()  
22.cv.destroyAllWindows()  

Fügen Sie hier eine Bildbeschreibung ein

Jeder experimentiert und erlebt den Effekt. Vielleicht haben einige Leute entdeckt, dass unser Video das Gegenteil der tatsächlichen Situation zu sein scheint. Es ist ein Effekt. Wir können diesen Effekt aufheben. Hier müssen wir eine Funktion einführen, die später auch im Abschnitt zur Bildverbesserung vorgestellt wird:

cv2.flip ((

Funktionsprototyp: flip (src, flipCode [, dst])

src stellt das Eingabebild dar. Schauen wir uns die Parametertabelle von flipCode an:

image.png

Jetzt fügen wir diese Codezeile hinzu:

	查看普通副本到剪贴板打印?
1.将numpy导入为np  
2.将cv2导入为cv  
3.cap = cv.VideoCapture(04.如果 不是cap.isOpened():  
5.  打印(“无法打开相机” )  
6.  出口()  
7.True8.  #逐帧捕获  
9.  ret,frame = cap.read()  
10. 框架= cv.flip(框架,111. #  如果 正确读取帧,ret为True  
12. 如果 不退回:  
13.     打印(“无法接收帧(流的末尾?)。正在退出...” )  
14.     打破  
15. #我们对框架的操作来到这里  
16. 灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)  
17. #显示结果帧  
18. cv.imshow('frame' ,灰色)  
19. 如果 cv.waitKey(1== ord'q' ):  
20.     打破  
21.#完成所有操作后,释放捕获  
22.cap.release()  
23.cv.destroyAllWindows()  

Beim erneuten Experimentieren wird festgestellt, dass das Bild keine so vorteilhafte Wirkung hat.

Video aus Datei abspielen

Das Abspielen des Videos aus der Datei entspricht dem von der Kamera aufgenommenen Video, außer dass der Kameraindex in den Namen der Videodatei geändert wird. Verwenden Sie zum Anzeigen des Frames außerdem die entsprechende Zeit cv.waitKey (). Wenn es zu klein ist, ist das Video sehr schnell, und wenn es zu hoch ist, wird das Video sehr langsam (nun, so wird die Verzögerung angezeigt). Unter normalen Umständen sind 25 Sekunden ausreichend.

Geben Sie einen Beispielcode an:

	查看普通副本到剪贴板打印?
1.将cv2导入为cv  
2.cap = cv.VideoCapture('test.avi'3.而 cap.isOpened()  
4.  ret,frame = cap.read()  
5.  #  如果 正确读取帧,ret为True  
6.  如果 不退回:  
7.      打印(“无法接收帧(流的末尾?)。正在退出...” )  
8.      打破  
9.  cv.imshow('frame' ,框架)  
10. 如果 cv.waitKey(25== ord'q' ):  
11.    打破  
12.cap.release()  
13.cv.destroyAllWindows()  

Fügen Sie hier eine Bildbeschreibung ein

Video speichern

Wenn wir das Bild speichern möchten, ist es sehr einfach: Verwenden Sie einfach cv2.imwrite (). Und wenn wir das Video speichern möchten, muss mehr Arbeit geleistet werden.

Dieses Mal erstellen wir ein VideoWriter-Objekt und sollten den Namen der Ausgabedatei angeben (zum Beispiel: output.avi). Dann sollten wir FourCC angeben. Der Code (Details im nächsten Absatz) sollte dann die Anzahl der Bilder pro Sekunde (fps) und die Bildgröße übergeben. Das letzte ist das isColor-Logo. Wenn True, benötigt der Encoder einen farbigen Rahmen, andernfalls wird er mit einem Graustufenrahmen verwendet.

FourCC ist ein 4-Byte-Code, mit dem der Video-Encoder und **** angegeben werden. Die Liste der verfügbaren Codes finden Sie auf fourcc.org, der Plattform.

In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (Es ist am besten, XVID zu verwenden. MJPG. Große Videos können generiert werden. X264 bietet sehr kleine Videos.)

In Windows: DIVX (zu testen und hinzuzufügen)

In OSX: MJPG (.mp4), DIVX (.avi), X264 (.mkv).

Der FourCC-Code wird als cv.VideoWriter_fourcc ("M", "J", "P", "G") oder cv.VideoWriter_fourcc (* 'MJPG') `von MJPG übergeben.

Der folgende Code erfasst die Kamera, dreht jedes Bild in vertikaler Richtung und speichert das Video:

	查看普通副本到剪贴板打印?
1.将numpy导入为np  
2.将cv2导入为cv  
3.cap = cv.VideoCapture(04.#定义编解码器并创建VideoWriter对象  
5.fourcc = cv.VideoWriter_fourcc(* 'XVID'6.out = cv.VideoWriter('output.avi' ,fourcc,20.0,( 640480 ))  
7.而 cap.isOpened()  
8.  ret,frame = cap.read()  
9.  如果 不退回:  
10.     打印(“无法接收帧(流的末尾?)。正在退出...” )  
11.     打破  
12. 框架= cv.flip(框架,113. #写翻转的框架  
14. out.write(框架)  
15. cv.imshow('frame' ,框架)  
16. 如果 cv.waitKey(1== ord'q' ):  
17.     打破  
18.#完成工作后释放所有内容  
19.cap.release()  
20.out.release()  
21.cv.destroyAllWindows()  

Sie können versuchen, den Effekt selbst zu demonstrieren.

Der Teil der Videoverarbeitung ist im Grunde genommen vorbei. Die obige Einführung wird eine sehr wichtige Grundlage für zukünftiges Lernen sein. Tatsächlich gibt es in OpenCV mehr Operationen für die Videoverarbeitung. Jetzt werden wir die letzte Funktion einführen:

VideoCapture.get ((

Da wir zuvor cap = cv.VideoCapture (0) angegeben haben, müssen wir nur cap.get () verwenden, um diese Funktion aufzurufen. Get leitet die Parameter um und gibt die Parametertabelle an:

Fügen Sie hier eine Bildbeschreibung ein

Es gibt 18 Parameter. Was den zugehörigen Code betrifft, experimentieren Sie bitte selbst. Sie können die Druckfunktion verwenden, um die detaillierten Informationen des Videos auszugeben.

Überprüfen Sie die Artikelzusammenfassungsseite https://blog.csdn.net/weixin_44237705/article/details/107864965
Weitere technische Informationen zu openvino können in der Gruppe ~ ausgetauscht werden
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/weixin_44237705/article/details/107933698
Empfohlen
Rangfolge