c++ - 佳能SDK。从相机拍照

标签 c++ edsdk canon-sdk

我有佳能 EOS D600 相机。需要用C++拍照。文档对我没有帮助。你有拍照的示例代码吗?这没有帮助:

#include <windows.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <EDSDK.h>
#include <EDSDKTypes.h>
#include <EDSDKErrors.h>

using namespace std;

EdsError getFirstCamera(EdsCameraRef *camera);
int main(){
    EdsError err=EDS_ERR_OK;
    EdsCameraRef camera=NULL;
    bool isSDKloaded=false;
    err=EdsInitializeSDK();
    if(err==EDS_ERR_OK) isSDKloaded=true;
    if(err==EDS_ERR_OK) err=getFirstCamera(&camera);
    EdsOpenSession(camera);
    EdsInt32 saveTarget = kEdsSaveTo_Host;
    err = EdsSetPropertyData( camera, kEdsPropID_SaveTo, 0, 4, &saveTarget );

    EdsCapacity newCapacity = {0x7FFFFFFF, 0x1000, 1};
    err = EdsSetCapacity(camera, newCapacity);


    const char* ch_dest = "C:\\photo\\Img.jpg";
    EdsCreateFileStream( ch_dest ,kEdsFileCreateDisposition_CreateAlways,kEdsAccess_ReadWrite,0);

    EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
    EdsCloseSession(camera);
    EdsTerminateSDK();
    return 0;
}

EdsError getFirstCamera(EdsCameraRef *camera)
{
EdsError err=EDS_ERR_OK;
EdsCameraListRef cameraList=NULL;
EdsUInt32 count=0;
// Get camera list
err = EdsGetCameraList(&cameraList);
// Get number of cameras
if(err == EDS_ERR_OK)
{
    err = EdsGetChildCount(cameraList, &count);
    if(count == 0)
    {
        err = EDS_ERR_DEVICE_NOT_FOUND;
    }
}
// Get first camera retrieved
if(err == EDS_ERR_OK)
{
    err = EdsGetChildAtIndex(cameraList , 0 , camera);
}
// Release camera list
if(cameraList != NULL)
{EdsRelease(cameraList);
cameraList = NULL;
}
return err;
}

#include <windows.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <EDSDK.h>
#include <EDSDKTypes.h>
#include <EDSDKErrors.h>

using namespace std;

EdsError getFirstCamera(EdsCameraRef *camera);
int main(){
    EdsError err=EDS_ERR_OK;
    EdsCameraRef camera=NULL;
    bool isSDKloaded=false;
    err=EdsInitializeSDK();
    if(err==EDS_ERR_OK) isSDKloaded=true;
    if(err==EDS_ERR_OK) err=getFirstCamera(&camera);
    EdsOpenSession(camera);
    EdsInt32 saveTarget = kEdsSaveTo_Host;
    err = EdsSetPropertyData( camera, kEdsPropID_SaveTo, 0, 4, &saveTarget );

    EdsCapacity newCapacity = {0x7FFFFFFF, 0x1000, 1};
    err = EdsSetCapacity(camera, newCapacity);


    const char* ch_dest = "C:\\photo\\Img.jpg";
    EdsCreateFileStream( ch_dest ,kEdsFileCreateDisposition_CreateAlways,kEdsAccess_ReadWrite,0);

    EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
    EdsCloseSession(camera);
    EdsTerminateSDK();
    return 0;
}

EdsError getFirstCamera(EdsCameraRef *camera)
{
EdsError err=EDS_ERR_OK;
EdsCameraListRef cameraList=NULL;
EdsUInt32 count=0;
// Get camera list
err = EdsGetCameraList(&cameraList);
// Get number of cameras
if(err == EDS_ERR_OK)
{
    err = EdsGetChildCount(cameraList, &count);
    if(count == 0)
    {
        err = EDS_ERR_DEVICE_NOT_FOUND;
    }
}
// Get first camera retrieved
if(err == EDS_ERR_OK)
{
    err = EdsGetChildAtIndex(cameraList , 0 , camera);
}
// Release camera list
if(cameraList != NULL)
{EdsRelease(cameraList);
cameraList = NULL;
}
return err;
}

有错误: [链接器错误] 未定义对 `imp_EdsInitializeSDK@0' 的引用

请帮忙

最佳答案

您好,这段代码有效。

#include <iostream>
#include "EDSDK.h"
#include "EDSDKErrors.h"
#include "EDSDKTypes.h"
#include <thread>
#include <chrono>

char * directory = "Here is your directory";

void download_img(EdsBaseRef & object, EdsVoid * & context)
{
    EdsStreamRef stream = NULL;
    EdsDirectoryItemInfo dirItemInfo;
    EdsGetDirectoryItemInfo(object, &dirItemInfo);
    strcat(directory, file_name);
    EdsCreateFileStream(directory, kEdsFileCreateDisposition_CreateAlways, kEdsAccess_ReadWrite, &stream);
    EdsDownload(object, dirItemInfo.size, stream);
    EdsDownloadComplete(object);
    EdsRelease(stream);
    stream = NULL;
    if (object)
        EdsRelease(object);
}

EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid * context)
{
    download_img(object, context);
    return EDS_ERR_OK;
}

void init_camera(EdsCameraRef & camera)
{
    EdsError err = EDS_ERR_OK;
    EdsCameraListRef cameraList = NULL;
    EdsUInt32 count = 0;
    camera = NULL;

    err = EdsInitializeSDK();
    err = EdsGetCameraList(&cameraList);
    err = EdsGetChildCount(cameraList, &count);
    if (count > 0)
    {
        err = EdsGetChildAtIndex(cameraList, 0, &camera);
        EdsRelease(cameraList);
    }
    EdsSetObjectEventHandler(camera, kEdsObjectEvent_DirItemCreated, handleObjectEvent, NULL);
    EdsSendStatusCommand(camera, kEdsCameraStatusCommand_UIUnLock, 0);
}

void start_liveview(EdsCameraRef camera)
{
    EdsOpenSession(camera);
    EdsUInt32 device = kEdsPropID_Evf_OutputDevice;
    EdsGetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0, sizeof(device), &device);

    device |= kEdsEvfOutputDevice_PC;
    EdsSetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0, sizeof(device), &device);
}

void stop_liveview(EdsCameraRef camera)
{
    EdsUInt32 device;
    EdsGetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0, sizeof(device), &device);
    device &= ~kEdsEvfOutputDevice_PC;
    EdsSetPropertyData(camera, kEdsPropID_Evf_OutputDevice, 0,  sizeof(device), &device);
    EdsCloseSession(camera);
}

void take_video(EdsCameraRef camera, int length)
{
    EdsOpenSession(camera);
    EdsUInt32 record_start = 4; // Begin movie shooting 
    EdsSetPropertyData(camera, kEdsPropID_Record, 0, sizeof(record_start), &record_start);
    this_thread::sleep_for(chrono::milliseconds(length));
    EdsUInt32 record_stop = 0; // End movie shooting 
    EdsSetPropertyData(camera, kEdsPropID_Record, 0, sizeof(record_stop), &record_stop);
    EdsCloseSession(camera);
}

void update_data(EdsCameraRef camera)
{
    EdsOpenSession(camera);
    // here event happens
    EdsCloseSession(camera);
}

void take_photo(EdsCameraRef camera, int count, int interv_millsec)
{
    for (int i = 0; i < count; ++i) {
        EdsOpenSession(camera);
        cout << "shoot" << endl;
        EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
        this_thread::sleep_for(chrono::milliseconds(interv_millsec));
        EdsCloseSession(camera);
    }
    update_data(camera);
}

void dispose(EdsCameraRef camera)
{
    EdsCloseSession(camera);
    EdsTerminateSDK();
}

int main (){
    EdsCameraRef camera;
    init_camera(camera);

    // here you may call functions above

    // to take video
    // firstly you have to start liveview
    // secondly call "take video"
    // thirdly stop liveview
    return 0;
}

关于c++ - 佳能SDK。从相机拍照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18267636/

相关文章:

c++ - std::lower_bound 的奇怪错误

c++ - 使用模板别名(类型别名,使用)弃用模板化类名?

android - 使用Android NDK实现EDSDK

objective-c - 如何在 x86_64 Swift 项目中使用 i386 框架

camera - 通过网络使用(或不使用)EDSDK 连接佳能相机

c# - 在 C# 中使用 Canon SDK 时出现 SDK 错误 : 0x8D07,

c++ - sizeof 和类型,保证

c++ - 在 C++ 中为包含数组的对象编写自定义 std::set 比较器

windows-runtime - 打开佳能相机 session 时出现错误 EDS_ERR_DEVICE _NOT_FOUND (Eds OpenSession(cRef))

c++ - EDSDK 消息循环在 Windows 8.1 下不工作