una tutorial raspberry objetos imagen extraccion español deteccion con colores caracteristicas camara python c opencv image-processing computer-vision

tutorial - imread opencv python



La detección de objetivo de punto OpenCV no encuentra todos los objetivos, y los círculos encontrados se compensan (2)

Dado que el patrón del círculo es fijo y se distingue bien del objeto, la comparación simple de la plantilla debería funcionar razonablemente bien, consulte cvMatchTemplate . Para condiciones más complejas (deformación debido a la forma del objeto o la geometría de la vista), puede probar características más sólidas como SIFT o SURF ( cvExtractSURF ).

Intento detectar el centro de blancos con puntos negros / blancos, como en esta imagen. Intenté usar el método cv2.HoughCircles pero 1, solo puedo detectar de 2 a 3 objetivos, y 2, cuando trazo los círculos encontrados de nuevo en la imagen, siempre están ligeramente desplazados.

¿Estoy usando el método equivocado? ¿Debería usar FindContours o algo completamente diferente?

Aquí está mi código:

import cv2 from cv2 import cv import os import numpy as np def showme(pic): cv2.imshow(''window'',pic) cv2.waitKey() cv2.destroyAllWindows() im=cv2.imread(''small_test.jpg'') gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #I''ve tried blur,bw,tr... all give me poor results. blur = cv2.GaussianBlur(gray,(3,3),0) n,bw = cv2.threshold(blur,120,255,cv2.THRESH_BINARY) tr=cv2.adaptiveThreshold(blur,255,0,1,11,2) circles = cv2.HoughCircles(gray, cv.CV_HOUGH_GRADIENT, 3, 100, None, 200, 100, 5, 16) try: n = np.shape(circles) circles=np.reshape(circles,(n[1],n[2])) print circles for circle in circles: cv2.circle(im,(circle[0],circle[1]),circle[2],(0,0,255)) showme(im) except: print "no cicles found"

Y este es mi resultado actual:


Tocando el código que escribí en otra publicación , pude lograr un resultado ligeramente mejor:

Se trata de los parámetros. Siempre lo es.

Hay 3 funciones importantes que se llaman en este programa con las que debe experimentar: cvSmooth() , cvCanny() y cvHoughCircles() . Cada uno de ellos tiene el potencial de cambiar el resultado drásticamente.

Y aquí está el código C:

IplImage* img = NULL; if ((img = cvLoadImage(argv[1]))== 0) { printf("cvLoadImage failed/n"); } IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); CvMemStorage* storage = cvCreateMemStorage(0); cvCvtColor(img, gray, CV_BGR2GRAY); // This is done so as to prevent a lot of false circles from being detected cvSmooth(gray, gray, CV_GAUSSIAN, 7, 9); IplImage* canny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); IplImage* rgbcanny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3); cvCanny(gray, canny, 40, 240, 3); CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/8, 120, 10, 2, 25); cvCvtColor(canny, rgbcanny, CV_GRAY2BGR); for (size_t i = 0; i < circles->total; i++) { // round the floats to an int float* p = (float*)cvGetSeqElem(circles, i); cv::Point center(cvRound(p[0]), cvRound(p[1])); int radius = cvRound(p[2]); // draw the circle center cvCircle(rgbcanny, center, 3, CV_RGB(0,255,0), -1, 8, 0 ); // draw the circle outline cvCircle(rgbcanny, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 ); printf("x: %d y: %d r: %d/n",center.x,center.y, radius); } cvNamedWindow("circles", 1); cvShowImage("circles", rgbcanny); cvSaveImage("out.png", rgbcanny); cvWaitKey(0);

Confío en que tienes las habilidades para llevar esto a Python.