Seite 1 von 5
Nikon SDK für Kamerasteuerung
Verfasst: 20.02.2009 14:29
von chrizl
Hi,
ich habe eine Nikon Spiegelreflexkamera.
Diese Kamera kann man mit der SDK von Nikon ansteuern.
Zur Steuerung z. B. gehören solche Sachen wie "Foto schießen"(vom PC aus) oder auslesen und schreiben von Einstellungen vom PC aus.
Naja, nun sitze ich hier und habe von meinem Vater den Tipp bekommen, einfach mal mit der COMate zu arbeiten. Leider ist mein Verständnis mit dem Ansprechen der DLL von Nikon sogut wie gleich NULL.
Vlt. kann mir hier ja jemand helfen, wie ich das Ding benutze.
Falls jemand die SDK laden möchte,
Nikon SDK
Zu der ich Hilfe brauche ist die SDK für die D60.
Vielen Dank schon einmal für Hilfe.[/url]
Re: Nikon SDK für Kamerasteuerung
Verfasst: 20.02.2009 14:32
von Kiffi
Hai chrizl,
gibt es in diesem SDK Code-Beispiele in VB6 oder VBS? Wenn ja, dann
kannst Du diese recht einfach in 'COMate-Code' konvertieren. Poste mal ein
(kleines) Beispiel. Dann können wir mal gemeinsam schauen, wie man die
Sachen umsetzen kann.
Grüße ... Kiffi
Verfasst: 20.02.2009 14:39
von Kaeru Gaman
Interessantes Thema!
... ich hab von COMate noch nicht die geringste Ahnung, aber das hier könnte ein Einstieg werden.
wäre bestimmt interessant die CoolPix vom Rechner aus anzusteuern...
Verfasst: 20.02.2009 14:59
von chrizl
Also es gibt z. B. von diyphotobits.com ein freeware-Tool für sowas.
Auf
dieser Seite gibt es ein Beispiel-Source, bzw. den Quellsource, ganz unten in der Mitte.
Naja, man braucht dafür zwar die Kamera, um das Script ausführen zu können, da das Script die Cam anspricht.
Funktion des Scriptes ist eigentlich nur, dass sobald man mit der Kamera im PC-Modus ein Bild macht, dass dieses ausgelesen wird und auf dem PC gespeichert wird.
Hier mal der Code aus dem "tethered2"-Source von DIYPhotoBits in der WSF-Datei. Die Dll heisst "wiaaut.dll" und befindet sich im dem Ordner aus dem Download.
Code: Alles auswählen
<job>
<reference object="wia.DeviceManager" />
<object id="DevMan" progid="Wia.DeviceManager" />
<object id="dlg" progid="WIA.CommonDialog" />
<script language="VBScript">
' Tethered Shooting Script 2.0
' Copyright 2008 All Rights Reserved
' Use and distribution for non-commercial purposes permitted
' http://www.DiyPhotoBits.com
Option Explicit
dim foldername
Dim outputfolder
Dim dev 'As WIA.Device
Dim itm 'As WIA.Item
Dim img 'As WIA.ImageFile
Dim itemCount 'As Integer
Dim fnext 'As String
Dim fso
Dim fn, tempfn
dim WshShell
dim afile
dim colEnvVars
dim tempfolder
Set fso= CreateObject("Scripting.FileSystemObject")
foldername = "tethered"
outputfolder = "c:\"&foldername &"\" ' change this as required
If not fso.FolderExists(outputfolder) Then
fso.CreateFolder(outputfolder )
End If
If not fso.FolderExists(outputfolder & "temp\") Then
fso.CreateFolder(outputfolder & "temp\")
End If
Set WshShell = WScript.CreateObject("WScript.Shell")
Set colEnvVars = WshShell.Environment("User")
tempfolder = WshShell.ExpandEnvironmentStrings("%TEMP%")
Set dev = dlg.ShowSelectDevice
Wscript.echo "Tethered Shooting Script 2.0"
Wscript.echo ""
Wscript.echo "Copyright 2008 All Rights Reserved"
Wscript.echo ""
Wscript.echo "Use and distribution for non-commercial purposes permitted"
Wscript.echo ""
Wscript.echo "http://www.DiyPhotoBits.com"
Wscript.echo ""
Wscript.echo "Images from " & dev.Properties("Description").Value & " will be saved to " & outputfolder
Wscript.echo "Press Ctrl-Break to exit"
itemCount = dev.Items.Count
Do While True
If dev.Items.Count > itemCount Then ' new item appeared
itemCount = itemCount + 1
Set img = dlg.ShowTransfer(dev.Items(itemCount))
fnext = img.FileExtension
If fnext = "" Then
fnext = "NEF"
End If
tempfn = outputfolder & "temp\" & dev.Items(itemCount).Properties("Item Name").Value & "." & fnext
fn =outputfolder & dev.Items(itemCount).Properties("Item Name").Value & "." & fnext
wscript.echo "Saving "&fn
img.SaveFile tempfn
img = null
Set aFile = fso.GetFile(tempfn )
aFile.Move fn
WScript.Sleep(500)
WshShell.AppActivate foldername
WScript.Sleep(500)
WshShell.SendKeys "{END}"
End If
WScript.Sleep(500)
Loop
</script>
</job>
Ein Beispiel in C++ geschrieben vom Nikon selber ist hier zu finden:
http://www.chlu.de/purebasic/downloads/ ... Sample.rar .
Hoffe, du/ihr kannst/könnt da was mit anfangen.
Verfasst: 20.02.2009 16:33
von Kiffi
das SDK kann / möchte ich hier auf diesem Rechner nicht installieren.
Deshalb muss ich mich ein wenig blind durch den Code hangeln.
Als erstes muss geprüft werden, welche Objekte uns zur Verfügung
stehen. Ich denke, dass das zum einen der DeviceManager und zum
anderen der CommonDialog sind.
Um das herauszufinden, bitte mal nachfolgenden Code laufen lassen und
schauen, was der Debugger so herausgibt.
Code: Alles auswählen
IncludePath #PB_Compiler_Home + "comate\" ; Pfad anpassen
XIncludeFile "comate.pbi"
IncludePath ""
Define WIA_DeviceManager.COMateObject
Define WIA_CommonDialog.COMateObject
WIA_DeviceManager = COMate_CreateObject("WIA.DeviceManager")
If WIA_DeviceManager
Debug "WIA_DeviceManager-Objekt wurde erfolgreich erstellt :-)"
WIA_DeviceManager\Release() ; Objekt wieder freigeben
Else
Debug "WIA_DeviceManager-Objekt konnte nicht erstellt werden."
Debug COMate_GetLastErrorDescription()
EndIf
WIA_CommonDialog = COMate_CreateObject("WIA.CommonDialog")
If WIA_CommonDialog
Debug "WIA_CommonDialog-Objekt wurde erfolgreich erstellt :-)"
WIA_CommonDialog\Release() ; Objekt wieder freigeben
Else
Debug "WIA_CommonDialog-Objekt konnte nicht erstellt werden."
Debug COMate_GetLastErrorDescription()
EndIf
Grüße ... Kiffi
Verfasst: 23.02.2009 13:04
von chrizl
Hey,
sorry das ich mich jetzt erst melde, aber hatte am Wochenende wenig Zeit.
So, dass du die SDK nicht installieren möchtest, ist nicht schlimm. Problem ist ja leider auch, dass man ohne die Cam auch nicht viel mit der SDK anfangen kann.
Also zu deinem Code erstmal die Ausgabe des Debuggers:
Code: Alles auswählen
WIA_DeviceManager-Objekt konnte nicht erstellt werden.
Invalid progID/CLSID. Check your spelling of the programmatic identifier. Also check that the component / ActiveX control has been registered.
WIA_CommonDialog-Objekt konnte nicht erstellt werden.
Invalid progID/CLSID. Check your spelling of the programmatic identifier. Also check that the component / ActiveX control has been registered.
Also bekommt das Script keine gültige ID vom DeviceManager zurück, wenn ich das richtig verstanden habe oder?
Verfasst: 23.02.2009 13:38
von Kiffi
chrizl hat geschrieben:Code: Alles auswählen
Invalid progID/CLSID. Check your spelling of the programmatic identifier. Also check that the component / ActiveX control has been registered.
nun gibt es eigentlich nur eine Möglichkeit:
Die erforderlichen DLL(s) sind nicht korrekt in Deinem System registriert
worden. Ich weiss leider nicht, um welche DLL(s) es sich hierbei handelt,
aber such einfach mal im SDK-Ordner nach
*.DLL
Die dann gefundenen DLLs übergibst Du als Parameter der regsvr32.exe
In der Kommandozeilenumgebung:
regsvr32 sorgt dafür, dass benötige Informationen in der Registry
eingetragen werden.
sowas sollte dann ausgegeben werden:
Code: Alles auswählen
---------------------------
RegSvr32
---------------------------
DllRegisterServer in [Deine DLL] erfolgreich durchgeführt.
---------------------------
OK
---------------------------
(es kann durchaus sein, dass sich auch andere DLLs in Deinem
SDK-Ordner befinen, die nicht registriert werden können. In diesem Fall
die Fehlermeldung einfach ignorieren. Wichtig ist, dass zumindest einmal
die Erfolgsmeldung kommen sollte.)
Wenn Du das gemacht hast, dann bitte nochmal meinen PB-Code
ausführen.
Grüße ... Kiffi
Verfasst: 23.02.2009 14:06
von chrizl
Ah, das sieht doch schon viel besser aus.
Nun werden beide Objekte erfolgreich erstellt.
Oh man, ich glaube, ich muss noch so einiges dazu lernen.
Achja, die DLL, die ich registriert habe ist jetzt erstmal die wiaaut.dll. Also nicht die DLL von der SDK von Nikon.
Bzw. diese lässt sich auch nicht registrieren, weil die keinen "DLL-Eingangspunkt" hat.
Verfasst: 23.02.2009 16:18
von Kiffi
chrizl hat geschrieben:Nun werden beide Objekte erfolgreich erstellt.
prima! Das sind schon mal die besten Voraussetzungen, dass der Rest
auch laufen wird.
Probier mal, ob das nachfolgende Schnippselchen bei Dir was ausspuckt:
Code: Alles auswählen
Define WIA_DeviceManager.COMateObject
Define WIA_CommonDialog.COMateObject
WIA_DeviceManager = COMate_CreateObject("WIA.DeviceManager")
If WIA_DeviceManager
Debug "WIA_DeviceManager-Objekt wurde erfolgreich erstellt :-)"
Else
Debug "WIA_DeviceManager-Objekt konnte nicht erstellt werden."
Debug COMate_GetLastErrorDescription()
End
EndIf
WIA_CommonDialog = COMate_CreateObject("WIA.CommonDialog")
If WIA_CommonDialog
Debug "WIA_CommonDialog-Objekt wurde erfolgreich erstellt :-)"
Else
Debug "WIA_CommonDialog-Objekt konnte nicht erstellt werden."
Debug COMate_GetLastErrorDescription()
WIA_DeviceManager\Release() ; Objekt wieder freigeben
End
EndIf
Define dev.COMateObject
dev = WIA_CommonDialog\getObjectProperty("ShowSelectDevice")
If dev
Debug "Selected device: " + dev\GetStringProperty("Properties('Description')\Value")
itemCount = dev\GetIntegerProperty("Items\Count")
Debug "Items: " + Str(itemCount)
dev\Release() ; Objekt freigeben
Else
Debug COMate_GetLastErrorDescription()
EndIf
WIA_CommonDialog\Release() ; Objekt freigeben
WIA_DeviceManager\Release() ; Objekt freigeben
Grüße ... Kiffi
Verfasst: 23.02.2009 18:24
von chrizl
Perfecto.
Genauso muss das Ding laufen.
Kiffi, du bist ein Schatz.
Jetzt weiss ich auf jeden Fall, wie ich COMate einsetzen muss, ich bin da vorher nicht so wirklich durchgestiegen.
Danke schön
Achja, dein Code zeigt mir nun an, dass beide Objekte erstellt wurden und anschließend, dass die D60 ausgewählt wurde.
Als letztes kommt dann noch die Anzahl der Bilder.