Skocz do zawartości

Wyszukiwanie konturów


mikowal91

Pomocna odpowiedź

Witam,

Czy mógłby mi ktoś pomóc w zakresie wyszukiwania konturów na obrazie? Sytuacja wygląda tak, że robie zdjęcie, pobieram obraz oczywisice odpowiednio go przetwarzam itp. na końcu zaznaczam na nim konutr, tylko chciałbym aby ten kontur był prawidłowy a mam wynik jak poniżej. Czy ktoś mógłby mi pomóc w danym temacie?

image.thumb.png.fd1a8d98e907a5dd03358d61488f046d.png

Link do komentarza
Share on other sites

(edytowany)

@TrekerZerkałem już na dany projekt, niestety nic nie udało mi się pomocnego z niego wyciągnąć.

 

@FlyingDutch poniżej kod z jakiego korzystam 

include <iostream>

#include "OpenCV/cv.h"

#include "OpenCV/highgui.h"


CvSeq * znajdz_kontury(IplImage* obrazek)

{

// czytamy obraz, jezeli nie istnieje, to zwracamy NULL

IplImage* obraz;

cvCvtColor(obrazek, obraz, CV_RGB2GRAY);

if (obraz == NULL)

return NULL;


// nasz kontur

CvSeq * kontur;

// pamiec na obliczenia

CvMemStorage * mem = cvCreateMemStorage(0);

// operacja progrowania

cvThreshold(obraz, obraz, 100, 255, CV_THRESH_BINARY_INV);

// szukanie konturow

cvFindContours(obraz, mem, &kontur);

// aproksymacja konturow

kontur = cvApproxPoly(kontur, sizeof (CvContour), mem, CV_POLY_APPROX_DP, cvContourPerimeter(kontur) * 0.035);

// sprzatanie

cvReleaseImage(&obraz);

// powinnio sie jeszcze zwolnic memstora ale na potrzeby przykladu tego nie robimy

// (poniewaz zwracamy wskaznik na sekwencje do dalszego uzycia)


return kontur;

}

//--------------------------------------------------------------

void wyswietl_kontury(IplImage* kolorowyObraz)

{

// czytamy obraz, jezeli nie istnieje, to zwracamy NULL

IplImage * obraz = kolorowyObraz;

if (obraz == NULL)return;


// przystowowywanie obrazu

IplImage * do_analizy = cvCreateImage(cvSize(obraz->width, obraz->height), 8, 1);

cvCvtColor(obraz, do_analizy, CV_BGR2GRAY);


// nasz kontur

CvSeq * kontur;

// pamiec na obliczenia

CvMemStorage * mem = cvCreateMemStorage(0);

// operacja progowania

cvThreshold(do_analizy, do_analizy, 100, 255, CV_THRESH_BINARY_INV);

// szukanie konturow

cvFindContours(do_analizy, mem, &kontur, sizeof (CvContour), CV_RETR_TREE);


for (; kontur != NULL; kontur = kontur->h_next)

{

// aproksymacja konturu

CvSeq* temp_kontur = cvApproxPoly(kontur, sizeof (CvContour), mem, CV_POLY_APPROX_DP, cvContourPerimeter(kontur) * 0.035);

// zaznaczanie konturow na obrazie

cvDrawContours(obraz, temp_kontur, cvScalar(0.0, 255.0, 0.0, 0.0), cvScalar(0.0, 255.0, 0.0, 0.0), 100, 2, CV_AA, cvPoint(0, 0));

}

cvNamedWindow("kontury", CV_WINDOW_AUTOSIZE);

cvShowImage("kontury", obraz);


while (1)

{

int l = cvWaitKey(100);

if (l == 27)break;

}

}

//--------------------------------------------------------------



int main (int argc, char * const argv[])

{

IplImage * o = cvLoadImage("klatka.jpg", CV_LOAD_IMAGE_COLOR);

wyswietl_kontury(o);

return 0;

}

 

Edytowano przez mikowal91
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

13 godzin temu, Treker napisał:

zerknij na poniższy projekt, może będzie pomocny:

heh 🙂 

@mikowal91  a dlaczego używasz takie progowanie?

cvThreshold(obraz, obraz, 100, 255, CV_THRESH_BINARY_INV);

W sytuacji, gdy obraz cechuje się jakimś gradientem to nie jest to dobry pomysł. Wrzuć sobie na obraz wynik progowania, jeżeli będzie błąd to zlep 3 kanały w obraz RGB.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.