Просмотр в реальном времени с помощью Canon EDSDK 2.5.2 VB.NET
Вопрос
Я пытаюсь сделать одну из двух вещей, предпочтение номер 1:
Включите просмотр в реальном времени с помощью VB.NET и Canon EDSDK 2.5.2 и визуализируйте вывод в реальном времени в приложении Windows Forms.Сейчас я пытаюсь поместить это в коробку с картинками;однако я точно открыт для предложений.
Второй вариант — как минимум включить Live View и транслировать его через видеовыход камеры на монитор.
Но мне очень хочется сделать первое!Ниже приведена моя текущая кодовая база, помогите!
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
Нет правильного решения
Другие советы
Я был тем, кто изначально задал этот вопрос.Я вижу, что здесь есть и другие, кто все еще ищет ответ.Я опубликовал решение, к которому мы наконец пришли, в своем блоге по адресу: http://www.overridepro.com/2009/06/28/canon-sdk-live-view/ .
Вот файл .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, а затем специально вылетает.Ужасный!Я знаю!Это встречается у Клюгезавра.Это как при попытке подключиться к 5Д или 7Д ничего не получается.Там есть яма с шипами.Итак, мы пихаем крестьянина (Клюгезавра) на шипы, убивая его (он терпит неудачу бесшумно), чтобы мы могли пройти через труп крестьянина в безопасное место.
Это некрасиво и ужасно, но:Это работает каждый раз.Если вы этого не сделаете, это не сработает.Я несколько раз спрашивал Canon, выпустят ли они исходный код для EOS Utility, которая идеально подключается к 5D и 7D.Каждый раз они категорически отказывались.Мой коллега шутит, что они не хотят раскрывать, что тоже используют Клюгезавра.В любом случае, я просто хотел предупредить вас об этой неприятной детали.
Я также создал модуль Python для взаимодействия с камерой:http://github.com/superjoe30/pyedsdk
Есть примеры кода здесь и дискуссии о различных путях его достижения.