Detecção simples de objects usando OpenCV e aprendizado de máquina

Eu tenho que codificar um detector de objects (neste caso, uma bola) usando o OpenCV. O problema é que cada pesquisa no google me retorna algo com DETECÇÃO DE FACE. Então eu preciso de ajuda sobre onde começar, o que usar etc.

Algumas informações:

  • A bola não tem uma cor fixa, provavelmente será branca, mas pode mudar.
  • Eu tenho que usar aprendizado de máquina, não tem que ser um complexo e confiável, sugestão é KNN (que é muito mais simples e fácil).
  • Depois de toda a minha pesquisa, descobri que calcular o histograma de amostras de imagens somente de bola e ensiná-las ao ML poderia ser útil, mas minha principal preocupação aqui é que o tamanho da bola pode mudar (mais e mais longe da câmera) e Eu não tenho idéia do que passar para o ML para classificar para mim, quero dizer .. Eu não posso (ou posso?) apenas testar cada pixel da imagem para cada tamanho possível (de, digamos, 5×5 para WxH ) e esperamos encontrar um resultado positivo.
  • Pode haver um fundo não uniforme, como pessoas, pano atrás da bola e etc.
  • Como eu disse, eu tenho que usar um algoritmo ML, que significa nenhum algoritmo de Haar ou Viola.
  • Além disso, pensei em usar contornos para encontrar círculos em uma imagem de Canny’ed, apenas tem que encontrar uma maneira de transformar um contorno em uma linha de dados para ensinar o KNN.

    Então … sugestões?

    Desde já, obrigado. 😉

Bem, basicamente você precisa detectar círculos . Você viu cvHoughCircles() ? Você tem permissão para usá-lo?

Esta página tem boas informações sobre como detectar coisas com o OpenCV . Você pode estar mais interessado na seção 2.5 .

Esta é uma pequena demonstração que acabei de escrever para detectar moedas nesta foto. Espero que você possa usar alguma parte do código para sua vantagem.

Entrada : entrada img

Saídas : saída opencv img

 // compiled with: g++ circles.cpp -o circles `pkg-config --cflags --libs opencv` #include  #include  #include  #include  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: %dy: %dr: %d\n",center.x,center.y, radius); } cvNamedWindow("circles", 1); cvShowImage("circles", rgbcanny); cvSaveImage("out.png", rgbcanny); cvWaitKey(0); return 0; } 

A detecção dos círculos depende muito dos parâmetros de cvHoughCircles() . Note que nesta demonstração usei o Canny também.