Necesito detectar el Sol desde el cielo del espacio.¿Cómo detectar el Sol desde el cielo del espacio en OpenCv?
Estos son ejemplos de las imágenes de entrada:
Tengo estos resultados después de filtrado morfológico (open
operación de dos veces)
Aquí está el código del algoritmo de este procesamiento:
// Color to Gray
cvCvtColor(image, gray, CV_RGB2GRAY);
// color threshold
cvThreshold(gray,gray,150,255,CV_THRESH_BINARY);
// Morphologic open for 2 times
cvMorphologyEx(gray, dst, NULL, CV_SHAPE_RECT, CV_MOP_OPEN, 2);
¿No es un proceso demasiado pesado para una tarea tan simple? ¿Y cómo encontrar el centro del sol? Si encuentro puntos blancos, entonces encontraré puntos blancos de la Tierra grande (esquina superior izquierda en la primera imagen de ejemplo)
Por favor avísenme, por favor, mis medidas adicionales para detectar el sol.
ACTUALIZACIÓN 1:
Tratando algoritmo de conseguir centroid
por la fórmula: {x,y} = {M10/M00, M01/M00}
CvMoments moments;
cvMoments(dst, &moments, 1);
double m00, m10, m01;
m00 = cvGetSpatialMoment(&moments, 0,0);
m10 = cvGetSpatialMoment(&moments, 1,0);
m01 = cvGetSpatialMoment(&moments, 0,1);
// calculating centroid
float centroid_x = m10/m00;
float centroid_y = m01/m00;
cvCircle(image,
cvPoint(cvRound(centroid_x), cvRound(centroid_y)),
50, CV_RGB(125,125,0), 4, 8,0);
Y donde está la Tierra en la foto, me dieron este resultado:
Así , centroide está en la Tierra. :(
ACTUALIZACIÓN 2:
Tratando cvHoughCircles
:
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* circles = cvHoughCircles(dst, storage, CV_HOUGH_GRADIENT, 12,
dst->width/2, 255, 100, 0, 35);
if (circles->total > 0) {
// getting first found circle
float* circle = (float*)cvGetSeqElem(circles, 0);
// Drawing:
// green center dot
cvCircle(image, cvPoint(cvRound(circle[0]),cvRound(circle[1])),
3, CV_RGB(0,255,0), -1, 8, 0);
// wrapping red circle
cvCircle(image, cvPoint(cvRound(circle[0]),cvRound(circle[1])),
cvRound(circle[2]), CV_RGB(255,0,0), 3, 8, 0);
}
Primer ejemplo: bingo, pero el segundo - no; (
I' he probado una configuración diferente de cvHoughCircles()
: no pude encontrar la configuración para que se ajuste a todas mis fotos de ejemplo.
Update3:
matchTemplate
enfoque funcionó para mí (respuesta de mevatron
). Funcionó con una gran cantidad de pruebas.
En realidad, las razones por las que esto funciona son diferentes a las mencionadas. Para empezar, no hay nada parecido a la plantilla utilizada en ningún otro lugar en estas imágenes. Además, es mucho más probable que sea varias veces más lento que el enfoque morfológico inicial. – mmgp
De hecho, son buenos puntos :) Sin embargo, dado que estaba asumiendo que la nave espacial está en nuestro sistema solar, creo que es seguro decir que solo aparecerá un Sol: D – mevatron
Supongo que esto fallaría si alguna parte del HUD (el piloto interfaz de usuario) se pone encima del sol. A menos que la coincidencia de la plantilla arroje un puntaje sobre cuán buena es la coincidencia, de esa manera podría establecer el umbral de los mejores resultados y probablemente funcionaría con algunas obstrucciones. –