Jak wykrywać proste kształty geometryczne za pomocą OpenCV

Mam ten projekt, w którym muszę (na iOS) wykrywać proste geometryczne kształty wewnątrz obrazu.

Tutaj wpisz opis obrazka

Po przeszukaniu Internetu doszedłem do wniosku, że najlepszym narzędziem do tego jest OpenCV. Chodzi o to, że jeszcze dwie godziny temu nie miałem pojęcia, czym jest OpenCV i nigdy nawet zdalnie nie robiłem niczego związanego z przetwarzaniem obrazu. Moje główne doświadczenie to JS / HTML,C#, SQL, Objective-C...

Od czego zacząć?

Znalazłem to odpowiedź że byłem w stanie przetrawić i czytając już inne rzeczy, rozumiem, że OpenCV powinien zwrócić tablicę kształtów z punktami / narożnikami, czy to prawda? Również jak będzie to reprezentować koło lub pół koła? A co z orientacją kształtu?

Czy znasz jakiś projekt Demo iOS, który może zademonstrować podobną funkcjonalność?

 41
Author: Community, 2012-07-11

3 answers

Jeśli masz tylko te regularne kształty, istnieje prosta procedura w następujący sposób:

  1. Znajdź kontury w obrazie (obraz powinien być binarny, jak podano w twoim pytaniu)
  2. przybliżenie każdego konturu za pomocą funkcji approxPolyDP.
  3. najpierw sprawdź liczbę elementów w przybliżonych konturach wszystkich kształtów. To rozpoznawanie kształtu. Na przykład kwadrat będzie miał 4, pentagon będzie miał 5. Kręgi będą miały więcej, nie wiem, więc je znajdziemy. (Mam 16 za kółko i 9 za półkole.)
  4. Teraz Przypisz kolor, Uruchom kod do testowego obrazu, Sprawdź jego numer, wypełnij go odpowiednimi kolorami.

Poniżej mój przykład w Pythonie:

import numpy as np
import cv2

img = cv2.imread('shapes.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(gray,127,255,1)

contours,h = cv2.findContours(thresh,1,2)

for cnt in contours:
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
    print len(approx)
    if len(approx)==5:
        print "pentagon"
        cv2.drawContours(img,[cnt],0,255,-1)
    elif len(approx)==3:
        print "triangle"
        cv2.drawContours(img,[cnt],0,(0,255,0),-1)
    elif len(approx)==4:
        print "square"
        cv2.drawContours(img,[cnt],0,(0,0,255),-1)
    elif len(approx) == 9:
        print "half-circle"
        cv2.drawContours(img,[cnt],0,(255,255,0),-1)
    elif len(approx) > 15:
        print "circle"
        cv2.drawContours(img,[cnt],0,(0,255,255),-1)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Poniżej wyjście:

Tutaj wpisz opis obrazka

Pamiętaj, że działa tylko dla regularnych kształtów.

Alternatywnie, aby znaleźć okręgi, możesz użyć houghcircles. Tutorial znajdziesz tutaj .

Jeśli chodzi o iOS, deweloperzy OpenCV opracowują próbki iOS tego lata, więc odwiedź ich stronę : www.code.opencv.org i skontaktować się z nimi.

Slajdy z ich samouczka znajdziesz tutaj: http://code.opencv.org/svn/gsoc2012/ios/trunk/doc/CVPR2012_OpenCV4IOS_Tutorial.pdf

 71
Author: Abid Rahman K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-04 21:40:15

Odpowiedź zależy od obecności innych kształtów, poziomu hałasu, jeśli istnieje i niezmienności, którą chcesz zapewnić (np. obrót, skalowanie itp.). Wymagania te będą definiować nie tylko algorytm, ale także wymagane etapy wstępnego przetwarzania do wyodrębnienia funkcji.

Dopasowanie szablonu , które zostało zasugerowane powyżej, działa dobrze, gdy kształty nie są obracane lub skalowane i gdy nie ma podobnych kształtów; innymi słowy, najlepsze tłumaczenie znajduje się w obrazie, w którym znajduje się szablon "located": {]}

double minVal, maxVal;
Point minLoc, maxLoc;
Mat image, template, result; // template is your shape
matchTemplate(image, template, result, CV_TM_CCOEFF_NORMED);
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); // maxLoc is answer

Haszowanie geometryczne jest dobrą metodą uzyskania niezmienności w zakresie obrotu i skalowania; metoda ta wymagałaby ekstrakcji niektórych punktów konturu.

Uogólniona transformacja Hough może dbać o niezmienność, szum i ma minimalne wstępne przetwarzanie, ale jest nieco trudniejsza do wdrożenia niż inne metody. OpenCV ma takie przekształcenia dla linii i okręgów.

W przypadku, gdy liczba kształtów jest ograniczona momentami obliczeniowymi lub zliczanie wypukłych wierzchołków kadłuba może być najprostszym rozwiązaniem: analiza strukturalna openCV

 17
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 20:26:57

Możesz również użyć dopasowania szablonu do wykrywania kształtów wewnątrz obrazu.

 3
Author: chans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 17:32:27