Asignador de memoria personalizado para OpenCV

¿Es posible establecer un asignador personalizado para OpenCV 2.3.1? Tengo un grupo de memoria creado y quiero que OpenCV use ese grupo para lo que necesita.

¿Es eso posible? Si es así, ¿cómo se puede hacer?

Actualizado:

Hice algunos desarrollos desde la última respuesta, pero todavía tengo algunos problemas. Este es el código que tengo ahora:

CvAllocFunc allocCV() 
{ 
     return (CvAllocFunc) MEMPOOL->POOLalloc(sz); 
}

CvFreeFunc deallocCV()
{
    return (CvFreeFunc) MEMPOOL->POOLfree(ptr);
}

...

cvSetMemoryManager(allocCV(),deallocCV(),data);

Ahora, mi pregunta es, ¿cómo puedo tener acceso al tamaño y al puntero de los datos que quiero asignar y luego desasignar?

Me acabo de enterar: la versión de OpenCV que estoy usando (2.3.1) arroja un error al usar cvSetMemoryManager. La razón está en su código fuente:

void cvSetMemoryManager( CvAllocFunc, CvFreeFunc, void * )
{
    CV_Error( -1, "Custom memory allocator is not supported" );
}

Estaba muy decepcionado con esto. ¡Supongo que ya no puedo usar un grupo de memoria personalizado con OpenCV!

preguntado el 22 de mayo de 12 a las 15:05

1 Respuestas

Directamente desde los documentos

http://opencv.willowgarage.com/documentation/c/core_utility_and_system_functions_and_macros.html#setmemorymanager

Use el

void cvSetMemoryManager(CvAllocFunc allocFunc=NULL, CvFreeFunc freeFunc=NULL, void* userdata=NULL)

función.

Tu codigo

cvSetMemoryManager(allocCV(),deallocCV(),data);

Está Mal.

Mira lo que pasa: tú llamar al funciones allocCV y deallocCV (devuelven un puntero que se convierte discretamente en cvAllocFunc) !

Y esto es solo el comienzo. Consulte los documentos para la semántica alloc/dealloc. Debe escribir allocCV/deallocCV con las firmas correctas.

void* CV_CDECL allocCV(size_t size, void* userdata)
{
     return ((YourMemPoolTypeWhichIDoNotKnow*)userdata)->POOLalloc(size);
}

int CV_CDECL deallocCV(void* pptr, void* userdata)
{
    return ((YourMemPoolTypeWhichIDoNotKnow*)userdata)->POOLfree(pptr);
}

y luego pase su MEMPOOL en el parámetro 'userdata':

cvSetMemoryManager(&allocCV, &deallocCV, (void*)MEMPOOL);

Esta es una forma estándar para que una biblioteca proporcione devoluciones de llamada de usuario.

contestado el 22 de mayo de 12 a las 16:05

Ya lo probé pero no pude hacerlo funcionar. No sé si estaba haciendo algo mal o si es por la versión de opencv. Estoy usando OpenCV 2.3.1 y esa función es de 2.1 y no encontré un equivalente para mi versión: André

Ok, probé de la manera anterior y compila sin errores, pero en tiempo de ejecución, arroja una excepción cuando intenta ejecutar cvSetMemoryManager. Algo como: Excepción de primera oportunidad en 0x7c... :\ ¿alguna idea? - André

Muchas razones pueden llevar a esto. ¿Está utilizando OpenCV en una DLL? Compruebe si la DLL y su proyecto tienen bibliotecas de tiempo de ejecución idénticas. - Viktor Latipov

El proyecto en el que estoy trabajando usa OpenCV y funciona bien, pero cuando intento ejecutar cvSetMemoryManager arroja un error... De todos modos, esto podría ser un problema con mi código. Gracias por tu ayuda - André

Estoy mirando el código para 2.4.2, y descubrí que cvSetMemoryManager() no está haciendo nada excepto lanzar una excepción con la cadena "No se admite el asignador de memoria personalizado". Hmm... parece que los mantenedores eliminaron esta función de alrededor de 2.x. :( - joonhwan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.