2014-04-20 20 views
5

Jestem nowym użytkownikiem OpenCV i mam kilka pytań. Muszę wykryć butelkę lub puszkę w zależności od ich kształtu. Do tego używam tablicy raspberry pi i pi kamery. Tło jest zawsze czarne i nie zmienia się. Próbowałem wielu możliwych rozwiązań tego problemu, ale nie mogłem uzyskać zadowalających wyników. Rzeczy, które próbowałem, to wykrywanie krawędzi, transformacje morfologiczne, matchShapes(), matchTemplate(). Daj mi znać, jeśli mogę wykonać to zadanie sprawnie i z maksymalną dokładnością.Wykrywanie puszki lub butelki w opencv

Przykładowy obraz:

enter image description here

+0

Więc nie będzie żadnego obiektu na scenie, poza butelką ?. – Haris

+0

W określonym czasie nie będzie żadnego przedmiotu innego niż butelka lub puszka. – user3553000

+1

Następnie zastosować [próg odwrotny binarny] (http://docs.opencv.org/doc/tutorials/imgproc/threshold/threshold.html#threshold-binary-inverted) o niskiej wartości, aby uzyskać pierwszy plan. – Haris

Odpowiedz

3

wymyśliłem podejścia, które mogą pomóc! Jeśli wiesz więcej rzeczy na temat puszki, tj. Stosunek szerokości do wysokości, to może być bardziej odporny, dostosowując rozmiar prostokąta!

Podejście

  • Konwersja obrazu do HSV przestrzeni barw. Zwiększ wartość V o współczynnik 2, aby uzyskać bardziej widoczne rzeczy.
  • Znajdź pochodne Sobel w kierunku x i y. Oblicz wielkość z jednakową wagą dla obu kierunków.
  • Próg obrazu za pomocą metody Otsu.
  • Zastosuj do ciebie zdjęcie Closing.
  • Zastosuj detektor krawędzi Canny.
  • Znajdź Hough Line Transform.
  • Znajdź granice prostokąta obrazu linii.
  • Nakładanie go na obrazie (w końcu zrobić: P).

Kod

image = cv2.imread('image3.jpg', cv2.IMREAD_COLOR) 
original = np.copy(image) 
if image is None: 
    print 'Can not read/find the image.' 
    exit(-1) 

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 
H,S,V = hsv_image[:,:,0], hsv_image[:,:,1], hsv_image[:,:,2] 
V = V * 2 

hsv_image = cv2.merge([H,S,V]) 
image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB) 
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) 
# plt.figure(), plt.imshow(image) 

Dx = cv2.Sobel(image,cv2.CV_8UC1,1,0) 
Dy = cv2.Sobel(image,cv2.CV_8UC1,0,1) 
M = cv2.addWeighted(Dx, 1, Dy,1,0) 

# plt.subplot(1,3,1), plt.imshow(Dx, 'gray'), plt.title('Dx') 
# plt.subplot(1,3,2), plt.imshow(Dy, 'gray'), plt.title('Dy') 
# plt.subplot(1,3,3), plt.imshow(M, 'gray'), plt.title('Magnitude') 

ret, binary = cv2.threshold(M,10,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 
# plt.figure(), plt.imshow(binary, 'gray') 

binary = binary.astype(np.uint8) 
binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (20, 20))) 
edges = cv2.Canny(binary, 50, 100) 
# plt.figure(), plt.imshow(edges, 'gray') 

lines = cv2.HoughLinesP(edges,1,3.14/180,50,20,10)[0] 
output = np.zeros_like(M, dtype=np.uint8) 
for line in lines: 
    cv2.line(output,(line[0],line[1]), (line[2], line[3]), (100,200,50), thickness=2) 
# plt.figure(), plt.imshow(output, 'gray') 

points = np.array([np.transpose(np.where(output != 0))], dtype=np.float32) 
rect = cv2.boundingRect(points) 
cv2.rectangle(original,(rect[1],rect[0]), (rect[1]+rect[3], rect[0]+rect[2]),(255,255,255),thickness=2) 
original = cv2.cvtColor(original,cv2.COLOR_BGR2RGB) 
plt.figure(), plt.imshow(original,'gray') 


plt.show() 

UWAGA: można odkomentuj wiersze dla pokazujący wynik każdego kroku! Po prostu komentuję je ze względu na czytelność.

Wynik

Result Image

UWAGA: Jeżeli znasz proporcje Twojego może można naprawić to lepiej!

Mam nadzieję, że to pomoże. Powodzenia :)

+1

Dziękuję bardzo za komentarz. Myślę, że potrafię obliczyć proporcje puszki lub butelki. Powinienem porównać wysokość i szerokość prostokąta ze standardowymi rozmiarami puszek. – user3553000

Powiązane problemy