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.
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.
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)
Zuerst habe ich das Warnbild online heruntergeladen.
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.
Damit ist die Bildvorbereitung abgeschlossen.
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.
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.
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