Skocz do zawartości

Obliczanie długości konturów w Open CV


mikowal91

Pomocna odpowiedź

Witam,

Na RPi 4 mam zainstalowane biblioteki OpenCV do wyszukiwania konturów na przedstawionym obrazie. Poniżej program:

#include <iostream>

#include "OpenCV/cv.h"

#include "OpenCV/highgui.h"

CvSeq * znajdz_kontury(IplImage* obrazek)

{

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;

}

 

Chciałbym dodać na programu funkcję, która policzyłby mi jaka jest długość konturu i jakie jest pole. Znalzałem następujące funkcje

cv.contourArea ()  - na obliczanie pola 

cv.arcLength () - na obliczanie długości konturu.

 

Pytanie mam, gdzie i w jaki sposób mógłbym je wstawić abym w wyniku uzyskał dane wartości, które mnie interesują?

 

Edytowano przez Gieneq
  • Lubię! 2
Link do komentarza
Share on other sites

@mikowal91, proszę, nie jestem pewien, czy nie będą to piksele dla obwodu i piksele "kwadratowe" dla pola? Możesz sprawdzić, próbując na wejście dać jakiś białe tło - obraz 200x200px, a w środku czarny prostokąt np. 100x50px, zobaczymy, co dostaniesz 🙂 Natomiast jeśli miałyby być to bardziej użyteczne jednostki, np. milimetry, to musisz pamiętać o rybim oku, zniekształceniach itd., ale przede wszystkim mieć jakiś przelicznik px/mm - można to robić kalibrując kamerę jednorazowo, lub na stałe zawsze na zdjęciu mieć jakiś wzorzec o znanych wymiarach, tak jak tutaj: https://www.pyimagesearch.com/2016/03/28/measuring-size-of-objects-in-an-image-with-opencv/

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

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.