So erkennen Sie (die meisten) gemörtelten Steine ​​mit OpenCV findContours

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: So erkennen Sie (die meisten) gemörtelten Steine ​​mit OpenCV findContours

by Guest » 14 Jan 2025, 13:11

Ich muss möglichst viele der gemörtelten Steine ​​in einem Straßenbereich korrekt umreißen. Der folgende Code erkennt einige davon korrekt im Steinbild „in.jpg“, aber es ist nicht ersichtlich, warum viele unentdeckt bleiben oder nur teilweise umrissen sind. Ich möchte auch Fälle wie Kontur 56, 57 oder 92 beheben, indem ich die Tatsache ausnutze, dass die Steine ​​ausgerichtet sind und ein meist ovales Bild mit erkannten Konturen „out.jpg“ aufweist. Ich weiß, wie man die offensichtlichen Ausreißer entfernt, aber vorher muss ich die Erkennungsmethode verbessern.

Code: Select all

import cv2
img = cv2.imread('in.jpg')
gray = cv2.bitwise_not(img)
gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (113, 113), 0)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 61, 2)
thresh = cv2.dilate(thresh, None, iterations=5)
thresh = cv2.erode(thresh, None, iterations=1)
cnts, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f'Found {len(cnts)} contours')
cv2.drawContours(img, cnts, -1, (0, 255, 0), 2)
centroids = [cv2.moments(c) for c in cnts]
for i, c in enumerate(centroids):
cv2.putText(img, str(i), (int(c['m10'] / c['m00']), int(c['m01'] / c['m00']) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
cv2.imwrite('out.jpg', img)
Die verschiedenen Parameter (Unschärfe 113 usw.) wurden durch Versuch und Irrtum ermittelt.
Es reicht nicht aus, nur die Steine ​​zu zählen, Ich muss ihre Form so genau wie möglich nachahmen.
Vielen Dank für Ihre Vorschläge!

Top