Zuvor veröffentlichte Artikel Cell Count Memorandum
Ein Skript, das die Körner zählt, die durch Tappen auf verschiedene Arten erzeugt wurden
Ich habe es tatsächlich implementiert und es geschafft, es auf ein brauchbares Niveau zu bringen, also werde ich es als Memo hinterlassen.
Der Schmutzgrad wird durch Zählen der Anzahl der Partikel in der Flüssigkeit beurteilt. Sogenannte NAS-Klasse Eine präzise Messung ist mit extrem teuren Geräten möglich. (↑ Natürlich werde ich es nicht schaffen, wenn ich das kann)
Das grobe Urteil ist jedoch ein Urteil der Person, die die Probe betrachtet. Zunächst soll eine Linie gezogen werden, um die Reichweite der Gabagaba einzugrenzen und auszugleichen.
Windows10 64bit Jupiter Notebook Python 3.6.10 opencv 3.4.2.17 numpy 1.19.0 matplotlib 3.2.2
cap_save.ipynb
import cv2
import sys
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import time
from datetime import datetime
Grundsätzlich ist die Bildverarbeitung mit opencv die Hauptaufgabe. Verwenden Sie sie daher in diesem Set.
cap_save.ipynb
#Zieleinstellung zum Speichern des aufgenommenen Bildes
dir_path_class00 = 'Geben Sie das Sicherungsverzeichnis an/01_class00'
dir_path_class0 = 'Geben Sie das Sicherungsverzeichnis an/01_class01'
#… Stellen Sie unten den erforderlichen Betrag ein
#Name der gespeicherten Bilddatei
filename1 = 'original_img'#Das Originalbild
filename2 = 'processing_img'#Verarbeitetes Bild
#Erstellen Sie ein Speicherverzeichnis(Keine Änderung)
os.makedirs(dir_path_class00,exist_ok=True)
os.makedirs(dir_path_class0,exist_ok=True)
#… Stellen Sie unten den erforderlichen Betrag ein
#Dateipfad-Join(Das Originalbild:1 und verarbeitetes Bild:2 Verwenden Sie beim Speichern den Dateinamen)
base_path_00_org = os.path.join(dir_path_class00,filename1)
base_path_00_proc = os.path.join(dir_path_class00,filename2)
base_path_0_org = os.path.join(dir_path_class0,filename1)
base_path_0_proc = os.path.join(dir_path_class0,filename2)
#… Stellen Sie unten den erforderlichen Betrag ein
#Bildspeicherdatum(* Monat * So * Stunde * Minute)
datename = datetime.now().strftime('%m%d%H%M')
#Namenseinstellung beim Speichern eines Bildes(Ändern Sie beim Ändern das entsprechende Teil)
name1 = "cell"
name2 = ".jpg "
Genau genommen handelt es sich hauptsächlich um die alte NAS-Klasse, nicht um ISO. Für das Speicherziel haben wir die Speicherziele der alten Standardklasse 00 bis Klasse 12 erstellt.
Ich wollte das Originalbild und das verarbeitete Bild (gerahmt) behalten, also habe ich zwei festgelegt.
Listen Sie danach die erforderlichen Skripte auf, um das Verzeichnis zu erstellen, und es ist in Ordnung.
cap_save.ipynb
#Laden des erkannten Bildes(Die Änderung ist am Ende ~.nur jpg)
img = cv2.imread('Geben Sie das Speicherziel und den Dateinamen des zu überprüfenden Bildes an',1)
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
Selbst wenn der aufgenommene Bildteil "cv2.VideoCapture ()" war, konnte er problemlos verarbeitet werden. (Es ist notwendig, den Verarbeitungsteil wie die tatsächliche Binärisierung zu ändern.) Ich konnte es jedoch aufgrund des Kompatibilitätsproblems zwischen der USB-Kamera für den PC, den ich implementieren wollte, und Opencv nicht erkennen. Von Bildauswahl auf Verarbeitung umgestellt. (Liegt es an der dedizierten Firmware? Ich habe den Hersteller gefragt, aber noch nicht geantwortet.)
Wenn es sich um eine USB-Kamera auf dem Markt handelt, funktioniert sie und kann problemlos verarbeitet werden. Es ist also in Ordnung. Auch mit einer PC-Kamera (● `・ ω ・) ゞ <ok!
cap_save.ipynb
#Bildgröße
w, h, = (640, 480)
#Vergrößerung
mag = 1
#Prozess 1
img_blur = cv2.GaussianBlur(img_gray,(5,5),1)
#Kernel gesetzt
kernel = np.ones((1,1),dtype=np.uint8)
img_erode = cv2.erode(img_gray,kernel)
def onTrackbar(position):
global threshold
threshold = position
cv2.namedWindow("img")
threshold = 100
cv2.createTrackbar("track","img",threshold,255,onTrackbar)
n = 0
while True:
key = cv2.waitKey(1) & 0xFF
ret, img_th = cv2.threshold(img_blur,threshold,255,cv2.THRESH_BINARY)
__,contours, hierarchy = cv2.findContours(img_th.astype(np.uint8),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img_raw = cv2.resize(img,(w*mag, h*mag))
img_cut = cv2.drawContours(img_raw, contours, -1,(0,255,255),1)
#print(len(contours))
cv2.imshow("img",img_th)
cv2.imshow("scr",img_cut)
if key == ord('a'):
answer = len(contours)
print("Die Zählnummer ist:",answer,"Stücke")
if key == 27:
break
Als eines der Probleme wird der Schwellenwert zum Zeitpunkt der Konturerkennung angegeben, aber wenn dies mit einem festen Wert erfolgt, ist dies unvermeidlich. Es gab ein Problem, dass die Kontur je nach Bild nicht erkannt wurde. Erstellt so, dass der Schwellenwert von der Spurleiste geändert wird.
Dieser Bereich wurde unter Bezugnahme auf Udemys Kurs erstellt.
Danach war es aufgrund der Beziehung zwischen der Linsenvergrößerung und der Anzahl der Pixel der Messvorrichtung möglich, bis zu einem gewissen Grad durch Erodierverarbeitung zu erfassen. Ich füge hinzu.
Ich denke, dass dieser Bereich verwaltet werden kann, indem er abhängig vom erkannten Objekt geändert wird. Danach wird die Anzahl der erkannten Konturen auf "len (Konturen)" gesetzt, wenn die Kontur erkannt wird.
Ich hatte die schwerste Zeit hier. Apropos Zufriedenheit: Der große äußere Rahmen des Bildes, das Sie erkennen möchten, wurde ebenfalls gezählt. Um ehrlich zu sein, es ist subtil, aber ich habe aufgegeben, weil es jetzt die Grenze in meinem Kopf ist.
Wenn Sie die Spurleiste so bewegen, können Sie vorerst anhand der Konturerkennung zählen.
cap_save.ipynb
if answer == 1:
cv2.imwrite((base_path_00_org + "_" + str(answer) + "cell" + "_" + datename + str(n) + ".jpg "),img)
cv2.imwrite((base_path_00_proc + "_" + str(answer) + "cell" + "_" + datename + str(n) + ".jpg "),img_cut)
n += 1
print("nas grad ist:Es entspricht 00.")
elif answer == 2:
cv2.imwrite((base_path_0_org + "_" + str(answer) + name1 + "_" + datename + str(n) + name2),img)
cv2.imwrite((base_path_0_proc + "_" + str(answer) + name1 + "_" + datename + str(n) + name2),img_cut)
n += 1
print("nas grad ist:Es entspricht 0.")
elif 3 <= answer < 5:
cv2.imwrite((base_path_1_org + "_" + str(answer) + name1 + "_" + datename + str(n) + name2),img)
cv2.imwrite((base_path_1_proc + "_" + str(answer) + name1 + "_" + datename + str(n) + name2),img_cut)
n += 1
print("nas grad ist:Es entspricht 1.")
… Stellen Sie anschließend den erforderlichen Betrag ein.
elif 5780 <= answer:
cv2.imwrite((base_path_12_org + "_" + str(answer) + name1 + "_" + datename + str(n) + name2),img)
cv2.imwrite((base_path_12_proc + "_" + str(answer) + name1 + "_" + datename + str(n) + name2),img_cut)
n += 1
print("nas grad ist:Es entspricht 12.")
cv2.destroyAllWindows()
Beziehen Sie sich für den Schwellenwert (Sollwert), der der Beurteilung zugrunde liegt, auf die NAS-Klassenklasse. Genau genommen ist es unmöglich, eine genaue Beurteilung vorzunehmen, ohne eine Beurteilung anhand der Größe und Anzahl der erkannten Objekte vorzunehmen. Denn der Zweck ist es, ein einfaches Urteil zu fällen und eine Linie zu ziehen, um menschliche Fehler so weit wie möglich auszugleichen. Wir benötigen diese Genauigkeit nicht.
Wenn Sie bis zu diesem Punkt laufen, werden die Anzahl der Objekte, deren Konturen erkannt wurden, und das Bewertungsergebnis angezeigt. Es wird im entsprechenden Verzeichnis gespeichert.
Mit diesem Skript ist es möglich, Linien mit bestimmten numerischen Werten zu zeichnen. Ich denke, wir konnten die Variation bis zu einem gewissen Grad unterdrücken.
Ziel ist jedoch ein einfaches One-Shot-Urteil Sammeln Sie Bilddaten bis zu einem gewissen Grad und erstellen Sie Trainingsdaten basierend auf diesen Daten Ziel ist es, durch Argumentation ein Urteil zu fällen.
Immerhin tut es weh, dass ich die GUI nicht implementieren konnte. Wie immer war es eine Aufgabe, die ich nicht verstehen konnte und weinte.
das ist alles.
Recommended Posts