[PYTHON] J'ai créé une application qui m'avertit si je joue avec mon smartphone pendant mes études avec OpenCV

introduction

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.

Ce qui a été fait

k2d6r-vmxjj.gif

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.

Ce que j'ai utilisé

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

Flux de développement

  1. Préparez une image à utiliser pour l'avertissement et une image à utiliser pour la mise en correspondance des modèles
  2. Effectuez une correspondance de modèle entre l'image acquise par la caméra WEB et l'image préparée afin que la position du smartphone puisse être acquise.
  3. Lorsque la luminosité près du centre du smartphone est supérieure à un certain seuil, il est jugé que l'alimentation est allumée et lorsqu'elle compte un certain nombre de fois, une image d'avertissement s'affiche.
  4. Transformez le fichier créé en un exe

Préparation de l'image

Tout d'abord, j'ai téléchargé l'image d'avertissement en ligne. studyordie2.jpg

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. model.png

Ceci termine la préparation de l'image.

Obtenez la position de votre smartphone

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. temp.png

Juger si le pouvoir est allumé à partir de la luminosité

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é.

conversion exe

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

J'ai créé une application qui m'avertit si je joue avec mon smartphone pendant mes études avec OpenCV
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
J'ai créé une IA qui prédit des anecdotes et m'a fait déduire mes anecdotes. Hee-AI
J'ai créé une application d'analyse de fréquence en ligne
J'ai eu une erreur lors de l'enregistrement avec OpenCV
J'ai créé un package extenum qui étend enum
Créez une application qui devine les étudiants avec Python
J'ai fait mon chien "Monaka Bot" avec Line Bot
J'ai créé une application Twitter qui décrypte les caractères de pré-connexion avec heroku (échec)