2010-07-10 12 views
7

C'è qualcuno con un pezzo funzionante di codice C di esempio che implementa LiveView utilizzando Canon EDSDK? Il codice di esempio nella documentazione sembra ottimo fino a questo bit:Codice di esempio C per Canon EDSDK Liveview?

// 
// Display image 
// 

Sì, è tutto. Non mostrano come eseguire il BLT di un'immagine su una finestra utilizzando i dati recuperati dalla fotocamera. Dicono solo "Visualizza l'immagine". Grazie, Canon.

Ho cacciato Internet (incluso questo forum), ma non ho ancora trovato un esempio di codice C che mostri come farlo. Sto cercando di evitare MFC, VB, codice gestito o C#. Sicuramente è possibile farlo con la vaniglia C, giusto? Vanilla C++ va bene.

Grazie, FredP

+1

Avete esempi MFC, VB, codice gestito o C#? In tal caso, includere o collegare a tale codice qui potrebbe aiutare a capire un equivalente C. –

+0

Sicuro. Ecco un esempio di V su Stack Overflow: http://stackoverflow.com/questions/895265/live-view-with-canon-edsdk-2-5-2-vb-net È una cosa grande, netta, che utilizza un elemento GUI VB specifico per la visualizzazione. Sto provando a BLT in un semplice vecchio HDC. Questo C# uno ... http://tech.groups.yahoo.com/group/CanonSDK/message/1155 ... è il modo più semplice, ma utilizza un "CImage" in un punto critico nella codice. – FredP

+0

Gurgh, che casino. Se avessi una fotocamera compatibile, potrei prenderla in giro. Buona fortuna, ma potresti dover bere Microsoft Kool-Aid. –

risposta

4

Ci sono due funzioni che non ti raccontano:
1) EdsGetPointer
2) EdsGetLength

questo vi darà un puntatore all'inizio della Streaming JPEG e le dimensioni rispettivamente.

Una volta utilizzato questo LibJPEG Turbo per decomprimere, Libjpeg non è abbastanza veloce.

Una volta decompressi, è possibile visualizzare l'immagine utilizzando 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; 
} 
Problemi correlati