2010-07-10 6 views
7

Y at-il quelqu'un avec un morceau de code C qui implémente LiveView en utilisant le Canon EDSDK? L'exemple de code dans la documentation est très bien jusqu'à ce que vous obteniez ce bit:Exemple de code C pour Canon EDSDK Liveview?

// 
// Display image 
// 

Yup, c'est tout. Ils ne montrent pas comment BLT une image à une fenêtre en utilisant les données extraites de la caméra. Ils disent simplement "Afficher l'image". Merci, Canon.

J'ai cherché l'Internet (y compris ce forum), mais je n'ai pas encore trouvé un exemple de code C qui montre comment faire cela. Je cherche à éviter MFC, VB, code managé, ou C#. Assurément, il est possible de le faire dans la vanille C, non? Vanilla C++ est bien aussi.

Merci, FredP

+1

Avez-vous des exemples MFC, VB, de code managé ou C#? Si oui, inclure ou lier à ce code ici pourrait aider à trouver un équivalent C. –

+0

Bien sûr. Voici un exemple de V sur Stack Overflow: http://stackoverflow.com/questions/895265/live-view-with-canon-edsdk-2-5-2-vb-net C'est une grosse chose que utilise un élément GUI spécifique à VB pour afficher. J'essaie de BLT dans un vieux HDC plaine. Ce C# un ... http://tech.groups.yahoo.com/group/CanonSDK/message/1155 ... est plus simple, mais utilise un "CImage" à un point critique dans la code. – FredP

+0

Gurgh, quel gâchis. Si j'avais un appareil photo compatible, je pourrais en prendre un coup. Bonne chance, mais vous devrez peut-être boire le Microsoft Kool-Aid. –

Répondre

4

Il y a deux fonctions qu'ils ne vous disent pas sur:
1) EdsGetPointer
2) EdsGetLength

Cela vous donnera un pointeur au début de la Flux JPEG et la taille respectivement.

Une fois que vous avez utilisé LibJPEG Turbo pour décompresser, Libjpeg n'est tout simplement pas assez rapide.

Une fois décompressé, vous pouvez afficher l'image en utilisant 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; 
}