Skocz do zawartości

Pomocna odpowiedź

Napisano

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

Cześć,

czy zaznaczenie konturu robisz programowo? Jeśli tak jakiej biblioteki i kodu używasz? Dopiero po podaniu tych danych ktoś będzie w stanie Ci pomóc.

Pozdrawiam

(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
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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...