c++ - canny - Detección simple de objetos usando OpenCV y aprendizaje automático
deteccion de bordes canny python (1)
Bueno, básicamente necesitas detectar círculos . ¿Has visto cvHoughCircles()
? ¿Puedes usarlo?
Esta página tiene buena información sobre cómo detectar cosas con OpenCV . Es posible que esté más interesado en la sección 2.5 .
Esta es una pequeña demostración que acabo de escribir para detectar monedas en esta imagen. Con suerte, puede usar alguna parte del código para su ventaja.
Entrada :
Productos :
// compiled with: g++ circles.cpp -o circles `pkg-config --cflags --libs opencv`
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char** argv)
{
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, 7);
IplImage* canny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
IplImage* rgbcanny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
cvCanny(gray, canny, 50, 100, 3);
CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, gray->height/3, 250, 100);
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);
return 0;
}
La detección de los círculos depende mucho de los parámetros de cvHoughCircles()
. Tenga en cuenta que en esta demostración también usé Canny.
Tengo que codificar un detector de objetos (en este caso, una bola) usando OpenCV. El problema es que cada búsqueda en google me devuelve algo con DETECCIÓN DE CARA. Entonces necesito ayuda sobre dónde comenzar, qué usar, etc.
Alguna información:
- La bola no tiene un color fijo, probablemente sea blanca, pero podría cambiar.
- TENGO que usar aprendizaje automático, no tiene por qué ser complejo y confiable, la sugerencia es KNN (que es MUCHO más simple y más fácil).
- Después de toda mi búsqueda, encontré que calcular el histograma de muestras de imágenes de solo bola y enseñarle ML podría ser útil, pero mi principal preocupación aquí es que el tamaño de la pelota puede cambiar y cambiará (más cerca y más lejos de la cámara) y No tengo idea de qué pasar al ML para clasificar para mí, quiero decir ... no puedo (¿o puedo?) simplemente probar cada píxel de la imagen para cada tamaño posible (desde, digamos, 5x5 a WxH ) y espero encontrar un resultado positivo.
- Puede haber un fondo no uniforme, como personas, tela detrás de la pelota y etc.
- Como dije, tengo que usar un algoritmo ML, que significa que no hay algoritmos Haar o Viola.
Además, pensé en usar contornos para encontrar círculos en una imagen de Canny, solo tengo que encontrar una manera de transformar un contorno en una fila de datos para enseñarle al KNN.
Entonces ... ¿sugerencias?
Gracias por adelantado. ;)