- 1. Τμηματοποίηση και περίγραμμα
- 2. Λειτουργία ιεραρχίας και ανάκτησης
- 3. Προσέγγιση των περιγραμμάτων και εύρεση του κυρτού κύτους τους
- 4. Κυρτό Hull
- 5. Ταίριασμα περιγράμματος με σχήματα
- 6. Αναγνώριση σχημάτων (κύκλος, ορθογώνιο, τρίγωνο, τετράγωνο, αστέρι)
- 7. Ανίχνευση γραμμής
- 8. Ανίχνευση κηλίδων
- 9. Φιλτράρισμα των σταγόνων - Μετρώντας κύκλους και ελλείψεις
Στα προηγούμενα σεμινάρια, χρησιμοποιήσαμε το OpenCV για βασική επεξεργασία εικόνων και κάναμε κάποιες εκ των προτέρων λειτουργίες επεξεργασίας εικόνας. Όπως γνωρίζουμε, το OpenCV είναι Open Source Commuter Vision Library που διαθέτει διεπαφές C ++, Python και Java και υποστηρίζει Windows, Linux, Mac OS, iOS και Android. Έτσι μπορεί να εγκατασταθεί εύκολα στο Raspberry Pi με περιβάλλον Python και Linux. Και το Raspberry Pi με OpenCV και συνδεδεμένη κάμερα μπορούν να χρησιμοποιηθούν για τη δημιουργία πολλών εφαρμογών επεξεργασίας εικόνας σε πραγματικό χρόνο, όπως Ανίχνευση προσώπου, κλείδωμα προσώπου, παρακολούθηση αντικειμένων, ανίχνευση πινακίδας αυτοκινήτου, σύστημα οικιακής ασφάλειας κ.λπ. Σε αυτό το σεμινάριο θα μάθουμε πώς να το κάνουμε τμηματοποίηση εικόνας χρησιμοποιώντας το OpenCV. Οι λειτουργίες που πρόκειται να εκτελέσουμε παρατίθενται παρακάτω:
- Τμηματοποίηση και περίγραμμα
- Λειτουργία ιεραρχίας και ανάκτησης
- Προσέγγιση των περιγραμμάτων και εύρεση του κυρτού κύτους τους
- Conex Hull
- Ταίριασμα περιγράμματος
- Αναγνωρίζοντας σχήματα (κύκλος, ορθογώνιο, τρίγωνο, τετράγωνο, αστέρι)
- Ανίχνευση γραμμής
- Ανίχνευση σταγόνων
- Φιλτράρισμα των σταγόνων - μετρώντας κύκλους και ελλείψεις
1. Τμηματοποίηση και περίγραμμα
Η τμηματοποίηση εικόνας είναι μια διαδικασία με την οποία χωρίζουμε εικόνες σε διαφορετικές περιοχές. Ενώ τα περιγράμματα είναι οι συνεχείς γραμμές ή καμπύλες που δεσμεύονται ή καλύπτουν το πλήρες όριο ενός αντικειμένου σε μια εικόνα. Και, εδώ θα χρησιμοποιήσουμε την τεχνική τμηματοποίησης εικόνας που ονομάζεται περίγραμμα για την εξαγωγή των τμημάτων μιας εικόνας.
Επίσης, τα περιγράμματα είναι πολύ σημαντικά
- Ανίχνευση αντικειμένων
- Ανάλυση σχήματος
Και έχουν πολύ ευρύ πεδίο εφαρμογής, από την ανάλυση εικόνας του πραγματικού κόσμου έως την ανάλυση ιατρικής εικόνας, όπως σε MRI
Ας μάθουμε πώς να εφαρμόσουμε περιγράμματα στο opencv, εξάγοντας περιγράμματα τετραγώνων.
εισαγωγή cv2 εισαγωγή numpy ως np
Ας φορτώσουμε μια απλή εικόνα με 3 μαύρα τετράγωνα
image = cv2.imread ('squares.jpg') cv2.imshow ('εισαγωγή εικόνας', εικόνα) cv2.waitKey (0)
Κλίμακα του γκρι
γκρι = cv2.cvtColor (εικόνα, cv2.COLOR_BGR2GRAY)
Βρείτε άκρα
edged = cv2.Canny (γκρι, 30.200) cv2.imshow («canny edges», edged) cv2.waitKey (0)
Εύρεση περιγράμματος
#use ένα αντίγραφο της εικόνας σας, για παράδειγμα - edged.copy (), δεδομένου ότι βρίσκοντας τα περιγράμματα αλλάξει την εικόνα #we πρέπει να προσθέσετε _, πριν από τα περιγράμματα ως ένα άδειο επιχείρημα που οφείλεται για την αναβάθμιση της έκδοσης OpenCV _, περιγράμματα, ιεραρχία = cv2.findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow (" canny edge μετά το περίγραμμα", edged)
Εκτύπωση του αρχείου περιγράμματος για να γνωρίζετε τι περιλαμβάνει το περίγραμμα
εκτύπωση (περιγράμματα) εκτύπωση («Αριθμός περιγράμματος που βρέθηκαν =» + str (len (περιγράμματα)))
Σχεδιάστε όλα τα περιγράμματα
#use -1 ως η 3η παράμετρος για να σχεδιάσετε όλα τα περιγράμματα cv2.drawContours (εικόνα, περιγράμματα, -1, (0,255,0), 3) cv2.imshow ('περίγραμμα', εικόνα) cv2.waitKey (0) cv2. καταστροφή AllWindows ()
Έξοδος κονσόλας -],],], …,],],]], dtype = int32), πίνακας(],],
], …,
],],]], dtype = int32), πίνακας (],],], …,],],]], dtype = int32)]
Αριθμός περιγράμματος που βρέθηκαν = 3. Έτσι, βρήκαμε συνολικά τρία περιγράμματα.
Τώρα, στον παραπάνω κώδικα είχαμε εκτυπώσει επίσης το αρχείο περιγράμματος χρησιμοποιώντας , αυτό το αρχείο λέει πώς μοιάζουν αυτά τα περιγράμματα, όπως εκτυπώνονται στην έξοδο της κονσόλας.
Στην παραπάνω έξοδο της κονσόλας έχουμε έναν πίνακα που μοιάζει με συντεταγμένες των σημείων x, y. Το OpenCV αποθηκεύει περιγράμματα σε λίστες λιστών. Μπορούμε απλά να δείξουμε την παραπάνω έξοδο της κονσόλας ως εξής:
CONTOUR 1 CONTOUR 2 CONTOUR 3
], πίνακας (], πίνακας (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Τώρα, καθώς χρησιμοποιούμε τη συνάρτηση length στο αρχείο περιγράμματος, έχουμε το μήκος ίσο με 3, αυτό σημαίνει ότι υπήρχαν τρεις λίστες λιστών σε αυτό το αρχείο, δηλαδή τρία περιγράμματα.
Τώρα, φανταστείτε το CONTOUR 1 είναι το πρώτο στοιχείο σε αυτόν τον πίνακα και αυτή η λίστα περιέχει λίστα όλων των συντεταγμένων και αυτές οι συντεταγμένες είναι τα σημεία κατά μήκος των περιγραμμάτων που μόλις είδαμε, ως τα πράσινα ορθογώνια κουτιά.
Υπάρχουν διαφορετικές μέθοδοι για την αποθήκευση αυτών των συντεταγμένων και αυτές ονομάζονται μέθοδοι προσέγγισης, βασικά οι μέθοδοι προσέγγισης είναι δύο τύπων
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
Το cv2.CHAIN_APPROX_NONE αποθηκεύει όλο το οριακό σημείο, αλλά δεν χρειαζόμαστε απαραίτητα όλα τα οριακά σημεία, εάν το σημείο σχηματίζει μια ευθεία γραμμή, χρειαζόμαστε μόνο το σημείο εκκίνησης και το τελικό σημείο σε αυτήν τη γραμμή.
Το cv2.CHAIN_APPROX_SIMPLE αντ 'αυτού παρέχει μόνο τα σημεία έναρξης και λήξης των ορίων περιγράμματος, το αποτέλεσμα είναι πολύ πιο αποτελεσματική αποθήκευση πληροφοριών περιγράμματος.
_, περιγράμματα, ιεραρχία = cv2.findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Στον παραπάνω κωδικό cv2.RETR_EXTERNAL είναι η λειτουργία ανάκτησης ενώ το cv2.CHAIN_APPROX_NONE είναι
τη μέθοδο προσέγγισης.
Έτσι μάθαμε για τα περιγράμματα και τη μέθοδο προσέγγισης, τώρα ας εξερευνήσουμε τη λειτουργία ιεραρχίας και ανάκτησης.
2. Λειτουργία ιεραρχίας και ανάκτησης
Η λειτουργία ανάκτησης ορίζει την ιεραρχία σε περιγράμματα, όπως τα υπογράμματα, ή το εξωτερικό περίγραμμα ή σε όλα τα περιγράμματα.
Τώρα υπάρχουν τέσσερις τρόποι ανάκτησης ταξινομημένοι στους τύπους ιεραρχίας.
cv2.RETR_LIST - ανακτά όλα τα περιγράμματα.
cv2.RETR_EXTERNAL - ανακτά μόνο εξωτερικό ή εξωτερικό περίγραμμα.
cv2.RETR_CCOMP - ανακτά όλα σε μια ιεραρχία 2 επιπέδων.
cv2.RETR_TREE - ανακτά όλα σε μια πλήρη ιεραρχία.
Η ιεραρχία αποθηκεύεται στην ακόλουθη μορφή
Τώρα ας δείξουμε τη διαφορά μεταξύ των δύο πρώτων τρόπων ανάκτησης, cv2.RETR_LIST και cv2.RETR_EXTERNAL.
εισαγωγή cv2 εισαγωγή numpy ως np
Ας φορτώσουμε μια απλή εικόνα με 3 μαύρα τετράγωνα
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', εικόνα) cv2.waitKey (0)
Κλίμακα του γκρι
γκρι = cv2.cvtColor (εικόνα, cv2.COLOR_BGR2GRAY)
Βρείτε Canny Edges
edged = cv2.Canny (γκρι, 30.200) cv2.imshow («canny edges», edged) cv2.waitKey (0)
Εύρεση περιγραμμάτων
#use ένα αντίγραφο της εικόνας σας, για παράδειγμα - edged.copy (), δεδομένου ότι βρίσκοντας τα περιγράμματα αλλάξει την εικόνα #we πρέπει να προσθέσετε _, πριν από τα περιγράμματα ως ένα άδειο επιχείρημα που οφείλεται για την αναβάθμιση της ανοικτής έκδοσης βιογραφικό _, περιγράμματα, ιεραρχία = cv2.findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow («canny edges after contouring», edged) cv2.waitKey (0)
Εκτύπωση του αρχείου περιγράμματος για να γνωρίζετε τι περιλαμβάνει το περίγραμμα.
εκτύπωση (περιγράμματα) εκτύπωση («Αριθμός περιγράμματος που βρέθηκαν =» + str (len (περιγράμματα)))
Σχεδιάστε όλα τα περιγράμματα
#use -1 ως η 3η παράμετρος για να σχεδιάσετε όλα τα περιγράμματα cv2.drawContours (εικόνα, περιγράμματα, -1, (0,255,0), 3) cv2.imshow ('περίγραμμα', εικόνα) cv2.waitKey (0) cv2. καταστρέψτε όλα τα Windows
εισαγωγή cv2 εισαγωγή numpy ως np
Ας φορτώσουμε μια απλή εικόνα με 3 μαύρα τετράγωνα
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', εικόνα) cv2.waitKey (0)
Κλίμακα του γκρι
γκρι = cv2.cvtColor (εικόνα, cv2.COLOR_BGR2GRAY)
Βρείτε άκρα
edged = cv2.Canny (γκρι, 30.200) cv2.imshow («canny edges», edged) cv2.waitKey (0)
Εύρεση περιγράμματος
#use ένα αντίγραφο της εικόνας σας, για παράδειγμα - edged.copy (), δεδομένου ότι βρίσκοντας τα περιγράμματα αλλάξει την εικόνα #we πρέπει να προσθέσετε _, πριν από τα περιγράμματα ως ένα άδειο επιχείρημα που οφείλεται για την αναβάθμιση της ανοικτής έκδοσης βιογραφικό _, περιγράμματα, ιεραρχία = cv2.findContours (edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow (' canny edge after contouring', edged)
Εκτύπωση του αρχείου περιγράμματος για να γνωρίζετε τι περιλαμβάνει το περίγραμμα.
εκτύπωση (περιγράμματα) εκτύπωση («Αριθμός περιγράμματος που βρέθηκαν =» + str (len (περιγράμματα)))
Σχεδιάστε όλα τα περιγράμματα
#use -1 ως η 3η παράμετρος για να σχεδιάσετε όλα τα περιγράμματα cv2.drawContours (εικόνα, περιγράμματα, -1, (0,255,0), 3) cv2.imshow ('περίγραμμα', εικόνα) cv2.waitKey (0) cv2. καταστροφή AllWindows ()
Έτσι, μέσω της επίδειξης των παραπάνω κωδικών, θα μπορούσαμε να δούμε ξεκάθαρα τη διαφορά μεταξύ του cv2.RETR_LIST και του cv2.RETR_EXTERNNAL , στο cv2.RETR_EXTERNNAL λαμβάνονται υπόψη μόνο τα εξωτερικά περιγράμματα, ενώ τα εσωτερικά περιγράμματα αγνοούνται.
Ενώ στο cv2.RETR_LIST λαμβάνονται επίσης υπόψη τα εσωτερικά περιγράμματα.
3. Προσέγγιση των περιγραμμάτων και εύρεση του κυρτού κύτους τους
Κατά την προσέγγιση των περιγραμμάτων, ένα σχήμα περιγράμματος προσεγγίζεται σε ένα άλλο σχήμα περιγράμματος, το οποίο μπορεί να μην είναι τόσο παρόμοιο με το πρώτο σχήμα περιγράμματος.
Για προσέγγιση χρησιμοποιούμε τη συνάρτηση approxPolyDP του openCV που εξηγείται παρακάτω
cv2.approxPolyDP (περίγραμμα, ακρίβεια προσέγγισης, κλειστό)
Παράμετροι:
- Contour - είναι το ατομικό περίγραμμα που θέλουμε να προσεγγίσουμε.
- Ακρίβεια προσέγγισης - σημαντική παράμετρος για τον προσδιορισμό της ακρίβειας της προσέγγισης, η μικρή τιμή δίνει ακριβή προσέγγιση, οι μεγάλες τιμές παρέχουν περισσότερες γενικές πληροφορίες. Ένας καλός κανόνας αντίχειρα είναι λιγότερο από 5% της περιμέτρου περιγράμματος.
- Κλειστό - μια τιμή Boolean που δηλώνει εάν το κατά προσέγγιση περίγραμμα θα μπορούσε να είναι ανοιχτό ή κλειστό.
Ας προσπαθήσουμε να προσεγγίσουμε μια απλή φιγούρα ενός σπιτιού
εισαγωγή numpy ως np εισαγωγή cv2
Φορτώστε την εικόνα και κρατήστε ένα αντίγραφο
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('αρχική εικόνα', orig_image) cv2.waitKey (0)
Κλίμακα του γκρι και δυαδική εικόνα
γκρι = cv2.cvtColor (εικόνα, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (γκρι, 127.255, cv2.THRESH_BINARY_INV)
Βρείτε περιγράμματα
_, περιγράμματα, ιεραρχία = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Επαναλάβετε κάθε περίγραμμα και υπολογίστε το ορθογώνιο οριοθέτησής τους
για c σε περιγράμματα: x, y, w, h = cv2.boundingRect (c) cv2 . ορθογώνιο (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ("Bounding rect", orig_image) cv2.waitKey (0).
Επαναλάβετε κάθε περίγραμμα και υπολογίστε το περίγραμμα περίπου
για c σε περιγράμματα:
# υπολογίστε την ακρίβεια ως τοις εκατό της ακρίβειας περιμέτρου περιγράμματος = 0,03 * cv2.arcLength (c, True) περίπου = cv2.approxPolyDP (c, ακρίβεια, True) cv2.drawContours (εικόνα,, 0, (0,255,0), 2) cv2.imshow ('Approx polyDP', image) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Κυρτό Hull
Το κυρτό κύτος είναι βασικά τα εξωτερικά άκρα, που αντιπροσωπεύονται από τη σχεδίαση γραμμών πάνω από ένα δεδομένο σχήμα.
Θα μπορούσε να είναι το μικρότερο πολύγωνο που μπορεί να χωρέσει γύρω από το ίδιο το αντικείμενο.
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('star.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('original image', image) cv2.waitKey (0)
Όριο της εικόνας
ret, thresh = cv2.threshold (γκρι, 176.255,0)
Βρείτε περιγράμματα
_, περιγράμματα, ιεραρχία = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Ταξινομήστε τα περιγράμματα ανά περιοχή και μετά αφαιρέστε το μεγαλύτερο περίγραμμα πλαισίου
n = len (περιγράμματα) -1 περιγράμματα = ταξινομημένα (περιγράμματα, πλήκτρο = cv2.contourArea, αντίστροφη = False)
Επαναλάβετε τα περιγράμματα και σχεδιάστε κυρτό κύτος
για c σε περιγράμματα:
hull = cv2.convexHull (c) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('convex hull', image) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Ταίριασμα περιγράμματος με σχήματα
cv2.matchShapes (πρότυπο περιγράμματος, μέθοδος περιγράμματος, παράμετρος μεθόδου)
Έξοδος - τιμή αγώνα (χαμηλότερη τιμή σημαίνει στενότερη αντιστοίχιση)
πρότυπο περιγράμματος - Αυτό είναι το περίγραμμα αναφοράς που προσπαθούμε να βρούμε σε μια νέα εικόνα.
περίγραμμα - Το ατομικό περίγραμμα που ελέγχουμε.
Μέθοδος - Τύπος αντιστοίχισης περιγράμματος (1,2,3).
παράμετρος μεθόδου - αφήστε μόνο ως 0,0 (δεν χρησιμοποιείται στο python opencv)
εισαγωγή cv2 εισαγωγή numpy ως np
Φορτώστε το πρότυπο σχήματος ή την εικόνα αναφοράς
template = cv2.imread ('star.jpg', 0) cv2.imshow ('template', template) cv2.waitKey (0)
Φορτώστε την εικόνα-στόχο με τα σχήματα που προσπαθούμε να ταιριάξουμε
target = cv2.imread ('shapestomatch.jpg') γκρι = cv2.cvtColor (στόχος, cv2.COLOR_BGR2GRAY)
Κατώτατο όριο και των δύο εικόνων πριν χρησιμοποιήσετε το cv2.findContours
ret, thresh1 = cv2.threshold (πρότυπο, 127.255,0) ret, thresh2 = cv2.threshold (γκρι, 127.255,0)
Βρείτε περιγράμματα στο πρότυπο
_, περίγραμμα, hierarhy = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # πρέπει να ταξινομήσουμε τα περιγράμματα ανά περιοχή, ώστε να μπορούμε να αφαιρέσουμε το μεγαλύτερο περίγραμμα που είναι
Περίγραμμα εικόνας
sorted_contours = sorted (contours, key = cv2.contourArea, reverse = True) # εξάγουμε το δεύτερο μεγαλύτερο περίγραμμα που θα είναι το πρότυπο περίγραμμα tempelate_contour = περίγραμμα # εξαγάγετε τα περιγράμματα από τη δεύτερη εικόνα στόχου _, περιγράμματα, ιεραρχία = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) για c σε περιγράμματα: # γράψτε κάθε περίγραμμα στην εικόνα προορισμού και χρησιμοποιήστε το cv2.matchShape για να συγκρίνετε το σχήμα περιγράμματος match = cv2.matchShapes (tempelate_contour, c, 1,0.0) εκτύπωση ("match") # εάν η τιμή αντιστοίχισης είναι μικρότερη από 0,15 εάν η αντιστοίχιση <0,16: πλησιέστερο_contour = c else: terdekat_contour = cv2.drawContours (στόχος,, - 1, (0,255,0), 3) cv2.imshow ('έξοδος'),στόχος) cv2.waitKey (0) cv2.destroyAllWindows ()
Έξοδος κονσόλας -
0.16818605122199104
0.19946910256158912
0.18949760627309664
0.11101058276281539
Υπάρχουν τρεις διαφορετικές μέθοδοι με διαφορετική λειτουργία μαθηματικών, μπορούμε να πειραματιστούμε με κάθε μέθοδο αντικαθιστώντας απλώς τις τιμές μεθόδου cv2.matchShapes (tempelate_contour, c, 1, 0.0) που κυμαίνονται από 1,2 και 3, για κάθε τιμή θα έχετε διαφορετική αντιστοίχιση τιμές στην έξοδο της κονσόλας.
6. Αναγνώριση σχημάτων (κύκλος, ορθογώνιο, τρίγωνο, τετράγωνο, αστέρι)
Το OpenCV μπορεί επίσης να χρησιμοποιηθεί για την αυτόματη ανίχνευση διαφορετικών τύπων σχημάτων από την εικόνα. Χρησιμοποιώντας τον παρακάτω κώδικα θα μπορέσουμε να εντοπίσουμε κύκλο, ορθογώνιο, τρίγωνο, τετράγωνο και αστέρια από την εικόνα.
εισαγωγή cv2 εισαγωγή numpy ως np
Φόρτωση και, στη συνέχεια, γκρι κλίμακας εικόνων
image = cv2.imread ('σχήματα.jpg') γκρι = cv2.cvtColor (εικόνα, cv2.COLOR_BGR2GRAY) cv2.imshow («αναγνωρίζοντας σχήματα», εικόνα) cv2.waitKey (0) ret, thresh = cv2.threshold (γκρι, 127.255,1)
Εξαγάγετε τα περιγράμματα
_, περιγράμματα, ιεραρχία = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Για cnt σε περιγράμματα:
Λάβετε κατά προσέγγιση πολύγωνα περίπου = cv2.approxPolyDP (cnt, 0,01 * cv2.arcLength (cnt, True), True) εάν len (περίπου) == 3: σχήμα_ όνομα = "Τρίγωνο" cv2.drawContours (εικόνα,, 0, (0,255, 0), - 1)
βρείτε το κέντρο περιγράμματος για να τοποθετήσετε κείμενο στο κέντρο
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (εικόνα, σχήμα_ όνομα, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (περίπου) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M /Μ)
Ελέγξτε εάν το τετράπλευρο πολύγωνο είναι τετράγωνο ή ορθογώνιο
# cv2.boundingRect επιστρέψτε το αριστερό πλάτος και ύψος σε εικονοστοιχεία, ξεκινώντας από την επάνω # αριστερή γωνία, για τετράγωνο θα ήταν περίπου ίδιο εάν abs (wh) <= 3: σχήμα_name = "τετράγωνο" # βρείτε το κέντρο περιγράμματος για να τοποθετήσετε κείμενο κέντρο cv2.drawContours (εικόνα,, 0, (0,125,255), - 1) cv2.putText (εικόνα, σχήμα_ όνομα, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) άλλο: σχήμα_name = "Reactangle" # βρείτε το κέντρο περιγράμματος για να τοποθετήσετε κείμενο στο κέντρο cv2.drawContours (εικόνα,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (εικόνα, σχήμα_ όνομα, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (περίπου) == 10: σχήμα_ όνομα = 'αστέρι' cv2.drawContours (εικόνα,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (εικόνα, σχήμα_ όνομα, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (περίπου)> = 15: shape_name = 'circle' cv2.drawContours (εικόνα,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (εικόνα, σχήμα_ όνομα, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow («αναγνωρίζοντας σχήματα», εικόνα) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Ανίχνευση γραμμής
Η ανίχνευση γραμμής είναι πολύ σημαντική ιδέα στο OpenCV και έχει πολλά υποσχόμενη χρήση στον πραγματικό κόσμο. Τα αυτόνομα αυτοκίνητα χρησιμοποιούν αλγόριθμους ανίχνευσης γραμμών για την ανίχνευση λωρίδων και δρόμων.
Στην ανίχνευση γραμμής θα ασχοληθούμε με δύο αλγόριθμους,
- Αλγόριθμος Hough Line
- Αλγόριθμος Probalistic Hough Line.
Μπορεί να έχετε θυμηθεί την αναπαράσταση της γραμμής από τα μαθηματικά γυμνασίου με την εξίσωση, y = mx + c.
Ωστόσο, στο OpenCV γραμμή αντιπροσωπεύεται με άλλο τρόπο
Η εξίσωση πάνω από ρ = xcosӨ + ysincosӨ είναι η παράσταση OpenCV της γραμμής, όπου ρ είναι η κάθετη απόσταση της γραμμής από την αρχή και Ө είναι η γωνία που σχηματίζεται από το κανονικό αυτής της γραμμής προς την αρχή (μετριέται σε ακτίνια, όπου ακτίνια 1pi / 180 = 1 βαθμός).
Η συνάρτηση OpenCV για την ανίχνευση της γραμμής δίνεται ως
cv2.HoughLines (δυαδική εικόνα, ακρίβεια ρ, Ө ακρίβεια, κατώφλι), όπου το κατώτατο όριο είναι η ελάχιστη ψήφος για να θεωρείται γραμμή.
Τώρα ας εντοπίσουμε γραμμές για μια εικόνα κουτιού με τη βοήθεια της λειτουργίας γραμμής Hough του opencv.
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('box.jpg')
Εξαγάγετε την κλίμακα του γκρι και τα άκρα
γκρι = cv2.cvtColor (εικόνα, cv2.COLOR_BGR2GRAY) άκρα = cv2.Canny (γκρι, 100.170, διάφραγμαSize = 3)
Εκτελέστε γραμμές Hough χρησιμοποιώντας ακρίβεια rho 1 pixel
#theta ακρίβεια του (np.pi / 180) που είναι 1 βαθμός # γραμμή κατωφλίου ορίζεται σε 240 (αριθμός σημείων on line) γραμμές = cv2. HoughLines (άκρα, 1, np.pi / 180, 240) #we iterate μέσω κάθε γραμμής και μετατρέψτε τη σε μορφή #required από cv2.lines (δηλ. απαιτώντας τελικά σημεία) για i στην περιοχή (0, len (γραμμές)): για rho, theta σε γραμμές: a = np.cos (theta) b = np.sin (theta) x0 = a * rho y0 = b * rho x1 = int (x0 + 1000 * (- b)) y1 = int (y0 + 1000 * (a)) x2 = int (x0-1000 * (-b)) y2 = int (y0-1000 * (a)) cv2.line (εικόνα, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow («hough lines», εικόνα) cv2.waitKey (0) cv2.destroyAllWindows ()
Τώρα ας επαναλάβουμε την ανίχνευση παραπάνω γραμμής με άλλον αλγόριθμο πιθανότητας γραμμής Hough
Η ιδέα πίσω από την πιθανή γραμμή Hough είναι να ληφθεί ένα τυχαίο υποσύνολο σημείων επαρκές για την ανίχνευση γραμμής.
Η συνάρτηση OpenCV για πιθανή γραμμή Hough παρουσιάζεται ως cv2. HoughLinesP (εικόνα binarized, ακρίβεια ρ, ακρίβεια,, κατώφλι, ελάχιστο μήκος γραμμής, μέγιστο διάκενο γραμμής)
Τώρα ας εντοπίσουμε γραμμές κουτιού με τη βοήθεια πιθανών γραμμών Hough.
εισαγωγή cv2 εισαγωγή numpy ως np
Εξαγωγή της κλίμακας του γκρι και των άκρων
image = cv2.imread ('box.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) edges = cv2.Canny (γκρι, 50,150, apertureSize = 3) #again χρησιμοποιούμε τις ίδιες ακρίβεια rho και theta # ωστόσο, καθορίζουμε μια ελάχιστη ψήφο (πόντους κατά μήκος γραμμής) 100 # και ελάχιστο μήκος γραμμής 5 εικονοστοιχείων και μέγιστο διάκενο μεταξύ των γραμμών των γραμμών 10 εικονοστοιχείων = cv2.HoughLinesP (άκρες, 1, np.pi / 180,100,100,10) για i στην περιοχή (0, len (γραμμές)): για x1, y1, x2, y2 σε γραμμές: cv2.line (εικόνα, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow («probalistic hough lines», εικόνα) cv2.waitKey (0) cv2.destroyAllWindows
8. Ανίχνευση κηλίδων
Τα blobs μπορούν να περιγραφούν ως μια ομάδα συνδεδεμένων pixel που μοιράζονται όλα μια κοινή ιδιότητα. Η μέθοδος χρήσης του ανιχνευτή blob OpenCV περιγράφεται μέσω αυτού του διαγράμματος ροής.
Για τη σχεδίαση των βασικών σημείων χρησιμοποιούμε cv2.drawKeypoints που λαμβάνει τα ακόλουθα ορίσματα.
cv2.drawKeypoints (εικόνα εισόδου, σημεία πληκτρολογίου, blank_output_array, χρώμα, σημαίες)
όπου θα μπορούσαν να είναι οι σημαίες
cv2.DRAW_MATCHES_FLAGS_DEFAULT
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
και το κενό εδώ δεν είναι τίποτα άλλο παρά ένα μητρικό μηδέν
Τώρα ας κάνουμε την ανίχνευση σταγόνας σε μια εικόνα των ηλίανθων, όπου οι σταγόνες θα ήταν τα κεντρικά μέρη του λουλουδιού καθώς είναι κοινά μεταξύ όλων των λουλουδιών.
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
Ρύθμιση ανιχνευτή με προεπιλεγμένες παραμέτρους
ανιχνευτής = cv2.SimpleBlobDetector_create ()
Εντοπίστε σταγόνες
keypoints = detector.detect (εικόνα)
Σχεδιάστε τις εντοπισμένες σταγόνες ως κόκκινους κύκλους
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS διασφαλίζει ότι το # μέγεθος του κύκλου αντιστοιχεί στο μέγεθος του blob blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,255), cv2DF
Εμφάνιση σημείων πληκτρολογίου
cv2.imshow ('blobs', blobs ) cv2.waitKey (0) cv2.destroyAllWindows ()
Ακόμα κι αν ο κώδικας λειτουργεί καλά, αλλά μερικές από τις σταγόνες λείπουν λόγω των ανώμαλων μεγεθών των λουλουδιών, καθώς τα λουλούδια στο μπροστινό μέρος είναι μεγάλα σε σύγκριση με τα λουλούδια στο τέλος.
9. Φιλτράρισμα των σταγόνων - Μετρώντας κύκλους και ελλείψεις
Μπορούμε να χρησιμοποιήσουμε παραμέτρους για το φιλτράρισμα των σταγόνων ανάλογα με το σχήμα, το μέγεθος και το χρώμα τους. Για τη χρήση παραμέτρων με ανιχνευτή blob χρησιμοποιούμε τη λειτουργία του OpenCV
cv2.SimpleBlobDetector_Params ()
Θα δούμε το φιλτράρισμα των σταγόνων κυρίως από αυτές τις τέσσερις παραμέτρους που αναφέρονται παρακάτω:
Περιοχή
params.filterByArea = True / False params.minArea = pixels params.maxArea = pixels
Κυκλικότητα
params.filterByCircularity = True / False params.minCircularity = 1 είναι τέλειο, 0 είναι αντίθετο
Κυρτότητα - Περιοχή κηλίδας / περιοχή κυρτού κύτους
params.filterByConvexity = True / False params.minConvexity = Περιοχή
Αδράνεια
params.filterByInertia = True / False params.minInertiaRatio = 0,01
Τώρα ας προσπαθήσουμε να φιλτράρουμε σταγόνες με τις παραπάνω παραμέτρους
εισαγωγή cv2 εισαγωγή numpy ως np image = cv2.imread ('blobs.jpg') cv2.imshow ('original image', image) cv2.waitKey (0)
Αρχικοποιήστε τον ανιχνευτή χρησιμοποιώντας προεπιλεγμένες παραμέτρους
ανιχνευτής = cv2.SimpleBlobDetector_create ()
Εντοπίστε σταγόνες
keypoints = detector.detect (εικόνα)
Σχεδιάστε σταγόνες στην εικόνα μας ως κόκκινους κύκλους
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len ( πληκτρολόγια) bls = "σύνολο αριθ. (len (keypoints)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
Εμφάνιση εικόνας με πλήκτρα πλήκτρων
cv2.imshow («blob χρησιμοποιώντας προεπιλεγμένες παραμέτρους», blobs) cv2.waitKey (0)
Ορίστε τις παραμέτρους φιλτραρίσματος
# initialize ρύθμιση παραμέτρων χρησιμοποιώντας cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
Ορισμός παραμέτρων φιλτραρίσματος περιοχής
params.filterByArea = True params.minArea = 100
Ορίστε παραμέτρους φιλτραρίσματος κυκλικότητας
params.filterByCircularity = True params.minCircularity = 0.9
Ορισμός παραμέτρου φιλτραρίσματος κυρτότητας
params.filterByConvexity = False params.minConvexity = 0,2
Ορίστε την παράμετρο φιλτραρίσματος αδράνειας
params.filterByInertia = True params.minInertiaRatio = 0,01
Δημιουργήστε ανιχνευτή με παράμετρο
detector = cv2.SimpleBlobDetector_create (παράμετροι)
Εντοπίστε σταγόνες
keypoints = detector.detect (εικόνα)
Σχεδιάστε σταγόνες στις εικόνες ως κόκκινους κύκλους
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (πληκτρολόγια) κυκλικό πλήκτρο + "αριθ. str (len (keypoints)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Εμφάνιση σταγόνων
cv2.imshow («φιλτράρισμα κυκλικών σταγόνων», σταγόνες) cv2.waitKey (0) cv2.destroyAllWindows ()
Έτσι μπορεί να γίνει η τμηματοποίηση εικόνας στο Python-OpenCV. Για να έχετε καλή κατανόηση της όρασης του υπολογιστή και του OpenCV, διαβάστε προηγούμενα άρθρα (Ξεκινώντας με το Python OpenCV και το Manipulations Image στο Python OpenCV και θα μπορείτε να κάνετε κάτι δροσερό με το Computer Vision