[PYTHON] Ich habe die Körner gezählt

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.

Zweck

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.

Erstellungsumgebung

Windows10 64bit Jupiter Notebook Python 3.6.10 opencv 3.4.2.17 numpy 1.19.0 matplotlib 3.2.2

Bibliothek

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.

Bild speichern

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.

Bildspezifikation lesen

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!

Teil bearbeiten

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.

2020-09-03.png

Wenn Sie die Spurleiste so bewegen, können Sie vorerst anhand der Konturerkennung zählen.

Beurteilung anhand der Anzahl der Zählungen

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.

Zusammenfassung

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

Ich habe die Körner gezählt
Ich zählte Tschüss Mann
Ich habe den Gerätebaum untersucht
Ich habe versucht, die Qiita-API zu berühren
Ich habe die Changefinder-Bibliothek ausprobiert!
Ich habe die Python-Quelle heruntergeladen
Ich habe SHAPs Zeitung gelesen
Ich habe das TensorFlow-Tutorial als erstes ausprobiert
Ich habe mich im Labyrinth verlaufen
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Ich habe an der ISUCON10-Qualifikationsrunde teilgenommen!
Ich habe das 2. TensorFlow-Tutorial ausprobiert
Ich habe untersucht, wie das Zielfernrohr aussieht
Ich mochte den Tweet mit Python. ..
Ich habe die Warteschlange in Python geschrieben
Ich habe die neuartige API von Naruro ausprobiert
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, die checkio-API zu verwenden
Ich habe den Stack in Python geschrieben
Ich habe versucht, den Abschnitt zu schätzen.
Ich kenne den Wertfehler nicht
Ich habe die Gerätebaumüberlagerung untersucht
Ich habe den Betrag der Schenkungssteuer überprüft
TensorFlow Tutorial Ich habe MNIST 3rd ausprobiert
Ich ließ die Schönheitskonferenz von Google-Home durchführen
Ich möchte Spyder an die Taskleiste anheften
Ich habe den Inhalt des Docker-Volumes überprüft
Ich möchte kühl auf die Konsole ausgeben
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe zum ersten Mal Tensorflow ausprobiert
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Ich möchte mit dem Reim Teil1 umgehen
Die Ordnerstruktur von Flask ist zusammengefasst
Ich bin auf die Hatena Keyword API gestoßen
Ich möchte mit dem Reim part3 umgehen
Ich habe das OSS-Visualisierungstool superset ausprobiert
Ich kannte die Grundlagen von Python nicht
(Jetzt) Ich habe versucht, das neue Koronavirus (COVID-19) zu analysieren.
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, die verkratzten Daten in CSV zu speichern!
Schriftliche Auswahlsortierung in C.
Ich kann das Element in Selen nicht bekommen!
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
[Python] Ich habe die grundlegende Grammatik persönlich zusammengefasst.
Ich habe versucht, die COTOHA-API zu berühren
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Die Python-Projektvorlage, an die ich denke.
Pythons "Ich kann den juckenden Ort nicht erreichen ..."
[Python-Anfänger] Ich habe die Artikel gesammelt, die ich geschrieben habe
Ich habe das Datenaufbereitungstool Paxata berührt
Ich habe den Gleitflügel in der Schöpfung geschrieben.
Ich möchte mit dem Reim part2 umgehen
Ich möchte mit dem Reim part5 umgehen
Ich möchte mit dem Reim part4 umgehen
Ich kann das Paket nicht mit pip installieren.
Ich habe das Python Tornado Testing Framework ausprobiert
Ich habe versucht, die BigQuery-Speicher-API zu verwenden