使用 Canon EDSDK 2.5.2 VB.NET 进行实时查看

Posted

技术标签:

【中文标题】使用 Canon EDSDK 2.5.2 VB.NET 进行实时查看【英文标题】:Live View with Canon EDSDK 2.5.2 VB.NET 【发布时间】:2009-05-21 21:28:20 【问题描述】:

我正在尝试做两件事中的一件,偏好编号 1:

使用 VB.NET 和 Canon EDSDK 2.5.2 打开实时视图,并在 Windows 窗体应用程序中呈现实时输出。目前我正在尝试将其放入图片框中;不过,我肯定愿意接受建议。

第二个选项是至少打开实时视图并通过摄像机上的视频输出将其流式传输到监视器。

我真的很想完成第一个!下面是我目前的代码库,求助!

Private Sub btnStartLiveView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartLiveView.Click

    Dim err As Integer = EDS_ERR_OK


    Dim prop As Integer = EdsEvfOutputDevice.kEdsEvfOutputDevice_PC
    Dim proptype As Integer = EDSDKTypes.kEdsPropID_Evf_OutputDevice
    '// Stock the property.'
    Dim wkIntPtr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(prop))
    Marshal.StructureToPtr(prop, wkIntPtr, False)
    'send property/command to the camera'
    EdsSetPropertyData(model.getCameraObject(), proptype, 0, Marshal.SizeOf(prop), prop)

    Dim stream As IntPtr
    Dim outMemoryRef As IntPtr
    Dim evfImage As IntPtr

    err = EdsCreateMemoryStream(0, stream)

    If err = EDS_ERR_OK Then

        err = EdsCreateImageRef(stream, outMemoryRef) '(stream, evfImage)'

    Else

        Dim str As String = Hex(err)

        MessageBox.Show(str)

    End If

    If err = EDS_ERR_OK Then
        err = EdsDownloadEvfImage(model.getCameraObject(), evfImage)
    Else

        Dim str As String = Hex(err)

        MessageBox.Show("&H" & str & "L") ' Shows &H2CL which = ERR_FILE_FORMAT_NOT_RECOGNIZED'
    End If

    ' Get the Incidental Data of the Image'

    If err = EDS_ERR_OK Then

        Dim zoom As UInt32
        Dim point As IntPtr


        EdsGetPropertyData(outMemoryRef, kEdsPropID_Evf_ZoomPosition, 0, Marshal.SizeOf(zoom), zoom)

        EdsGetPropertyData(outMemoryRef, kEdsPropID_Evf_ZoomPosition, 0, Marshal.SizeOf(point), point)

    Else

        'MessageBox.Show(err.ToString())'

    End If


    Dim buffer(Marshal.SizeOf(stream)) As Byte

    Dim mStream As System.IO.Stream = New System.IO.MemoryStream(Marshal.SizeOf(stream))


    Dim gcTime As GCHandle = GCHandle.Alloc(0, GCHandleType.Pinned)
    Dim pTime As IntPtr = gcTime.AddrOfPinnedObject()
    Marshal.Copy(stream, buffer, 0, Marshal.SizeOf(stream))

    mStream.Write(buffer, 0, Marshal.SizeOf(stream))

    Me.PictureBox1.Image = Image.FromStream(mStream)

    EdsRelease(stream)
End Sub

【问题讨论】:

你能否更详细地描述什么是不工作的,它是如何不工作的(详细的错误消息,它在哪一行失败等等)? 这行失败:err = EdsCreateImageRef(stream, outMemoryRef) with ERR_FILE_FORMAT_NOT_RECOGNIZED 非常感谢任何帮助... 【参考方案1】:

我是最初发布此问题的人。我看到这里还有其他人仍在寻找答案。我已经在我的博客http://www.overridepro.com/2009/06/28/canon-sdk-live-view/ 上发布了我们最终提出的解决方案。

【讨论】:

【参考方案2】:

这是一个 .vb 文件,我在其中定义了 Camera 类,它可以让您执行***操作,例如

Dim camera as New Camera
camera.EstablishSession()
camera.TakePicture("C:\path\to\save.jpg")
camera.StartLiveView(me.LiveViewPictureBox)
camera.StopLiveView()
camera.FlushTransferQueue()

我认为您可能会发现它很有用:

<snip>

多年来,我收到了多封电子邮件,要求更新此代码块,该代码块在 GitHub 上作为开源代码:

http://github.com/superjoe30/Camlift-Controller

Camera类在slnCamliftController/src/Camera.vb中

其中一些代码非常糟糕。例如,为了让它适用于 5D 和 7D 相机,我必须创建一个程序来初始化 SDK,然后故意崩溃。糟糕的!我知道!这是在克鲁格龙中发现的。就像当您尝试连接到 5D 或 7D 时,没有任何效果。那里有一个尖刺坑。所以我们把一个农民(克鲁格龙)推到了尖刺上,杀死了他(它默默地失败了),这样我们就可以穿过农民的尸体到安全的地方。

它又丑又可怕,但是: 它每次都有效。 如果你不这样做,它就行不通。 我曾多次询问佳能是否会发布 EOS Utility 的源代码,它可以完美地连接到 5D 和 7D。他们每次都坚决拒绝。我的同事开玩笑说他们不想透露他们也在使用克鲁格龙。 无论如何,我只是想提醒您注意那个令人讨厌的细节。

我还创建了一个 Python 模块来与相机交互: http://github.com/superjoe30/pyedsdk

【讨论】:

我已经对这门课做了很大的修改。如果您需要更新且有用的相机 API,请联系我。我必须确保我有权分发它和其他东西。否则,只需将剪辑用作工作代码的示例。 我在尝试实时取景时也遇到了麻烦。你介意把它贴在@superjoe30 的某个地方吗?【参考方案3】:

有代码示例here 并讨论了不同的实现方式。

【讨论】:

以上是关于使用 Canon EDSDK 2.5.2 VB.NET 进行实时查看的主要内容,如果未能解决你的问题,请参考以下文章

使用edsdk 2.8拍照并直接将图像保存到PC

佳能 EDSDK 在我的电脑中保存图像

佳能 EDSDK Liveview 的示例 C 代码?

OSX EdsOpenSession exc_bad_access 上的佳能 EDSDK 2.11

来自佳能 EDSDK EdsInitializeSDK() API 的 EXC_BAD_ACCESS

canon打印机 g和st系列的区别?