OpenCV (kurz für Open Supply Pc Imaginative and prescient) ist eine Bibliothek für Pc Imaginative and prescient, maschinelles Lernen und Bildverarbeitung. Es kann verwendet werden, um Muster in einem Bild zu identifizieren, Merkmale zu extrahieren und mathematische Operationen daran durchzuführen. Der erste Schritt besteht darin, den Puzzle-Screenshot mit OpenCV zu verarbeiten. Lassen Sie uns kurz die Grundlagen der OpenCV-Bildverarbeitung auffrischen.

Installieren Sie das OpenCV-Python-Paket

pip set up opencv-python

So laden Sie ein Bild

cv.imreadliest eine Bilddatei und konvertiert sie in eine OpenCV-Matrix. Wenn das Bild nicht gelesen werden kann, weil die Datei möglicherweise fehlt oder in einem Format vorliegt, das OpenCV nicht verstehen kann, wird eine leere Matrix zurückgegeben. Die OpenCV-Matrix kann mithilfe von wieder in ein Bild umgewandelt werden cv.imshow Funktion.

import cv2 as cv
import numpy as np

# Studying a picture
unique = cv.imread("<file_name">)
cv.imshow("unique", unique)

So zeichnen Sie eine Linie, einen Kreis, ein Rechteck oder einen Textual content auf demselben Bild

Sobald wir das Gitter erkennen, müssen wir es mithilfe von Linien und Platzierung neu erstellen QTextual content verwenden. Schauen wir uns einen kurzen Ausschnitt zum Zeichnen einer Linie, eines Kreises, eines Rechtecks ​​und eines Textes in der obigen Lesematrix an.


# Drawing a line
line = cv.line(unique, (unique.form(1)//2, unique.form(0)//2), (0,0) , (0,255,0), thickness=2)
cv.imshow("line", line)

# Drawing different shapes
circle = cv.circle(line, (line.form(1)//2, line.form(0)//2), 50, (0,0,255), thickness=2)
rect = cv.rectangle(circle, (10,10), (circle.form(1)//2, circle.form(0)//2), (255,0,0), thickness=2)
textual content = cv.putText(rect, "Hello", (rect.form(1)//2, rect.form(0)//2), cv.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), thickness=2)

cv.imshow("all shapes", textual content)

So erkennen Sie Konturen

Konturen sind einfach eine Type, die alle Punkte ähnlicher Farbe und Intensität an einer kontinuierlichen Grenze verbindet. Diese sind nützlich bei der Erkennung von Formen und der Analyse von Objektumrissen. Wir werden unser Puzzle-Raster zeichnen, indem wir die einzelnen Zellen erkennen.

# Its finest to transform picture to grayscale
# and add a little bit of blur for higher contour detections
# since our picture is usually a grid we dont want blur

# by default OpenCV reads pictures as BGR
# versus conventional RGB
grey = cv.cvtConvert(unique, cv.COLOR_BGR2GRAY)
contours, _ = cv.findContours(grey, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)

Standardmäßig liest OpenCV Bilder als BGRim Gegensatz zu traditionell RGB

Ein Bild zuschneiden

Damit wir unnötige Bereiche aus Screenshots entfernen und das Rauschen reduzieren können, sobald wir unsere Konturen erkannt haben

# its primarily deciding on the pixels we'd like from the whole picture
cropped = unique(0:unique.form(1)//2, 0:unique.form(0)//2)
cv.imshow("cropped", cropped)

Zunächst laden wir das Bild in den Speicher und konvertieren es in Graustufen. Dies trägt zur Vereinfachung der Konturerkennung bei, ein allgemeiner Schritt, der immer befolgt wird, da er die Bildkomplexität verringert. Als nächstes suchen wir Konturen, sortieren sie und wählen die größte aus. Normalerweise ist die erste Kontur der begrenzte Rahmen des Originalbilds, daher verwenden wir die zweitgrößte Kontur, um das Puzzle-Raster zu isolieren. Dann schneiden wir das Bild zu, nur um das Raster zu erhalten und sonst nichts. Wir finden wieder Konturen, da das Rauschen jetzt reduziert ist und das Gitter besser erkannt wird. Wir bestimmen die Anzahl der Zellen innerhalb des Rasters und iterieren über jede Zelle, nehmen die Durchschnittsfarbe und weisen jeder Farbe eine Zahl zu, wodurch wir die 2D-Anordnung unseres Puzzles erhalten

# Learn the enter picture and save the unique
unique = cv.imread(file_name)
cv.imwrite("answer/unique.png", unique)

# Convert the picture to grayscale
grey = cv.cvtColor(unique, cv.COLOR_BGR2GRAY)

# Discover contours within the grayscale picture and kind them by space
contours, _ = cv.findContours(grey, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
contours = sorted(contours, key=cv.contourArea, reverse=True)

# Extract the bounding field of the puzzle grid (utilizing the second largest contour)
x, y, w, h = cv.boundingRect(contours(1))

# Crop the grid space from the unique picture
grid = unique(y:y+h, x:x+w)
cv.imwrite("answer/grid.png", grid)

# Convert the cropped grid to grayscale
grey = cv.cvtColor(grid, cv.COLOR_BGR2GRAY)
cv.imwrite("answer/gray-grid.png", grey)

# Discover contours once more within the cropped grayscale grid
contours, _ = cv.findContours(grey, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
contours = sorted(contours, key=cv.contourArea)

# Decide the overall variety of cells within the grid
total_cells = len(contours) - 2
grid_size = int(math.sqrt(total_cells))

# Test if the detected cells type a whole sq. grid
if total_cells != grid_size**2:
print("Unable to detect full grid! Aborting")

# Calculate particular person cell dimensions
cell_width = w // grid_size
cell_height = h // grid_size

# Initialize shade mappings and board illustration
colours = ()
board = ()
color_index = 1
color_map = {}
reverse_color_map = {}
padding = 10

# Iterate by means of every cell within the grid
for i in vary(grid_size):
row = ()
for j in vary(grid_size):
# Calculate cell coordinates with padding
cell_x = j * cell_width
cell_y = i * cell_height
padding = 15
cell = grid(cell_y+padding:cell_y+cell_height-padding, cell_x+padding:cell_x+cell_width-padding)

# Get the common shade of the cell
avg_color = cell.imply(axis=0).imply(axis=0)
avg_color = avg_color.astype(int)
avg_color = tuple(avg_color)

# Map the colour to a novel index if not already mapped
if avg_color not in color_map:
color_map(avg_color) = str(color_index)
reverse_color_map(str(color_index)) = avg_color
color_index += 1

# Add the colour index to the row
row.append(color_map(avg_color))

# Add the row to the board
board.append(row)

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert