2009-05-21 8 views
4

2.5.2 Je suis en train de faire 1 de deux choses, le nombre de préférence 1:Live View avec Canon EDSDK VB.NET

Allumez le Live View en utilisant VB.NET et le Canon EDSDK et rendre 2.5.2 la sortie en direct dans une application Windows Forms. Actuellement j'essaye de le mettre à une boîte d'image; Cependant, je suis ouvert à des suggestions à coup sûr.

La deuxième option consisterait à activer au moins la vue en direct et à la diffuser via la sortie vidéo de la caméra vers un moniteur. Je veux vraiment accomplir la première cependant! Voici mon code actuel, aidez-moi!

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 
+1

Pouvez-vous décrire plus en détail ce qui ne fonctionne pas, comment cela ne fonctionne pas (messages d'erreur détaillés, sur quelle ligne il échoue et autres)? –

+0

Il échoue sur cette ligne: err = EdsCreateImageRef (flux, outMemoryRef) avec ERR_FILE_FORMAT_NOT_RECOGNIZED Toute aide est grandement appréciée ... –

Répondre

0

Il y a des exemples de code here et des discussions sur les différentes façons de acomplishing il.

+0

Aucun des exemples de code semble fonctionner. Si quelqu'un d'autre a des commentaires ... –

2

Voici un fichier .vb dans lequel je définis la caméra de classe qui vous permet de faire les choses de haut niveau comme

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

Je pense que vous pouvez le trouver utile:

<snip> 

Au fil des années, je avons reçu plusieurs e-mails pour les mises à jour à ce bloc de code, qui est sur GitHub en open source:

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

La classe Camera est dans slnCamliftController/src/Camera.vb

Une partie de ce code est terriblement terrible. Par exemple, afin de le faire fonctionner pour la caméra 5D et 7D, je dois créer un programme qui initialise le SDK, puis se bloque à dessein. Terrible! Je connais! Ceci est trouvé dans Klugesaurus. C'est comme quand vous essayez de vous connecter au 5D ou au 7D, rien ne fonctionne. Il y a une fosse de pointes là. Nous avons donc poussé un paysan (le Klugesaurus) sur les pointes, le tuant (il échoue silencieusement), afin que nous puissions marcher à travers le cadavre du paysan vers la sécurité.

C'est moche et terrible, mais: Ça marche à chaque fois. Si vous ne le faites pas, cela ne fonctionne pas. J'ai demandé plusieurs fois à Canon si le code source de EOS Utility serait libéré, ce qui me permet de me connecter parfaitement au 5D et au 7D. Ils ont fermement refusé à chaque fois. Mon collègue plaisante sur le fait qu'ils ne veulent pas révéler qu'ils utilisent aussi un Klugesaurus. De toute façon, je voulais juste vous donner une tête à ce détail méchant.

J'ai aussi créé un module Python pour l'interface avec l'appareil photo: http://github.com/superjoe30/pyedsdk

+0

J'ai depuis fait de gros changements dans cette classe. Si vous voulez une API de caméra mise à jour et utile, contactez-moi. Je devrais m'assurer que j'ai le droit de le distribuer et d'autres choses. Sinon, utilisez simplement le découpage comme exemple de code de travail. – andrewrk

+0

J'ai aussi du mal à essayer la vue en direct. Cela vous dérangerait-il posté quelque part @ superjoe30? – swdev

+0

J'ai mis à jour la réponse avec le lien. – andrewrk