J'ai commencé à étudier Python et OpenCV. À ce moment-là, les informations sur Qiita étaient très utiles, donc je les posterai comme un résumé de ce que j'ai appris. C'est la première fois que je publie un message, donc je pense qu'il y a quelque chose qui ne va pas, mais j'espère que cela sera utile à ceux qui liront ceci.
C'est une application qui reconnaît le smartphone placé sur le bureau par correspondance de modèle, juge si l'alimentation est allumée à partir de la luminosité proche du centre et avertit si l'alimentation est allumée pendant un certain temps.
--Caméra WEB UCAM-C520FEBK
Chaque module peut être facilement installé à l'aide de pip. Je me suis référé au site suivant pour savoir comment le faire. https://qiita.com/fiftystorm36/items/1a285b5fbf99f8ac82eb (opencv-python, numpy) https://techacademy.jp/magazine/18963 (PyInstaller)
Tout d'abord, j'ai téléchargé l'image d'avertissement en ligne.
https://ameblo.jp/ufcrekishi/entry-10967280575.html
De plus, l'image modèle a été acquise à l'aide du programme suivant.
temp.py
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
#Lire l'image de la caméra Web et la faire pivoter
ret, frame = cap.read()
img1 = cv2.flip(frame, -1)
cv2.imshow("img", img1)
#Appuyez sur Echap pour enregistrer et quitter
k = cv2.waitKey(0)
if k == 27:
cv2.imwrite('model.png',img1)
break
cap.release()
cv2.destroyAllWindows()
Cela devrait vous donner model.png. À partir de maintenant, si vous ne coupez que la partie du smartphone, vous obtiendrez ce qui suit.
Ceci termine la préparation de l'image.
La position du smartphone a été acquise par le programme suivant.
caution.py
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
#Lire et faire pivoter l'image de la caméra Web
ret, frame = cap.read()
img = cv2.flip(frame, -1)
#Lire l'image du smartphone prise à l'avance
temp = cv2.imread('model.png')
#Exécuter le modèle correspondant
#La méthode de comparaison est cv2.TM_CCOEFF_Sélectionnez NORMED
result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED)
#Obtenez la position et la valeur de la zone de détection à partir du résultat de la détection
#La position supérieure gauche de la zone à forte similitude est max._loc
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
#Obtenez les positions en bas à droite et au centre des zones à forte similitude
#Utilisez la position de boucle précédente si la correspondance échoue
if max_loc[0] < img.shape[1] - temp.shape[1] and \
max_loc[1] < img.shape[0] - temp.shape[0]:
topleft_x, topleft_y = max_loc
h, w = temp.shape[:2]
bottom_right = (topleft_x + w, topleft_y + h)
center = (topleft_x + w / 2, topleft_y + h / 2)
print(center)
#Afficher la zone de détection entourée d'un rectangle bleu
result = img
cv2.rectangle(result,(topleft_x, topleft_y), bottom_right, (255, 0, 0), 2)
cv2.imshow("img", result)
#Attendez 1 seconde et terminez quand il y a une entrée de la touche Echap
k = cv2.waitKey(1000)
if k == 27:
cv2.imwrite("temp.png ", result)
break
cap.release()
cv2.destroyAllWindows()
Si la correspondance des modèles n'est pas possible au préalable, le centre ne peut pas être imprimé et une erreur se produit, il est donc nécessaire de mettre d'abord l'appareil hors tension. Si la correspondance des modèles est bien effectuée, elle devrait être la suivante.
Le programme suivant détermine si l'appareil est sous tension et affiche une image d'avertissement indiquant que l'appareil est allumé pendant une longue période.
caution.py
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
count = 0
while(True):
#Lire et faire pivoter l'image de la caméra Web
ret, frame = cap.read()
img = cv2.flip(frame, -1)
#Lire l'image du smartphone prise à l'avance
temp = cv2.imread('model.png')
#Exécuter le modèle correspondant
#La méthode de comparaison est cv2.TM_CCOEFF_Sélectionnez NORMED
result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED)
#Obtenez la position et la valeur de la zone de détection à partir du résultat de la détection
#La position supérieure gauche de la zone à forte similitude est max._loc
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
#Obtenez les positions en bas à droite et au centre des zones à forte similitude
#Utilisez la position de boucle précédente si la correspondance échoue
if max_loc[0] < img.shape[1] - temp.shape[1] and \
max_loc[1] < img.shape[0] - temp.shape[0]:
topleft_x, topleft_y = max_loc
h, w = temp.shape[:2]
bottom_right = (topleft_x + w, topleft_y + h)
center = (topleft_x + w / 2, topleft_y + h / 2)
print(center)
#Conversion HSV
hsv_image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#Déterminez si vous utilisez un smartphone en fonction de la luminosité au centre des points acquis et comptez lors de son utilisation.
#La luminosité environnante est également utilisée pour éviter les faux positifs
value = 0
for i in range(-15, 16):
for j in range(-15, 16):
value = value + hsv_image[int(center[0]) + i][int(center[1]) + j][2]
v_ave = value / 961
if v_ave > 200:
print("ON,luminosité:", v_ave)
count = count + 5
else:
print("OFF,luminosité:", v_ave)
#Afficher la zone de détection entourée d'un rectangle bleu
#La position centrale est indiquée par un cercle rouge
result = img
cv2.rectangle(result,(topleft_x, topleft_y), bottom_right, (255, 0, 0), 2)
cv2.circle(result, (int(center[0]), int(center[1])), 5, (0, 0, 255))
cv2.imshow("img", result)
#Afficher une image lorsque le nombre dépasse un certain niveau
if count > 50:
img4 = cv2.imread('studyordie.jpg')
cv2.imshow('studyordie', img4)
cv2.moveWindow('studyordie', 555, 0)
cv2.waitKey(0)
count = 0
break
print("count = ", count)
count = count - 1
if count < 0:
count = 0
#Attendez 1 seconde et terminez quand il y a une entrée de la touche Echap
k = cv2.waitKey(1000)
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
Si vous faites cela, vous devriez voir une console comme celle ci-dessous en même temps que l'image correspondante. Une image d'avertissement s'affiche lorsque la valeur de ce comptage dépasse 50.
(157.0, 193.0)
OFF,Luminosité: 159.49739854318418
count = 0
(225.0, 260.0)
ON,Luminosité: 203.90426638917793
count = 15
Ici, lors du calcul de la luminosité, la moyenne est prise pour un carré de 31 x 31 centré sur le centre de correspondance, mais s'il ne s'agit que d'un seul point, est-ce le reflet de la lampe fluorescente? Parce qu'une valeur élevée a été renvoyée. Je pense que la valeur du seuil changera en fonction de l'environnement dans lequel il est utilisé.
Je voulais pouvoir l'utiliser simplement en double-cliquant sur le raccourci sur le bureau, alors je l'ai transformé en un exe. Avec Pyinstaller installé
pyinstaller caution.py --onefile
Il peut être converti en exe avec la commande de. Veuillez noter que vous devez mettre l'image préparée dans le dossier dist après l'avoir convertie en exe. Créez un raccourci et collez-le sur votre bureau et vous avez terminé.
Recommended Posts