Canon EDSDK How can I get width and height of live

2020-08-04 10:10发布

I written C++ code to display live view image on monitor. I referred to some code on stackoverflow. Finally, I complete my code, but there are some problem.

I want display live view image using opencv, but I don't know to get the width & height of live view image. (maybe it is retrieved by EDSDK function..)

please answer for me.

(I attached my code, I want suitable answer for my code)

(look at "//libjpegTurbo...//, there are manual _width & height. I want to retrieve using function)


// Functions_body
bool LiveViewStart() 
{
    EdsError err = EDS_ERR_OK;
    EdsCameraListRef cameraList = NULL;
    EdsCameraRef camera = NULL;
    EdsUInt32    count = 0; 
    bool         isSDKLoaded = false;

    // Initialize SDK
    err = EdsInitializeSDK(); 

    if(err == EDS_ERR_OK) 
    { 
        isSDKLoaded = true; 
    }

    // Acquisition of camera list
    if(err == EDS_ERR_OK)
    {
        err = EdsGetCameraList(&cameraList);
    }

    // Acquisition of number of Cameras
    if(err == EDS_ERR_OK)
    {
        err = EdsGetChildCount(cameraList, &count);
        if(count == 0)
        {
            err = EDS_ERR_DEVICE_NOT_FOUND;
        }
    }

    // Acquisition of camera at the head of the list
    if(err == EDS_ERR_OK)
    {   
        err = EdsGetChildAtIndex(cameraList , 0 , &camera); 
    }

    // Acquisition of camera information
    EdsDeviceInfo deviceInfo;
    if(err == EDS_ERR_OK)
    {   
        err = EdsGetDeviceInfo(camera , &deviceInfo);   
        if(err == EDS_ERR_OK && camera == NULL)
        {
            err = EDS_ERR_DEVICE_NOT_FOUND;
        }
    }

    // Release camera list
    if(cameraList != NULL)
    {
        EdsRelease(cameraList);
    }

    if(err != EDS_ERR_OK)
    {
        ::MessageBox(NULL,"Cannot detect camera",NULL,MB_OK);
        exit(1);
    }

    // Open session with camera 
    if(err == EDS_ERR_OK) 
    { 
        err = EdsOpenSession(camera); 
    } 

    // Start Live view  
    // Get the output device for the live view image
    EdsUInt32 device;
    err = EdsGetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0, sizeof(device), &device);

    // PC live view starts by setting the PC as the output device for the live view image. 
    if(err == EDS_ERR_OK) 
    { 
        device |= kEdsEvfOutputDevice_PC; 
        err = EdsSetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0 , sizeof(device), &device);
    } 

    Sleep(2000);

    // Download EvfData
    EdsEvfImageRef evfImage = NULL;
    EdsStreamRef stream = NULL;
    unsigned char* data = NULL;
    unsigned long size = 0;

    // Create memory stream
    err = EdsCreateMemoryStream(0, &stream);

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

    // Create EvfImageRef.
    err = EdsCreateEvfImageRef(stream, &evfImage);

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

    }

    // Download live view image data.
    err = EdsDownloadEvfImage(camera, evfImage);

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

    //Sleep(1000);

    // Get Pointer of evfStream
    err = EdsGetPointer(stream, (EdsVoid**)& data);

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

    // Get Length of evfStream
    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);
    int JPEG_QUALITY = 75;
    int COLOR_COMPONENTS = 3;
    int _width = 1920;
    int _height = 1080;
    long unsigned int _jpegSize = 0;
    unsigned char *_compressedImage = NULL;
    unsigned char *buffer = new unsigned char [_width * _height * COLOR_COMPONENTS];

    tjhandle _jpegCompressor = tjInitCompress();

    tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB, &_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY, TJFLAG_FASTDCT);

    tjDestroy(_jpegCompressor);

    // display RGB image in opencv

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

    // Release evfImage
    if (evfImage != NULL) {            
        EdsRelease(evfImage);
        evfImage = NULL;
    }

    data = NULL;

    // End Live view.
    // Get the output device for the live view image
    err = EdsGetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0, sizeof(device), &device);

    // PC live view ends if the PC is disconneccted from the live view output device.
    if(err == EDS_ERR_OK)
    {
        device &= ~kEdsEvfOutputDevice_PC;
        err = EdsSetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0, sizeof(device), &device);
    }

    // Close session with camera 
    if(err == EDS_ERR_OK) 
    {
        err = EdsCloseSession(camera); 
    } 

    // Release camera 
    if(camera != NULL) 
    { 
        EdsRelease(camera); 
    } 
    // Terminate SDK 
    if(isSDKLoaded) 
    { 
        EdsTerminateSDK(); 
    } 
    return true;
} 

2条回答
家丑人穷心不美
2楼-- · 2020-08-04 10:18

the canon SDK does not provide any functions to get the size of the live view image. The problem you are facing in your code is that you try to compress the image but you need to decompress it. I suggest you read up on the usage of libjpg turbo. They provide very well documented examples: http://www.libjpeg-turbo.org/Documentation/Documentation

On a sidenote: Is this your real code or just to show? Because the liveview image download has to be in a loop to be called repeatedly, otherwise you will only download a single image and close everything.

Kind regards

查看更多
Explosion°爆炸
3楼-- · 2020-08-04 10:33

If you have an evfImage you can use EdsGetPropertyData to request its kEdsPropID_Evf_CoordinateSystem (type EdsSize). This value contains the width and height of the liveview of last captured frame.

查看更多
登录 后发表回答