gpt4 book ai didi

c# 佳能 SDK : No callback after CameraCommand_TakePicture

转载 作者:太空狗 更新时间:2023-10-29 18:32:11 71 4
gpt4 key购买 nike

我已经尝试让这项工作有一段时间了...阅读了很多帖子,但没有一个可以解决这个问题。

我正在使用 Canon SDK 连接到 EOS 550D。我正在运行 win7 64 位和 Visual Studio c# 2010。

我一步一步做的是:

--> 0 初始化SDK

 err = EDSDK.EdsInitializeSDK();

--> 1 获取摄像头列表

 err = EDSDK.EdsGetCameraList(out cameraList);

--> 2 获取 child 数量

 err = EDSDK.EdsGetChildCount(cameraList, out cameraCount);

--> 3 如果有 child ,取第一个 child

  err = EDSDK.EdsGetChildAtIndex(cameraList, 0, out cameraDev);

--> 4 打开 session

err = EDSDK.EdsOpenSession(cameraDev);

--> 5 告诉sdk将图片保存到本地

IntPtr saveTo = (IntPtr)EDSDK.EdsSaveTo.Host;
err = EDSDK.EdsSetPropertyData(cameraDev, EDSDK.PropID_SaveTo, 0, 4, saveTo);

--> 6 设置宿主机可用容量

 EDSDK.EdsCapacity capacity = new EDSDK.EdsCapacity();

if (err == EDSDK.EDS_ERR_OK)
{
capacity.NumberOfFreeClusters = 0x7FFFFFFF;
capacity.BytesPerSector = 0x1000;
capacity.Reset = 1;
err = EDSDK.EdsSetCapacity(cameraDev, capacity);
}

--> 7 注册状态事件处理器

err = EDSDK.EdsSetCameraStateEventHandler(cameraDev, EDSDK.StateEvent_All, stateEventHandler,   new IntPtr(0));

--> 8 注册对象事件处理器

 EDSDK.EdsObjectEventHandler edsObjectEventHandler = new EDSDK.EdsObjectEventHandler(objectEventHandler);
err = EDSDK.EdsSetObjectEventHandler(cameraDev, EDSDK.ObjectEvent_All, edsObjectEventHandler, IntPtr.Zero);

....

执行此操作时我没有收到任何错误,一切似乎都很好。

这是我的处理程序

 private uint objectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext)
{
Console.WriteLine("HALLLOOOOOOOOOO");
switch (inEvent)
{
case EDSDK.ObjectEvent_DirItemCreated:
//this.invokeNewItemCreatedEvent(new NewItemCreatedEventArgs(getCapturedItem(inRef)));
Console.WriteLine("Directory Item Created");
break;
case EDSDK.ObjectEvent_DirItemRequestTransfer:
Console.WriteLine("Directory Item Requested Transfer");
break;
default:
Console.WriteLine(String.Format("ObjectEventHandler: event {0}, ref {1}", inEvent.ToString("X"), inRef.ToString()));
break;
}

return 0x0;
}








public uint stateEventHandler(uint inEvent, uint inParameter, IntPtr inContext)
{
Console.WriteLine("stateEventHandler " + inEvent);
switch (inEvent)
{
case EDSDK.StateEvent_JobStatusChanged:
Console.WriteLine(String.Format("There are objects waiting to be transferred. Job status {0}", inParameter));
break;

case EDSDK.StateEvent_ShutDownTimerUpdate:
if (inParameter != 0)
Console.WriteLine(String.Format("shutdown timer update: {0}", inParameter));
break;

case EDSDK.ObjectEvent_DirItemRequestTransfer:
//WHAT I NEED!!!
Console.WriteLine("Hallo DirItemRequestTransfer");
//DownloadImage(obj);
break;


default:
Console.WriteLine(String.Format("StateEventHandler: event {0}, parameter {1}", inEvent, inParameter));
break;
}
return 0;
}

...

所以现在我的问题是没有调用任何处理程序。不知道为什么,我在 net fpr 上搜索了很长时间,尝试了不同的方法但没有得到回调...

这是我调用拍照命令的方法:

 public void takePic()
{
if (cameraOpened)
{
Console.WriteLine( "taking a shot");

err = EDSDK.EdsSendCommand(cameraDev, EDSDK.CameraCommand_TakePicture, 0);
if (err != EDSDK.EDS_ERR_OK)
Console.WriteLine("TakeCommand Error: " + err.ToString());

Console.WriteLine("Finished taking a shot");

}
}

也许有人知道我可以尝试使这项工作成功?

提前致谢!

最好的问候,托拜厄斯

最佳答案

我知道 SDK 文档说回调函数将在另一个线程中执行,但对我来说,在 Windows 下使用 SDK 2.11,回调总是发生在主线程上,并且似乎是通过 Windows 消息发送的。这意味着如果您没有消息泵,您将无法获得回调。如果您的应用程序是 C# GUI 应用程序,您应该有一个消息泵,但如果它是一个控制台应用程序,您可能没有,因此请尝试在发送 TakePicture 命令后手动泵送消息。您可以使用 Application.Run 但您需要在某处调用 Application.Exit 否则您的消息循环将永远不会退出(例如,您可以在从相机下载图片后调用它)。

关于c# 佳能 SDK : No callback after CameraCommand_TakePicture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669312/

71 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com