Rilevamento semplice di oggetti tramite OpenCV e apprendimento automatico

Devo codificare un rivelatore di oggetti (in questo caso una palla) usando OpenCV. Il problema è che ogni singola ricerca su google mi restituisce qualcosa con FACE DETECTION in esso. Quindi ho bisogno di aiuto su dove iniziare, cosa usare ecc.

Alcune informazioni:

  • La palla non ha un colore fisso, sarà probabilmente bianca, ma potrebbe cambiare.
  • DEVO usare l’apprendimento automatico, non deve essere complesso e affidabile, il suggerimento è KNN (che è SEMPLICE e più semplice).
  • Dopo tutte le mie ricerche, ho trovato che calcolare l’istogramma delle immagini di soli campioni di palline e insegnarlo alla ML potrebbe essere utile, ma la mia preoccupazione principale qui è che la dimensione della palla può e cambierà (più vicino e più lontano dalla fotocamera) e non ho idea di cosa passare alla ML per classificare per me, voglio dire .. non posso (o posso?) testare ogni pixel dell’immagine per ogni dimensione ansible (da, diciamo, da 5×5 a WxH ) e spero di trovare un risultato positivo.
  • Potrebbe esserci uno sfondo non uniforms, come persone, stoffa dietro la palla, ecc.
  • Come ho detto, devo usare un algoritmo ML, cioè nessun algoritmo Haar o Viola.
  • Inoltre, ho pensato di usare i contorni per trovare cerchi su un’immagine Canny, basta trovare un modo per trasformare un contorno in una fila di dati per insegnare la KNN.

    Quindi … suggerimenti?

    Grazie in anticipo. 😉

Beh, in pratica devi rilevare i cerchi . Hai visto cvHoughCircles() ? Ti è permesso usarlo?

Questa pagina ha buone informazioni su come rilevare cose con OpenCV . Potresti essere più interessato alla sezione 2.5 .

Questa è una piccola demo che ho appena scritto per rilevare le monete in questa immagine. Spero che tu possa usare una parte del codice a tuo vantaggio.

Input : immissione img

Uscite : uscita 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; } 

Il rilevamento dei cerchi dipende molto dai parametri di cvHoughCircles() . Nota che in questa demo ho usato anche Canny.