Live View con Canon EDSDK 2.5.2 VB.NET
Pregunta
Estoy tratando de hacer 1 de dos cosas, la preferencia número 1:
A su vez en la vista en vivo usando VB.NET y la Canon EDSDK 2.5.2 y producir la salida en vivo en una aplicación Windows Forms. Actualmente estoy tratando de ponerlo a un cuadro de imagen; Sin embargo, estoy abierto a sugerencias seguro.
La segunda opción sería, al menos, a su vez, en la vista en vivo y reproducirla a través de la salida de video de la cámara a un monitor.
Realmente quiero lograr el primer embargo! A continuación es mi base de código actual, ayuda!
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
No hay solución correcta
Otros consejos
Yo era el que originalmente publicada esta pregunta. Veo que hay otros aquí que todavía están buscando la respuesta. He publicado la solución que finalmente se nos ocurrió Más en mi blog en http://www.overridepro.com/2009/06/28/canon-sdk-live-view/ .
Aquí hay un archivo .vb en el que defino la cámara de clase que le permiten hacer las cosas de nivel superior como
Dim camera as New Camera
camera.EstablishSession()
camera.TakePicture("C:\path\to\save.jpg")
camera.StartLiveView(me.LiveViewPictureBox)
camera.StopLiveView()
camera.FlushTransferQueue()
Creo que puede que le resulte útil:
<snip>
A través de los años he recibido varios correos electrónicos de cambios de este bloque de código, que está en GitHub como código abierto:
http://github.com/superjoe30/Camlift-Controller
La clase La cámara está en slnCamliftController / src / Camera.vb
Algunos de este código es vergonzosamente terrible. Por ejemplo, con el fin de conseguir que funcione para la cámara 5D y 7D, tengo que crear un programa que inicializa el SDK y luego se estrella a propósito. ¡Terrible! ¡Lo sé! Esto se encuentra en Klugesaurus. Es como cuando intenta conectarse a la 5D o 7D, nada funciona. Hay un pozo de espigas allí. Así que empujamos un campesino (El Klugesaurus) sobre las espigas, matándolo (falla en silencio), por lo que podemos caminar a través cadáver del campesino a la seguridad.
Es feo y terrible, pero: Siempre funciona. Si no lo hace, no funciona. He pedido Canon múltiples veces si se liberarían código fuente para EOS Utility, que se conecta a la 5D y 7D perfectamente. Se han negado firmemente cada vez. Mi compañero de trabajo bromea que no quieren revelar que ellos, también, están utilizando un Klugesaurus. De todas formas, sólo quería darle una mano a mano a esa desagradable detalle.
También he creado un módulo de Python para interactuar con la cámara: http://github.com/superjoe30/pyedsdk
Hay ejemplos de código aquí y discusiones sobre diferentes formas de acomplishing ella.