Nikon SDK für Kamerasteuerung

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Nikon SDK für Kamerasteuerung

Beitrag 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]
Mit freundlichen Grüßen,
chrizl
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Nikon SDK für Kamerasteuerung

Beitrag 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
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag 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.
Mit freundlichen Grüßen,
chrizl
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag 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?
Mit freundlichen Grüßen,
chrizl
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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:

Code: Alles auswählen

regsvr32 [PfadUndNameDeinerDll]
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
a²+b²=mc²
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag 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.
Mit freundlichen Grüßen,
chrizl
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag 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.
Mit freundlichen Grüßen,
chrizl
Antworten