I en annen artikkel vi lærte å trekke tilkoblede komponentene bruker OpenCV og hvordan du til noen vanlige operasjoner. Nå vil jeg snakke om en annen nyttig og felles oppgave: å filtrere koblet komponenter til å trekke ut bare de som passerer visse vilkår. Og for å gjøre ting mer generisk, vil kriteriene bli definert av den som ringer ved hjelp av funksjonspekere. Revisiting OpenCVOpenCV er en kul datamaskin visjon og bildebehandling bibliotek som er mye brukt og har mange gode funksjoner. Vi vil bruke den til å trekke ut og filtrere de tilkoblede komponentene fra et bilde.
Revisiting Connected Component utvinning Vi kan trekke ut de tilkoblede komponentene i et bilde med cvFindContours funksjonen som beskrevet her. Den lagrer konturene av de tilkoblede komponentene i en liste over sekvenser. Hver sekvens inneholder avreise et polygon som tilnærmet som kontur og vi kan navigere denne listen over sekvenser ved hjelp av h_next, h_prev, v_next og v_prev pekere. CvSeq: Sekvenser i OpenCV The CvSeq typen er en sekvens i OpenCV og det er brukt til å lagre konturene av de tilkoblede komponentene.
Siden vi vil filtrere de tilkoblede komponentene, så vi trenger en måte å slette en kontur fra listen. Den cvSeqRemove funksjonen fjerner elementer fra en sekvens, men det fjerner ikke en hel sekvens fra vår kontur listen. Slik fjerner du en sekvens fra listen vi trenger å rote med h_next og h_prev pekere. Hvis vi ønsker å fjerne det første elementet vi trenger bare for å gjøre konturene pekeren peker på det andre elementet. Hvis du vil fjerne et element i midten av listen vi "hoppe" ham fra sekvensen.
Fremgangsmåten er enkel og smart: hvis vi ønsker å fjerne X element vi gjøre h_next pekeren av forrige element punktet til en etter X og h_prev av det neste elementet punktet til elementet før X . Akkurat som dette: Selvfølgelig må vi sjekke om X har noen etter ham, så vi ikke kjøre inn i noen Segmentering Feil fjerne det siste elementet. Definere en definerte kriterier funksjon med funksjonspekere å gjøre filtreringskriteriene generiske vi vil bruke funksjonspekere. Tanken er å sende en kontur til et kriterium funksjon som aksepterer eller avviser en kontur. Hvis konturen blir avvist så fjerner vi det fra vår liste over konturer. Til slutt bare aksepterte konturer vil forbli og vi returnere de ptr-> h_prev-> h_next = ptr-> h_next; if (ptr-> h_next = NULL!) ptr-> h_next-> h_prev = ptr-> h_prev;