La función openCV findChessboardCorners está fallando en un escenario (aparentemente) simple

Estoy tratando de encontrar las esquinas de un tablero de ajedrez usando OpenCV.

La imagen que estoy usando contiene dos tableros de ajedrez, pero solo me interesa una sub-región de uno de esos. La siguiente imagen muestra la imagen original.

Imagen original

Usando GIMP, seleccioné el área de interés y establecí todos los demás píxeles a un valor predeterminado.

Imagen recortada

En realidad, no he recortado la imagen porque ya he calibrado la cámara con este tamaño de imagen y no quería cambiarla. La operación debería ser equivalente a cambiar los valores en la matriz de la imagen, pero preferí hacerlo con GIMP. Es un experimento de una sola vez y es más rápido realizar esa operación con una herramienta gráfica en lugar de usar el código.

La imagen resultante contiene un tablero de ajedrez con esquinas 24×5, pero la función findChessboardCorners no puede encontrar nada.

Aquí está el código de Python que estoy usando:

>>> img = cv2.imread('C:\\Path\\To\\C4-Cropped.png', 0) >>> cv2.findChessboardCorners(img, (24, 5)) (False, None) >>> cv2.findChessboardCorners(img, (5, 24)) (False, None) 

También intenté establecer el umbral adaptativo, pero aún no funciona

 >>> cv2.findChessboardCorners(img, (24, 5), flags=cv2.cv.CV_CALIB_CB_ADAPTIVE_THRESH) (False, None) 

Eso parece realmente extraño. Utilicé esta función de OpenCV muchas veces en el pasado y siempre funcionó, incluso con imágenes que parecían mucho más complicadas que esta. La iluminación del área no es homogénea, pero la función debe ser lo suficientemente robusta para manejar eso.

¿Hay algún problema con la imagen artificial creada ad hoc con GIMP? ¿Cómo puedo encontrar las esquinas?

Cualquier sugerencia sería muy apreciada.

Le apuesto $ 5 a que el umbral de la imagen dentro de findChessboardCorners está produciendo basura debido al fondo en la imagen enmascarada.

Recomiendo hacer un recorte, extraer el tablero de ajedrez, y luego compensar las coordenadas de las esquinas encontradas por la posición de la ventana de recorte.

Sé que llego unos meses tarde a la fiesta, pero hay dos cambios necesarios para que esa imagen sea aceptable para la función cv2.findChessboardCorners. Primero, el tablero de ajedrez necesita un fondo blanco. Obtuve esto simplemente ajustando el contraste de tu imagen. Segundo, también tuve que blanquear la línea horizontal oscura que conecta los cuadrados negros en la parte superior e inferior de su tablero de ajedrez. Esta es la imagen resultante: introduzca la descripción de la imagen aquí

Con estas mejoras, cv2.findChessboardCorners puede analizar exitosamente la imagen. Los resultados fueron:

 camera matrix = [[ 1.67e+04 0.00e+00 1.02e+03] [ 0.00e+00 1.70e+04 5.45e+02] [ 0.00e+00 0.00e+00 1.00e+00]] distortion coefficients = [ -4.28e+00 1.38e+03 -8.59e-03 -1.49e-02 6.93e+00] 

(Los pequeños cambios en la forma en que se mejora la imagen pueden cambiar los resultados anteriores en gran medida. Con solo una imagen de un tablero de ajedrez pequeño, no se puede confiar en estos resultados).

Como notó, cv2.findChessboardCorners acepta indicadores (umbral adaptable, filter_quads y normalización) que están destinados a ayudar con el reconocimiento del tablero de ajedrez. Intenté todo pero no hicieron ninguna diferencia aquí.

Agrega espacios en blanco alrededor del patrón de ajedrez. “Nota: La función requiere espacio en blanco (como un borde cuadrado-grueso, cuanto más ancho mejor) alrededor de la placa para que la detección sea más robusta en varios entornos. De lo contrario, si no hay borde y el fondo es oscuro, el negro exterior los cuadrados no se pueden segmentar correctamente y, por lo tanto, el algoritmo de agrupación y ordenamiento de cuadrados falla “.

Estoy trabajando en casi el mismo problema, pero en c ++. La función findChessboardCorners no siempre reconoce el tablero de ajedrez con el tamaño dado, y dado que la iluminación de su imagen no se propaga en el tablero de ajedrez, creo que esto marca una diferencia. Mi sugerencia es reducir el tamaño de su tablero de ajedrez hasta que encuentre algo. !!

La función detectCheckerboardPoints en Computer Vision System Toolbox para Matlab lo detecta, pero le brinda una columna adicional:

Resultado de detectCheckerboardPoints de Matlab

Debería poder deshacerse de la columna adicional de la derecha pero moviendo el borde derecho de la región seleccionada un poco hacia la izquierda.