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.