GOOGLE ADS

Dienstag, 12. April 2022

So zeigen Sie Konturen (openCV) auf einem Bild in einem HMI (pyQt) an - Python

Ich entwickle ein Tool für ein Projekt meiner Ingenieurschule. Dies ist das erste Mal, dass ich ein HMI erstelle und openCVund verwende qtpy.

Mein Ziel ist es, eine erste Behandlung auf das Bild anzuwenden (Unschärfe und so), um es einfacher zu machen, die Konturen einer Pflaume zu erkennen. Dann möchte ich die Konturen der mit der openCV findContourMethode gefundenen Pflaume anzeigen. Vorerst ist es mir gelungen, die Konturen durch die openCVMethode anzuzeigen, drawContourses öffnet sich jedoch ein neues Fenster, matplotanstatt die Konturen über dem Bild anzuzeigen, das bereits in meinem MHI angezeigt wird.

Wie kann ich die Konturen nicht in einem neuen Matplot-Fenster anzeigen, sondern über meinem bereits angezeigten Bild in meinem HMI?

So sieht mein HMI aus.

Geben Sie hier die Bildbeschreibung ein

Hier ist mein Code bezüglich der Konturenanzeige, die drawContoursMethode verwendet.

def allContours(img_originale, masque, toggleMode):
if toggleMode:
#trouve les contours sur l'image
image_copy = img_originale.copy()
contours, hier = cv2.findContours(image=masque, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_AA)
cv2.imshow('Contours', image_copy)
cv2.waitKey(0)
else:
pass

Und hier ist der Codeteil, der mein Bild in der HMI anzeigt:

 # Redimensionnement et affichage Image
image = cv2.resize(image, (int(self.ratio*self.image_w),int(self.ratio*self.image_h)))
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
height, width, channels = image.shape
step = channels*width
qImg = QImage(image.data, width, height, step, QImage.Format_RGB888)
self.imageLabel.setPixmap(QPixmap.fromImage(qImg))

Ich möchte das folgende Ergebnis erhalten, aber es in der HMI statt in einem neuen Fenster haben. Kann mir jemand sagen wie ich vorgehen soll? Danke!
Geben Sie hier die Bildbeschreibung ein


Lösung des Problems

Es wäre einfacher, wenn wir mehr von Ihrem Code sehen könnten, aber im Grunde können Sie einfach das Bild mit den gezeichneten Konturen zurückgeben:

def allContours(img_originale, masque, toggleMode):
if toggleMode:
#trouve les contours sur l'image
image_copy = img_originale.copy()
contours, hier = cv2.findContours(image=masque, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_AA)
return image_copy
else:
return None

Passen Sie auch Ihre "Blur and Stuff"-Vorverarbeitung ein wenig an. Es sollten noch bessere Ergebnisse möglich sein. Probieren Sie vielleicht die Kantenerkennung von Canny aus.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...