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.
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ść?
3 answers
Jeśli masz tylko te regularne kształty, istnieje prosta procedura w następujący sposób:
- Znajdź kontury w obrazie (obraz powinien być binarny, jak podano w twoim pytaniu)
- przybliżenie każdego konturu za pomocą funkcji
approxPolyDP
. - 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.)
- 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:
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
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
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.
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