佳能EDSDK实时预览的示例C代码?

7

有没有人有一个使用Canon EDSDK实现LiveView的工作示例C代码?文档中的示例代码看起来很好,直到你到达这个部分:

// 
// Display image 
// 

是的,就是这样。他们没有展示如何使用从相机检索到的数据将图像 BLT 到窗口中。他们只是说“显示图像”。谢谢你,佳能。
我已经在互联网上搜寻了很久(包括这个论坛),但我还没有找到一个C代码示例来展示如何做到这一点。我希望避免使用MFC、VB、托管代码或C#。肯定可以用纯C来实现这个功能,对吧?纯C++也可以。
谢谢, FredP

1
你有MFC、VB、托管代码或C#的示例吗?如果有,在这里包含或链接该代码可能有助于找到C语言的等效代码。 - Brock Adams
当然。这是Stack Overflow上的一个V示例:https://dev59.com/8UfRa4cB1Zd3GeqP_K-G它是一个使用VB特定GUI元素进行显示的复杂的东西。我正在尝试将其BLT到普通的HDC中。这个C#示例...http://tech.groups.yahoo.com/group/CanonSDK/message/1155...要简单得多,但在代码的关键点上使用了“CImage”。 - FredP
呃呃,一团糟。如果我有兼容的相机,我可能会试一试。祝你好运,但你可能不得不喝微软的果汁。 - Brock Adams
布洛克,哇哦!我猜我只能继续不停地攻克它了... - FredP
嗨,FredP,你能编写C代码获取liveView吗?如果可以,能给我一些提示吗? 我刚开始学习C编程,想在学习的同时控制我的DR Xsi。谢谢。 - user643019
1个回答

4

有两个函数是他们不告诉你的:
1)EdsGetPointer
2)EdsGetLength

这将分别给您指向JPEG流开始的指针和大小。

一旦您获得了这个,使用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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接