Coding eksempelet: filtrering og trekke de tilkoblede komponentene
Nå vil vi kode funksjon som vil gjøre jobben . Jeg skal legge inn funksjonens koden under her, hele arbeidskoden er tilgjengelig på slutten av artikkelen.
CvSeq * konturer, * ptr; CvMemStorage * mem = cvCreateMemStorage (0); cvFindContours (img, mem, og konturer, sizeof (CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint (0,0)); PTR = konturer; while (ptr = NULL) {if (kriterier (PTR) == 0) {if (PTR == konturer) {konturene = ptr-> h_next; PTR = konturer; ptr-> h_prev = NULL; } Else {ptr-> h_prev-> h_next = ptr-> h_next; if (ptr-> h_next = NULL!) ptr-> h_next-> h_prev = ptr-> h_prev; ptr = ptr-> h_next; }} Else {ptr = ptr-> h_next; }} returnere konturer; } Et eksempel på bruk I dette eksempelet vil jeg vise en enkel funksjon som filtrerer komponenter basert på deres forhold , får bare koblet komponenter som er nesten kvadratisk. Vi kaller extract_and_filter_CC funksjon som dette: filtered_cc = extract_and_filter_CC (img, firkantet); Konklusjon Denne artikkelen beskriver en annen anvendelse av tilkoblede komponentene: å filtrere deler av bildet som ikke passer i noen visse kriterier. Den bruker også funksjonspekere for å gjøre filtrering som generisk som mulig. Denne teknikken er meget kraftig, og kan brukes i forbindelse med andre teknikker for å fjerne støy et bilde eller for å trekke ut especial deler av bildet. Den komplette arbeids kode med kommentarer finner du her. CvSeq * extract_and_filter_CC (IplImage * img, int (* kriterier ) (CvSeq *)) {
int square (CvSeq * kontur) {CvRect boks = cvBoundingBox (kontur); if (boks-> w /boks-> hw /boks-> h> 0,4) retur 1; returnere 0;}