[PYTHON] Versuchen Sie, Bilder und Webkameras zu verarbeiten. Teil 3 ~ Mosaikverarbeitung ~

Einführung

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

Modul, Verzeichnisstruktur usw.

Modul

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

Verzeichnisaufbau

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 fruit.jpg

Bildmosaik

Verkleinern Sie den Teil, den Sie mosaikieren möchten, und stellen Sie ihn wieder her

Programm

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()

Ein kleiner Kommentar

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

Ausgabeergebnis

Befehlszeile gazou3.PNG

Bildmosaik Wenn Verhältnis = 0,1 fruit_mosaic_01.jpg

Wenn Verhältnis = 0,9 fruit_mosaic_06.jpg

Webkameramosaik

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.

Programm

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()

Ein kleiner Kommentar

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!

Ausgabeergebnis

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 ...) hue.PNG

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 (˘ω˘)

Recommended Posts

Versuchen Sie, Bilder und Webkameras zu verarbeiten. Teil 3 ~ Mosaikverarbeitung ~
Verarbeitung und Beurteilung des Datenanalyseplans (Teil 1)
Verarbeitung und Beurteilung des Datenanalyseplans (Teil 2)