2010-07-10 15 views
7

¿Hay alguien con un código de ejemplo C que implemente LiveView con la Canon EDSDK? El código de muestra en la documentación se ve muy bien hasta que llegue a este bit:Código de ejemplo C para Canon EDSDK Liveview?

// 
// Display image 
// 

Sí, eso es todo. No muestran cómo BLT una imagen en una ventana utilizando los datos recuperados de la cámara. Solo dicen "Mostrar imagen". Gracias, Canon.

He buscado en Internet (incluido este foro), pero todavía no he encontrado una muestra de código C que muestre cómo hacerlo. Estoy buscando evitar MFC, VB, código administrado o C#. Sin duda, es posible hacer esto en vainilla C, ¿verdad? Vanilla C++ también está bien.

Gracias, FredP

+1

¿Tiene MFC, VB, código administrado, o C# ejemplos? Si es así, incluir o vincular ese código aquí podría ayudar a encontrar un equivalente en C. –

+0

Sure. Aquí hay un ejemplo en V sobre desbordamiento de pila: http://stackoverflow.com/questions/895265/live-view-with-canon-edsdk-2-5-2-vb-net Es una cosa grande y retorcida que utiliza un elemento GUI específico de VB para visualizar en. Estoy tratando de BLT en un viejo HDC simple. Este C# ... uno http://tech.groups.yahoo.com/group/CanonSDK/message/1155 ... es la forma más simple, pero utiliza un "CImage" en un punto crítico en el código. – FredP

+0

Gurgh, qué desastre. Si tuviera una cámara compatible, podría darle un golpe. Buena suerte, pero es posible que deba beber el Microsoft Kool-Aid. –

Respuesta

4

Hay dos funciones que no le dicen acerca de:
1) EdsGetPointer
2) EdsGetLength

Esto le dará un puntero al comienzo de la Transmisión JPEG y el tamaño respectivamente.

Una vez que tenga este uso LibJPEG Turbo para descomprimir, Libjpeg simplemente no es lo suficientemente rápido.

Una vez que descomprime, puede mostrar la imagen usando opencv.

bool CanonCamera::downloadLiveViewImage() 
{ 
    EdsError err = EDS_ERR_OK; 
    EdsEvfImageRef image = NULL; 
    EdsStreamRef stream = NULL; 
    unsigned char* data = NULL; 
    unsigned long size = 0; 

    err = EdsCreateMemoryStream(0, &stream); 

    if (err != EDS_ERR_OK) { 
     cout << "Download Live View Image Error in Function EdsCreateMemoryStream: " << err << "\n"; 
     return false; 
    } 

    err = EdsCreateEvfImageRef(stream, &image); 

    if (err != EDS_ERR_OK) { 
     cout << "Download Live View Image Error in Function EdsCreateEvfImageRef: " << err << "\n"; 
     return false; 

    } 

    err = EdsDownloadEvfImage(cameraRef, image); 

    if (err != EDS_ERR_OK) { 
     cout << "Download Live View Image Error in Function EdsDownloadEvfImage: " << err << "\n"; 
     return false; 
    } 

    err = EdsGetPointer(stream, (EdsVoid**)& data); 

    if (err != EDS_ERR_OK) { 
     cout << "Download Live View Image Error in Function EdsGetPointer: " << err << "\n"; 
     return false; 
    } 

    err = EdsGetLength(stream, &size); 

    if (err != EDS_ERR_OK) { 
     cout << "Download Live View Image Error in Function EdsGetLength: " << err << "\n"; 
     return false; 
    } 

    // libjpegTurbo(data, size); 
    // display RGB image in opencv 

    if (stream != NULL) { 
     EdsRelease(stream); 
     stream = NULL; 
    } 

    if (image != NULL) {    
     EdsRelease(image); 
     image = NULL; 
    } 

    data = NULL; 
    return true; 
} 
Cuestiones relacionadas