Пример кода C для Canon EDSDK Liveview? - PullRequest
7 голосов
/ 10 июля 2010

Есть ли кто-нибудь с рабочим фрагментом примера кода C, который реализует LiveView с использованием Canon EDSDK?Пример кода в документации выглядит великолепно, пока не дойдете до этого бита:

// 
// Display image 
// 

Да, вот и все.Они не показывают, как BLT изображение в окно, используя данные, полученные с камеры.Они просто говорят: «Показать изображение».Спасибо, Canon.

Я охотился в Интернете (включая этот форум), но мне еще предстоит найти пример кода на C, который показывает, как это сделать.Я стараюсь избегать MFC, VB, управляемого кода или C #.Конечно, это возможно сделать в vanilla C, верно?Vanilla C ++ тоже подойдет.

Спасибо, FredP

1 Ответ

4 голосов
/ 22 марта 2011

Есть две функции, о которых они вам не говорят:
1) EdsGetPointer
2) EdsGetLength

Это даст вам указатель на начало JPEGstream и size соответственно.

Если у вас есть это, используйте LibJPEG Turbo для распаковки, Libjpeg просто недостаточно быстро.

После распаковки вы можете показать изображение с помощью 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;
}
...