Ich habe versucht, Bilder und Webkameras mit Python Part 3 zu verarbeiten
Fortsetzung der vorherigen Zeit , Bilder (Video) mit ** OpenCV ** ) Ich habe versucht zu verarbeiten Diesmal der Vorgang des Hinzufügens eines Mosaiks zum Bild und zum Bild der Webkamera!
Die Artikelbeschreibung lautet wie folgt
Verwenden Sie das gleiche Modul wie beim letzten Mal Installieren Sie es, wenn Sie es brauchen!
pip install opencv-python #Erforderlich bei Verwendung von OpenCV-Funktionen(Wird mit cv2 auf Python verwendet)
pip install numpy #Erweiterungsmodul zur effizienten numerischen Berechnung
pip install os #Sie können Funktionen verwenden, die vom Betriebssystem abhängen
Die Verzeichnisstruktur ist wie folgt
-- rgb.py
-- camera_mosaic.py # new
-- color_process.py
-- photo_process.py
-- photo_mosaic.py # new
-- rgb.py
-- img
-- fruit.jpg
Das Foto verwendet Früchte wie zuvor
Verkleinern Sie den Teil, den Sie mosaikieren möchten, und stellen Sie ihn wieder her
photo_mosaic.py
import cv2
import os
PATH = './img'
FILES = os.listdir(PATH)
OLD_WINDOW_NAME = 'old'
NEW_WINDOW_NAME = 'new'
ratio = 0.1 #Mosaikrauheit
# get file name
def get_file_name():
print('*** All Pictures ***')
print(*FILES, sep='\n')
print('*** End ***')
while True:
file_name = input('Which use file name ?: ')
if file_name in FILES:
return file_name
else:
print('not exist: ' + file_name)
#Mosaikverarbeitung
def mosaic(src):
small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
#Stellen Sie den Mosaikteil ein
def mosaic_area(src, x, y, width, height):
dst = src.copy()
dst[y:y + height, x:x + width] = mosaic(dst[y:y + height, x:x + width])
return dst
if __name__ == '__main__':
old_file_name = get_file_name()
file_prefixes = old_file_name.rsplit('.', 1)
new_file_name = file_prefixes[0] + '_mosaic.' + file_prefixes[1]
#Laden Sie das Originalbild
old_img = cv2.imread(PATH + '/'+ old_file_name)
#Mosaik
new_img = mosaic_area(old_img, 100, 50, 100, 150)
#Erstellen Sie ein Fenster
cv2.namedWindow(OLD_WINDOW_NAME)
cv2.namedWindow(NEW_WINDOW_NAME)
#Im Fenster anzeigen
cv2.imshow(OLD_WINDOW_NAME, old_img)
cv2.imshow(NEW_WINDOW_NAME, new_img)
#Speichern unter
cv2.imwrite(r'img/{}'.format(new_file_name), new_img)
#Verarbeitung beenden
cv2.waitKey(0)
cv2.destroyAllWindows()
dst = src.copy()
Kopiere src (Originalbild) nach dst (verarbeitetes Bild)
Zuerst habe ich wie folgt codiert und hatte Kopfschmerzen ...
dst = src
dst[y:y + height, x:x + width] = mosaic(dst[y:y + height, x:x + width])
Verarbeitung zum Ändern des von dst angegebenen Bereichs in das von der Mosaikfunktion gesendete Bild Beachten Sie, dass x und y umgekehrt sind!
small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
Ändern Sie die Bildgröße mit cv2.resize Je kleiner das Verhältnis, desto gröber das Mosaik und je größer das Verhältnis, desto feiner das Mosaik.
INTER_NEAREST ist die Interpolationsmethode für den nächsten Nachbarn So verwenden Sie das nächste Pixel so wie es ist
return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
Zurück zur Originalgröße Holen Sie sich die Form des Arrays mit src.shape Diesmal ist es (150, 100, 3), also ein 150x3 150-dimensionales Array. Wenn dies verarbeitet wird, wird es wie folgt
src.shape => (150, 100, 3)
src.shape[:2] => (150, 100)
src.shape[:2][::-1] => (100, 150)
Dies scheint zur ursprünglichen Größe zurückzukehren
Befehlszeile
Bildmosaik Wenn Verhältnis = 0,1
Wenn Verhältnis = 0,9
Ich habe versucht, das gesamte Mosaik mit der Webkamera in das Video einzufügen Um das Ganze zu mosaikieren, führen Sie die Mosaikverarbeitung durch, ohne die Funktion mosaic_area zu durchlaufen.
camera_mosaic.py
import cv2
cap = cv2.VideoCapture(0)
ratio = 0.1
def mosaic(src):
small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
if __name__ == '__main__':
while True:
ret, old_frame = cap.read()
copy_frame = old_frame .copy()
#Mosaik
new_frame = mosaic(copy_frame)
cv2.imshow('OldRawFrame', old_frame)
cv2.imshow('NewRawFrame', new_frame)
k = cv2.waitKey(1)
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
cap = cv2.VideoCapture(0)
Video oder Kamerabild lesen Geben Sie den Videopfad in () ein, um die Videodaten zu laden
Bei Kamerabildern ist 0 die eingebaute Kamera, 1 die USB-Kamera ...?
ret, old_frame = cap.read()
Laden Sie das geladene Video Frame für Frame True / False wird für ret eingegeben Wenn es nicht richtig gelesen wird, ist ret = False und es wird getötet.
1 Bildbilddaten werden in old_flame eingegeben Durch Schleifen mit der while-Anweisung wird ein Video erstellt
k = cv2.waitKey(1) if k == 27: break
Zur Programmbeendigung
Ich benutze normalerweise cv2.waitKey (0)
,
Verwenden Sie für Videos "cv2.waitKey (1)"
Entkomme nur dann, wenn k == 27 ist (drücke die Esc-Taste) Wenn Sie print (k) vor die if-Anweisung setzen, finden Sie die Schaltflächennummer. Verwenden Sie also eine beliebige Nummer!
python camera_mosaic.py
Wenn Sie das obige Skript ausführen, sollte sich die Webkamera mit Mosaik bewegen.
(Aus irgendeinem Grund konnte ich das GIF nicht anhängen, siehe HUE-chans Standbild ...)
Es gab keine Verzögerung in der Webkamera mehr als ich erwartet hatte, also denke ich, dass ich damit verschiedene Dinge machen kann Das nächste Mal plane ich ein Programm zu erstellen, das Gesichter erkennt und Mosaike anwendet (˘ω˘)