[PYTHON] Ich habe eine App erstellt, die mich warnt, wenn ich während des Studiums mit OpenCV mit meinem Smartphone herumspiele

Einführung

Ich habe angefangen, Python und OpenCV zu studieren. Zu dieser Zeit waren die Informationen zu Qiita sehr hilfreich, daher werde ich sie als Zusammenfassung meiner Erkenntnisse veröffentlichen. Es ist mein erstes Mal, dass ich etwas poste, also denke ich, dass etwas nicht stimmt, aber ich hoffe, dass es für diejenigen hilfreich ist, die dies lesen.

Was wurde gemacht

k2d6r-vmxjj.gif

Es handelt sich um eine Anwendung, die das auf dem Schreibtisch platzierte Smartphone anhand der Vorlagenübereinstimmung erkennt, anhand der Helligkeit in der Nähe der Mitte beurteilt, ob das Gerät eingeschaltet ist, und warnt, ob das Gerät für einen bestimmten Zeitraum eingeschaltet ist.

Was ich benutzt habe

Jedes Modul kann einfach mit pip installiert werden. Ich habe auf die folgende Seite verwiesen, um zu erfahren, wie es geht. https://qiita.com/fiftystorm36/items/1a285b5fbf99f8ac82eb (opencv-python, numpy) https://techacademy.jp/magazine/18963 (PyInstaller)

Entwicklungsfluss

  1. Bereiten Sie ein Bild für die Warnung und ein Bild für den Vorlagenabgleich vor
  2. Führen Sie einen Vorlagenabgleich zwischen dem von der WEB-Kamera aufgenommenen Bild und dem vorbereiteten Bild durch, damit die Position des Smartphones erfasst werden kann.
  3. Wenn die Helligkeit in der Nähe der Mitte des Smartphones über einem bestimmten Schwellenwert liegt, wird beurteilt, dass das Gerät eingeschaltet ist, und wenn es eine bestimmte Anzahl von Malen zählt, wird ein Warnbild angezeigt.
  4. Machen Sie die erstellte Datei zu einer Exe

Bildvorbereitung

Zuerst habe ich das Warnbild online heruntergeladen. studyordie2.jpg

https://ameblo.jp/ufcrekishi/entry-10967280575.html

Zusätzlich wurde das Vorlagenbild mit dem folgenden Programm aufgenommen.

temp.py


import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
	#Lesen Sie das Bild der Webkamera und drehen Sie es
	ret, frame = cap.read()
	img1 = cv2.flip(frame, -1)
	cv2.imshow("img", img1)

	#Drücken Sie Esc, um zu speichern und zu beenden
	k = cv2.waitKey(0)

	if k == 27:
		cv2.imwrite('model.png',img1)
		break

cap.release()
cv2.destroyAllWindows()

Dies sollte Ihnen model.png geben. Wenn Sie von nun an nur noch den Teil des Smartphones zuschneiden, erhalten Sie Folgendes. model.png

Damit ist die Bildvorbereitung abgeschlossen.

Holen Sie sich die Position Ihres Smartphones

Die Position des Smartphones wurde mit dem folgenden Programm erfasst.

caution.py


import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
	#Lesen Sie das Bild der Webkamera und drehen Sie es
	ret, frame = cap.read()
	img = cv2.flip(frame, -1)
	
	#Lesen Sie das Bild des Smartphones im Voraus
	temp = cv2.imread('model.png')
	
	#Führen Sie die passende Vorlage aus
	#Die Vergleichsmethode ist cv2.TM_CCOEFF_Wählen Sie NORMED
	result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED)

	#Ermitteln Sie die Position und den Wert des Erkennungsbereichs aus dem Erkennungsergebnis
	#Die obere linke Position des Bereichs mit hoher Ähnlichkeit beträgt max_loc
	min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

	#Holen Sie sich die untere rechte und mittlere Position von Bereichen mit hoher Ähnlichkeit
	#Verwenden Sie die vorherige Schleifenposition, wenn die Übereinstimmung nicht erfolgreich ist
	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)

	#Zeigen Sie den Erkennungsbereich an, der von einem blauen Rechteck umgeben ist
	result = img
	cv2.rectangle(result,(topleft_x, topleft_y), bottom_right, (255, 0, 0), 2)
	cv2.imshow("img", result)

	#Warten Sie 1 Sekunde und beenden Sie den Vorgang, wenn eine Esc-Taste eingegeben wurde
	k = cv2.waitKey(1000)
	if k == 27:
		cv2.imwrite("temp.png ", result)
		break

cap.release()
cv2.destroyAllWindows()

Wenn der Vorlagenabgleich zuerst nicht möglich ist, kann die Mitte nicht gedruckt werden und es tritt ein Fehler auf. Daher muss zuerst die Stromversorgung ausgeschaltet werden. Wenn der Vorlagenabgleich gut durchgeführt wurde, sollte er wie folgt aussehen. temp.png

Beurteilung, ob die Stromversorgung eingeschaltet ist, anhand der Helligkeit

Das folgende Programm ermittelt, ob das Gerät eingeschaltet ist, und zeigt eine Bildwarnung an, dass das Gerät längere Zeit eingeschaltet ist.

caution.py


import numpy as np
import cv2

cap = cv2.VideoCapture(0)
count = 0

while(True):
	#Lesen Sie das Bild der Webkamera und drehen Sie es
	ret, frame = cap.read()
	img = cv2.flip(frame, -1)
	
	#Lesen Sie das Bild des Smartphones im Voraus
	temp = cv2.imread('model.png')
	
	#Führen Sie die passende Vorlage aus
	#Die Vergleichsmethode ist cv2.TM_CCOEFF_Wählen Sie NORMED
	result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED)

	#Ermitteln Sie die Position und den Wert des Erkennungsbereichs aus dem Erkennungsergebnis
	#Die obere linke Position des Bereichs mit hoher Ähnlichkeit beträgt max_loc
	min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

	#Holen Sie sich die untere rechte und mittlere Position von Bereichen mit hoher Ähnlichkeit
	#Verwenden Sie die vorherige Schleifenposition, wenn die Übereinstimmung nicht erfolgreich ist
	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)

	#HSV-Umstellung
	hsv_image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

	#Bestimmen Sie anhand der Helligkeit in der Mitte der erfassten Punkte, ob Sie ein Smartphone verwenden, und zählen Sie, wenn Sie es verwenden.
	#Die Umgebungshelligkeit wird auch verwendet, um Fehlalarme zu verhindern
	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,Helligkeit:", v_ave)
		count = count + 5
	else:
		print("OFF,Helligkeit:", v_ave)

	#Zeigen Sie den Erkennungsbereich an, der von einem blauen Rechteck umgeben ist
	#Die Mittelposition wird durch einen roten Kreis angezeigt
	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)

	#Zeigen Sie ein Bild an, wenn die Anzahl einen bestimmten Wert überschreitet
	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

	#Warten Sie 1 Sekunde und beenden Sie den Vorgang, wenn eine Esc-Taste eingegeben wurde
	k = cv2.waitKey(1000)
	if k == 27:
		break

cap.release()
cv2.destroyAllWindows()

Wenn Sie dies tun, sollten Sie gleichzeitig mit dem passenden Bild eine Konsole wie die folgende sehen. Ein Warnbild wird angezeigt, wenn der Wert dieser Anzahl 50 überschreitet.

(157.0, 193.0)
OFF,Helligkeit: 159.49739854318418
count =  0
(225.0, 260.0)
ON,Helligkeit: 203.90426638917793
count =  15

Hier wird bei der Berechnung der Helligkeit der Durchschnitt für ein Quadrat von 31 x 31 genommen, das in der Mitte der Übereinstimmung zentriert ist. Wenn dies jedoch nur ein Punkt ist, ist es die Reflexion der Leuchtstofflampe? Weil ein großer Wert zurückgegeben wurde. Ich denke, dass sich der Wert des Schwellenwerts abhängig von der Umgebung ändert, in der er verwendet wird.

exe Umwandlung

Ich wollte es nur durch Doppelklicken auf die Verknüpfung auf dem Desktop verwenden können, also habe ich es zu einer Exe gemacht. Mit installiertem Pyinstaller

pyinstaller caution.py --onefile

Es kann mit dem Befehl von in exe konvertiert werden. Bitte beachten Sie, dass Sie das vorbereitete Bild nach dem Konvertieren in exe in den Ordner dist legen müssen. Erstellen Sie eine Verknüpfung und fügen Sie sie auf Ihrem Desktop ein. Fertig.

Recommended Posts

Ich habe eine App erstellt, die mich warnt, wenn ich während des Studiums mit OpenCV mit meinem Smartphone herumspiele
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Ich habe eine KI erstellt, die aus Trivia vorhersagt, und mich dazu gebracht, auf meine Trivia zu schließen. Hee-AI
Ich habe eine Online-Frequenzanalyse-App erstellt
Beim Speichern mit OpenCV ist ein Fehler aufgetreten
Ich habe ein Extenum-Paket erstellt, das die Enumeration erweitert
Erstellen Sie eine App, die Schüler mit Python errät
Ich habe meinen Hund "Monaka Bot" mit Line Bot gemacht
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).