2

Canon EOS 600D で写真を撮るための簡単なコンソール プログラムを作成しました。今のところ問題なく動作していますが、

  • 写真が撮られたときにイベントを取得する
  • それがイベントの原因となった新しい画像であった場合、ファイルオブジェクトとして取得して、ファイル名などのプロパティにアクセスしたいと思います

イベント ハンドラーは初期化されますが、写真を撮ったときにイベント/コールバックを受け取りません。

Windows 64ビットで作業している場合に問題になる可能性があることを他のスレッドで読みましたが、現在、ほぼすべてのシステムが64ビットです。それは本当に問題ですか?

これが私がこれまでに持っているコードです:

#include "stdafx.h"
#include <EDSDK.h>
#include <EDSDKErrors.h>
#include <EDSDKTypes.h>
#include <string>
#include <iostream> 

using namespace std; 

EdsError getFirstCamera(EdsCameraRef *camera);
EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object,     EdsVoid * context);

string nmea = "$GPRMC,122030.232,A,4317.2345,N,14025.3423,W,12.2,245.1,230711,002.5,E*6F";

int _tmain(int argc, _TCHAR* argv[])
{   
EdsError err=EDS_ERR_OK;
EdsCameraRef camera=NULL;
bool isSDKloaded=false;

// Initialize SDK
err=EdsInitializeSDK();
if(err==EDS_ERR_OK)
{
    isSDKloaded=true;
}

// Get first camera
if(err==EDS_ERR_OK)
{
    err=getFirstCamera(&camera);
}

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

    if(err==EDS_ERR_OK)
    {
        cout << "session started successfully" << endl;
    }
    else
    {
        cout << "session failed" << endl;
    }
}

EdsInt32 saveTarget = kEdsSaveTo_Camera;

// Set camera properties
if(err==EDS_ERR_OK)
{
    err = EdsSetPropertyData( camera, kEdsPropID_SaveTo, 0, 4, &saveTarget );

    if(err==EDS_ERR_OK)
    {
        cout << "camera properties set!" << endl;
    }
    else
    {
        cout << "not able to set camera properties" << endl;
    }
}

// Set object event handler
if(err==EDS_ERR_OK)
{
    err = EdsSetObjectEventHandler(camera, kEdsObjectEvent_All, 
                                                        handleObjectEvent, 
                                                        NULL);
    if(err==EDS_ERR_OK)
    {
        cout << "Event handler initialized!" << endl;
    }
    else
    {
        cout << "Not able to initialize event handler" << endl;
    }
}

// Take picture
if(err==EDS_ERR_OK)
{

    err = EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
    if(err==EDS_ERR_OK)
    {
        cout << "Picture successfully taken!" << endl;
    }
    else
    {
        cout << "not able to set camera properties" << endl;
    }
}

// End session and release SDK
EdsCloseSession(camera);
EdsTerminateSDK();

if(nmea != "")
{
    cout << nmea <<endl;
}
else
{
    cout << "das kann eigentlich nicht sein!" << endl;
}

system("Pause");

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;
}

EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid * context)
{
EdsDirectoryItemInfo objectInfo;
EdsError err=EDS_ERR_OK;
cout << "Event ausgelöst!" << endl;

switch(event)
{
    case kEdsObjectEvent_DirItemCreated:
        err = EdsGetDirectoryItemInfo(object, &objectInfo);

        if(objectInfo.isFolder == 1)
        {
            cout << "Der Ordner " << objectInfo.szFileName << " wurde erzeugt" << endl;
        }

        if(objectInfo.isFolder == 0)
        {
            cout << "Die Datei " << objectInfo.szFileName << " wurde erzeugt" << endl;
        }

        break;
    default:
        cout << "Prüfe den EventHandler!" << endl;
        break;
}

//Release object
if(object)
{
    EdsRelease(object);
}

return err;
}

助けてくれてありがとう!

敬具、リチャード

4

3 に答える 3

2

Seth の回答で述べたように、Canon SDK が機能するには Windows メッセージ ループが必要です。Windows メッセージを処理していない場合、コールバックは呼び出されません。

コードに基づいて、おそらく次の擬似コードのようなことをしたいと思うでしょう:

bool bPhotoTaken = false;
main()
{
 // Initialize EDSDK, start session with camera, change SaveTo property
 // register ObjectEventHandler
 // send kEdsCameraCommand_TakePicture

   while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
   {
     if(bRet == -1 || bPhotoTaken)
     {
         break;
     }
     else
     {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
   }

  // Cleanup EDSDK
}

ObjectEventHandler コールバックは、DirItemRequestTransfer を受信すると、画像をダウンロードしてから を設定bPhotoTaken=true;します。これにより、メッセージ ループが中断され、アプリケーションが終了します。

于 2014-02-18T22:04:09.000 に答える
0

まず、EDSDK は 64 ビット モードでは実際には機能しないため、32 ビットを使用してください。64 ビットはせいぜい実験的なものです。

次に、EDDSK は従来の COM STA スレッド モデルを使用するため、メイン スレッドで Windows メッセージ ループを実行する必要があります。メッセージ ループがない場合、コールバックは取得されません。

于 2013-09-04T22:30:27.623 に答える