Convertir la matriz de OpenCV en bucle a JavaCV

Obtuve el libro 'Learning OpenCV' de O'Reilly no hace mucho, y desde entonces he estado ocupado convirtiendo todo el código de ejemplo que veo allí desde OpenCV a JavaCV, generalmente seguido de un poco de mi propia modificación también. Todo el tiempo, trato de mantener el código puro de OpenCV (lenguaje C) tanto como sea posible y evitar Java. Por ejemplo, implementé todos los elementos de la interfaz directamente a través del paquete OpenCV highgui en JavaCV, en lugar de hacerlo a través de Java Swing. Al hacer esto, espero aprender la biblioteca de OpenCV y algo de C en un tiempo relativamente corto, así como establecer una biblioteca de funciones útiles que pueda convertir a C fácilmente si decido cambiar más tarde a OpenCV puro.

e todos modos, tengo poco conocimiento de C y, a veces, me meto en problemas cuando trato con punteros. El libro recomienda el siguiente código como un medio óptimo para iterar a través de una matriz de 3 canales:

float sum( const CvMat* mat ) {
    float s = 0.0f;
    for(int row=0; row<mat->rows; row++ ) {
        const float* ptr = (const float*)(mat->data.ptr + row * mat->step);
        for( col=0; col<mat->cols; col++ ) {
            s += *ptr++;
        }
    }
    return( s );
}

Aquí está la explicación incluida para este código:

Al calcular el puntero en la matriz, recuerde que los datos del elemento de la matriz son una unión. Por lo tanto, al desreferenciar este puntero, debe indicar el elemento correcto de la unión para obtener el tipo de puntero correcto. Luego, para desactivar ese puntero, debe usar el elemento de paso de la matriz. Como se señaló anteriormente, el elemento de paso está en bytes. Para estar seguro, es mejor hacer la aritmética del puntero en bytes y luego convertirlo al tipo apropiado, en este caso flotante. Aunque la estructura CVMat tiene el concepto de altura y anchura para compatibilidad con la estructura IplImage más antigua, usamos las filas y columnas más actualizadas. Finalmente, tenga en cuenta que recalculamos ptr para> cada fila en lugar de simplemente comenzar desde el principio y luego incrementar ese puntero en cada lectura. Esto puede parecer excesivo, pero debido a que el puntero de datos CvMat podría apuntar a un ROI dentro de una matriz más grande, no hay garantía de que los datos sean> contiguos en las filas.

Sin embargo, tengo problemas para convertirlo a JavaCV. El campo ptr (puntero) parece ser flotante, lo que me confunde. Supongo que en realidad no es un "puntero", sino un valor al que se agrega el valor de cada píxel. ¿O es realmente un puntero, cuyo valor s encuentra la suma total de todas las columnas dentro de una fila dada?

e todos modos, agradecería que alguien me publicara un código JavaCV para un bucle equivalente. Sé que hay otras formas de acceder a cada píxel en un CvMat, pero AFAIK son menos eficientes o inexactas.

Respuestas a la pregunta(4)

Su respuesta a la pregunta