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
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
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
Réduisez la partie à mosaïquer et restaurez-la
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()
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
Ligne de commande
Mosaïque d'images Lorsque le ratio = 0,1
Lorsque le ratio = 0,9
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.
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()
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!
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 ...)
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 (˘ω˘)