[PYTHON] Essayez de traiter les images et les caméras Web Partie 3 ~ Traitement de la mosaïque ~

introduction

J'ai essayé de traiter des images et des caméras Web en utilisant Python Partie 3

Suite de la période précédente , images (vidéo) utilisant ** OpenCV ** ) J'ai essayé de traiter Cette fois, le processus d'ajout d'une mosaïque à l'image et à l'image de la caméra Web!

La description de l'article est la suivante

Module, structure de répertoires, etc.

module

Utilisez le même module que la dernière fois Installez-le si vous en avez besoin!

pip install opencv-python #Requis lors de l'utilisation des fonctionnalités OpenCV(Utilisé avec cv2 sur python)
pip install numpy         #Module d'extension pour un calcul numérique efficace
pip install os            #Vous pouvez utiliser des fonctions qui dépendent du système d'exploitation

Structure du répertoire

La structure des répertoires est la suivante

-- rgb.py
   -- camera_mosaic.py # new
   -- color_process.py
   -- photo_process.py
   -- photo_mosaic.py  # new
   -- rgb.py
   -- img
      -- fruit.jpg

La photo utilise des fruits comme avant fruit.jpg

Mosaïque d'images

Réduisez la partie à mosaïquer et restaurez-la

programme

photo_mosaic.py


import cv2
import os

PATH = './img'
FILES = os.listdir(PATH)

OLD_WINDOW_NAME = 'old'
NEW_WINDOW_NAME = 'new'
ratio = 0.1 #Rugosité de la mosaïque

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

#Traitement de la mosaïque
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)

#Définir la partie mosaïque
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]

    #Chargez l'image d'origine
    old_img = cv2.imread(PATH + '/'+ old_file_name)
    
    #Mosaïque
    new_img = mosaic_area(old_img, 100, 50, 100, 150)
    
    #Créer une fenêtre
    cv2.namedWindow(OLD_WINDOW_NAME)
    cv2.namedWindow(NEW_WINDOW_NAME)

    #Afficher dans la fenêtre
    cv2.imshow(OLD_WINDOW_NAME, old_img)
    cv2.imshow(NEW_WINDOW_NAME, new_img)

    #Enregistrer dans un fichier
    cv2.imwrite(r'img/{}'.format(new_file_name), new_img)

    #Terminer le traitement
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Un petit commentaire

dst = src.copy()

Copier src (image originale) vers dst (image traitée) Au début, j'ai codé comme suit et j'ai eu mal à la tête ... dst = src

dst[y:y + height, x:x + width] = mosaic(dst[y:y + height, x:x + width])

Traitement pour changer la plage spécifiée par dst en l'image envoyée depuis la fonction mosaïque Notez que x et y sont inversés!

small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)

Redimensionner l'image avec cv2.resize Plus le rapport est petit, plus la mosaïque est grossière, et plus le rapport est grand, plus la mosaïque est fine.

INTER_NEAREST est la méthode d'interpolation du plus proche voisin Comment utiliser le pixel le plus proche tel quel

return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)

Revenir à la taille d'origine Obtenez la forme du tableau avec src.shape Cette fois, c'est (150, 100, 3), donc c'est un tableau 100x3 150 dimensions. Lorsque cela est traité, cela devient comme suit

src.shape => (150, 100, 3)
src.shape[:2] => (150, 100)
src.shape[:2][::-1] => (100, 150) 

Cela semble revenir à la taille d'origine

Résultat de sortie

Ligne de commande gazou3.PNG

Mosaïque d'images Lorsque le ratio = 0,1 fruit_mosaic_01.jpg

Lorsque le ratio = 0,9 fruit_mosaic_06.jpg

Mosaïque de la caméra Web

J'ai essayé de mettre toute la mosaïque dans la vidéo à l'aide de la webcam Pour mosaïquer le tout, effectuez le traitement de la mosaïque sans passer par la fonction mosaic_area.

programme

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()
        #Mosaïque
        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()

Un petit commentaire

cap = cv2.VideoCapture(0)

Lire la vidéo ou l'image de la caméra Entrez le chemin vidéo entre () pour charger les données vidéo

Dans le cas des images de caméra, 0 est la caméra intégrée, 1 est la caméra USB ...?

ret, old_frame = cap.read()

Chargez la vidéo chargée image par image True / False est entré pour ret S'il n'est pas lu correctement, ret = False et il sera tué.

1 image de trame est entrée dans old_flame En bouclant avec l'instruction while, cela devient une vidéo

k = cv2.waitKey(1) if k == 27: break

Pour la fin du programme J'utilise habituellement cv2.waitKey (0), Pour la vidéo, utilisez cv2.waitKey (1)

S'échapper de while uniquement lorsque k == 27 (appuyez sur la touche Echap) Si vous mettez print (k) avant l'instruction if, vous pouvez trouver le numéro du bouton, veuillez donc utiliser le numéro que vous voulez!

Résultat de sortie

python camera_mosaic.py

Lorsque vous exécutez le script ci-dessus, la caméra Web avec mosaïque devrait commencer à se déplacer.

(Pour une raison quelconque, je n'ai pas pu joindre le GIF, donc s'il vous plaît voir l'image fixe de HUE-chan ...) hue.PNG

Il n'y a pas eu de retard dans la caméra Web plus que ce à quoi je m'attendais, donc je pense que je peux faire diverses choses avec cela La prochaine fois, je prévois de créer un programme qui reconnaît les visages et applique des mosaïques (˘ω˘)

Recommended Posts

Essayez de traiter les images et les caméras Web Partie 3 ~ Traitement de la mosaïque ~
Traitement et jugement de la collecte du plan d'analyse des données (partie 1)
Traitement et jugement de la collecte du plan d'analyse des données (partie 2)