Nikon SDK für Kamerasteuerung

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

stell dich doch nich döf! Bild

die Wahl von Motiv, Blickwinkel und Bildausschnitt ist das, was einen Fotografen ausmacht.
Auch bei einer Serienaufnahme muss man das vorab händisch einstellen.

... und auch bei Einzelaufnahmen macht ein Fotograf eine kleine Serie, wo er ein paar Einstellungswerte variiert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

+1.

Das hängt auch davon ab, ob die Kamera, eine Steuerung durch den PC
unterstützt.

Bei meiner Samsung Pro815 Digitalkamera ist das leider nicht möglich.

Wenn ich die Möglichkeiten wie bei einer Nicon DXX hätte, würden noch ganz
andere Ideen für Life-Aufnahmen verwirklicht werden können :mrgreen:

Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

@KG ich bin es vielleicht :wink:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
schic
Beiträge: 68
Registriert: 25.12.2004 19:04

Beitrag von schic »

@chrizl
ich nutze den Nikon SDK für Bewegungserkennung mit der D90 über die Liveview Funktion (Bild für Bild Vergleich in ASM), um bei Bewegung dann ein richtiges Bild zu schießen. Das ganze ist zwar noch im Entwicklungsstadium, aber funktioniert grundsätzlich schon ganz brauchbar.

Um nicht den gesamten Code des im SDK beigelegten Beispiels in PB neue schreiben zu müssen, habe ich aus der Konsolenanwendung kurzerhand das Konsolenzeugs entfernt und den Rest in eine statische LIB kompiliert und kann so, mit Import, die Funktionen und Variablen direkt in PB nutzen. Nur die Funktionen bei denen die Konsolen-Aus/Eingabe des Beispiels nichts hergibt, habe ich nach PB übertragen.

Die bisher wenigen Funktionen des Programms funktionieren mit der D90 und bis auf Liveview, auch mit einer D200 wenn das entsprechende Modul geladen wird. Nur die Auslöseverzögerung nach einer Bewegungserkennung ist leider sehr (zu) lang.

Wenn Du (oder sonst jemand) intersssiert ist, maile ich den vorhanenen Code mit Lib gerne zu. Hier zum posten ist das zu viel, allein die Includes für Konstanten und Variablentypen gehen schon in die 2000 Zeilen.

Außerdem jage ich seit einer Woche erfolglos einem Speicherfehler (wahrscheindlich ein solcher) hinterher und könnte etwas Hilfe und evtl. neue Ideen auch ganz gut gebrauchen :wink:

Bist Du inzwischen mit dem WIA-Zeugs zum PC-gesteuerten Fokussieren und Auslösen etc. gekommen? Wenn das geht, wäre es ja auch eine Alternative - wie gesagt, ich kämpfe und hadere zur Zeit etwas mit diesem SDK.


Gruß
schic

PS.: so schaut´s bis jetzt aus...
Bild
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Beitrag von chrizl »

Hey schic

hab leider keine Nachricht vom PureBoard bekommen, dass du geschrieben hast.

Ich bin leider noch nicht weiter gekommen, mit der WIA leider.
Hab leider nicht viel Zeit gehabt, bzw. auch ne Zeit lang andere Sachen im Kopf gehabt.

Würde mich freuen, wenn du mir den Source zuschicken könntest, dann kann ich mir das ja auch mal alles anschauen und mich da mal richtig einarbeiten.

Die gesamten SDKs habe ich alle hier aufem Laptop.
Das einbinden sollte denke ich mal einfach sein oder?
Dann kann ich das ja mal mit der D60 ausprobieren.
Zwar ohne LiveView, aber vlt. finde ich ja auch noch Möglichkeiten mit der SDK, was für Spielereien man damit anstellen kann.
Mit freundlichen Grüßen,
chrizl
schic
Beiträge: 68
Registriert: 25.12.2004 19:04

Beitrag von schic »

@chrizl
ich hoffe der Sourcecode etc. ist gestern brauchbar bei Dir angekommen.

Ich habe jetzt noch die Windows Image Acquisition Library mit den Bespielen aus der Hilfe getestet:

Code: Alles auswählen

XIncludeFile "comate.pbi"

;{- wia constants
; Miscellaneous
#wiaIDUnknown$  = "{00000000-0000-0000-0000-000000000000}"
#wiaAnyDeviceID$  = "*"

; FormatID
#wiaFormatBMP  = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
#wiaFormatPNG  = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
#wiaFormatGIF  = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
#wiaFormatJPEG  = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
#wiaFormatTIFF  = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"

; EventID
#wiaEventDeviceConnected  = "{A28BBADE-64B6-11D2-A231-00C04FA31809}"
#wiaEventDeviceDisconnected  = "{143E4E83-6497-11D2-A231-00C04FA31809}"
#wiaEventItemCreated  = "{4C8F4EF5-E14F-11D2-B326-00C04F68CE61}"
#wiaEventItemDeleted  = "{1D22A559-E14F-11D2-B326-00C04F68CE61}"
#wiaEventScanImage  = "{A6C5A715-8C6E-11D2-977A-0000F87A926F}"
#wiaEventScanPrintImage  = "{B441F425-8C6E-11D2-977A-0000F87A926F}"
#wiaEventScanFaxImage  = "{C00EB793-8C6E-11D2-977A-0000F87A926F}"
#wiaEventScanOCRImage  = "{9D095B89-37D6-4877-AFED-62A297DC6DBE}"
#wiaEventScanEmailImage  = "{C686DCEE-54F2-419E-9A27-2FC7F2E98F9E}"
#wiaEventScanFilmImage  = "{9B2B662C-6185-438C-B68B-E39EE25E71CB}"
#wiaEventScanImage2  = "{FC4767C1-C8B3-48A2-9CFA-2E90CB3D3590}"
#wiaEventScanImage3  = "{154E27BE-B617-4653-ACC5-0FD7BD4C65CE}"
#wiaEventScanImage4  = "{A65B704A-7F3C-4447-A75D-8A26DFCA1FDF}"

; CommandID
#wiaCommandSynchronize  = "{9B26B7B2-ACAD-11D2-A093-00C04F72DC3C}"
#wiaCommandTakePicture  = "{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}"
#wiaCommandDeleteAllItems  = "{E208C170-ACAD-11D2-A093-00C04F72DC3C}"
#wiaCommandChangeDocument  = "{04E725B0-ACAE-11D2-A093-00C04F72DC3C}"
#wiaCommandUnloadDocument  = "{1F3B3D8E-ACAE-11D2-A093-00C04F72DC3C}"

; WiaSubType enumeration
#UnspecifiedSubType = 0
#RangeSubType = 1
#ListSubType = 2
#FlagSubType = 3

; WiaDeviceType enumeration
#UnspecifiedDeviceType = 0
#ScannerDeviceType = 1
#CameraDeviceType = 2
#VideoDeviceType = 3

; WiaItemFlag enumeration
#FreeItemFlag = $0
#ImageItemFlag = $1
#FileItemFlag = $2
#FolderItemFlag = $4
#RootItemFlag = $8
#AnalyzeItemFlag = $10
#AudioItemFlag = $20
#DeviceItemFlag = $40
#DeletedItemFlag = $80
#DisconnectedItemFlag = $100
#HPanoramaItemFlag = $200
#VPanoramaItemFlag = $400
#BurstItemFlag = $800
#StorageItemFlag = $1000
#TransferItemFlag = $2000
#GeneratedItemFlag = $4000
#HasAttachmentsItemFlag = $8000
#VideoItemFlag = $10000
#RemovedItemFlag = $80000000

; WiaPropertyType enumeration
#UnsupportedPropertyType = 0
#BooleanPropertyType = 1
#BytePropertyType = 2
#IntegerPropertyType = 3
#UnsignedIntegerPropertyType = 4
#LongPropertyType = 5
#UnsignedLongPropertyType = 6
#ErrorCodePropertyType = 7
#LargeIntegerPropertyType = 8
#UnsignedLargeIntegerPropertyType = 9
#SinglePropertyType = 10
#DoublePropertyType = 11
#CurrencyPropertyType = 12
#DatePropertyType = 13
#FileTimePropertyType = 14
#ClassIDPropertyType = 15
#StringPropertyType = 16
#ObjectPropertyType = 17
#HandlePropertyType = 18
#VariantPropertyType = 19
#VectorOfBooleansPropertyType = 101
#VectorOfBytesPropertyType = 102
#VectorOfIntegersPropertyType = 103
#VectorOfUnsignedIntegersPropertyType = 104
#VectorOfLongsPropertyType = 105
#VectorOfUnsignedLongsPropertyType = 106
#VectorOfErrorCodesPropertyType = 107
#VectorOfLargeIntegersPropertyType = 108
#VectorOfUnsignedLargeIntegersPropertyType = 109
#VectorOfSinglesPropertyType = 110
#VectorOfDoublesPropertyType = 111
#VectorOfCurrenciesPropertyType = 112
#VectorOfDatesPropertyType = 113
#VectorOfFileTimesPropertyType = 114
#VectorOfClassIDsPropertyType = 115
#VectorOfStringsPropertyType = 116
#VectorOfVariantsPropertyType = 119

; WiaImagePropertyType enumeration
#UndefinedImagePropertyType = 1000
#ByteImagePropertyType = 1001
#StringImagePropertyType = 1002
#UnsignedIntegerImagePropertyType = 1003
#LongImagePropertyType = 1004
#UnsignedLongImagePropertyType = 1005
#RationalImagePropertyType = 1006
#UnsignedRationalImagePropertyType = 1007
#VectorOfUndefinedImagePropertyType = 1100
#VectorOfBytesImagePropertyType = 1101
#VectorOfUnsignedIntegersImagePropertyType = 1102
#VectorOfLongsImagePropertyType = 1103
#VectorOfUnsignedLongsImagePropertyType = 1104
#VectorOfRationalsImagePropertyType = 1105
#VectorOfUnsignedRationalsImagePropertyType = 1106

; WiaEventFlag enumeration
#NotificationEvent = 1
#ActionEvent = 2

; WiaImageIntent enumeration
#UnspecifiedIntent = 0
#ColorIntent = 1
#GrayscaleIntent = 2
#TextIntent = 4

; WiaImageBias enumeration
#MinimizeSize = 65536
#MaximizeQuality = 131072
;}

Define WIA_DeviceManager.COMateObject
Define dev.COMateObject, DeviceInfo.COMateObject, DeviceCommand.COMateObject, DeviceProperty.COMateObject
Define DevInfs.COMateEnumObject, thisDeviceCommands.COMateEnumObject, thisDeviceProperties.COMateEnumObject

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()
EndIf

;DeviceManager.DeviceInfos.Count
DeviceInfosCount = WIA_DeviceManager\GetIntegerProperty("DeviceInfos\Count"); just cause we are curious
Debug "DeviceInfosCount: " + Str(DeviceInfosCount)

DevInfs = WIA_DeviceManager\CreateEnumeration("DeviceInfos")
If DevInfs
  DeviceInfo = DevInfs\GetNextObject()
  While DeviceInfo ;looking for special Device (here D90)
    myDevNam$ = DeviceInfo\GetStringProperty("Properties('Name')\Value")
    Debug "found " + myDevNam$
    If myDevNam$ = "D90" ; here put the string of which camera you ever want to select
      dev = DeviceInfo\GetObjectProperty("Connect") ;Establishes a connection with this device
      If dev: Break: EndIf
    EndIf
    DeviceInfo\Release()
    DeviceInfo = DevInfs\GetNextObject()
  Wend
  DeviceInfo\Release()
  
  If dev
    
    Debug "------- with commands:"
    ; now let´s look which commands are available for our device
    thisDeviceCommands = dev\CreateEnumeration("Commands")
    DeviceCommand = thisDeviceCommands\GetNextObject()
    While DeviceCommand
      ; dc.CommandID & ", " & dc.Description & ", " & dc.Name
      Debug DeviceCommand\GetStringProperty("CommandID")+", " + DeviceCommand\GetStringProperty("Description")+", " + DeviceCommand\GetStringProperty("Name")
      DeviceCommand\Release()
      DeviceCommand = thisDeviceCommands\GetNextObject()
    Wend
    Debug "------- and properties:"
    
    ; now we look for the properties
    thisDeviceProperties = dev\CreateEnumeration("Properties")
    DeviceProperty = thisDeviceProperties\GetNextObject()
    While DeviceProperty
      strInfo$ = DeviceProperty\GetStringProperty("Name")+", (" + Str(DeviceProperty\GetIntegerProperty("PropertyID"))+"), "
      If DeviceProperty\GetIntegerProperty("IsVector")
        strInfo$ = strInfo$ + "[vector of data]"
      Else
        If DeviceProperty\GetIntegerProperty("Type") = #StringPropertyType
          strInfo$ = strInfo$ + Chr(34) + DeviceProperty\GetStringProperty("Value")+ Chr(34)
        Else
          strInfo$ = strInfo$ + DeviceProperty\GetStringProperty("Value")
        EndIf
      EndIf
      Debug strInfo$
      DeviceProperty\Release()
      DeviceProperty = thisDeviceProperties\GetNextObject()
    Wend
    
    ;now for close, we shoot a picture
    StartTime = ElapsedMilliseconds()
    dev\invoke("ExecuteCommand('" + #wiaCommandTakePicture +"')")
    MessageRequester("Auslöseverzögerung", Str(ElapsedMilliseconds()-StartTime) + " ms", #MB_OK|#MB_ICONINFORMATION)
    
  EndIf
  
EndIf

; release all objects
thisDeviceProperties\Release()
thisDeviceCommands\Release()
dev\Release()
DevInfs\Release()
WIA_DeviceManager\Release() 
funktioniert zwar viel umgänglicher als mit dem SDK von Nikon, aber der Auslösevorgang ist mit > 2400 ms noch mal 1 Sekunde langsamer - nix für Bewegungserkennung mit Fotofalle :-(
Unabhängig davon, dass ich noch nicht herausgefunden habe, wie man auf Liveview umschaltet...

_____________
schic
tim
Beiträge: 21
Registriert: 05.12.2010 20:49

Re: Nikon SDK für Kamerasteuerung

Beitrag von tim »

Hi,

(bin jetzt mal der Quereinsteiger)

Fotos machen geht schonmal. Jetzt liegen die Fotos auf der Speicherkarte in der Kamera.
Ich komme nur leider nicht dahinter wie ich die Fotos von der Kamera laden kann...

Was ich gern realisieren würde:

- ein Foto machen
- dieses Foto von Speicherkarte auf PC übertragen
- (ggf. Speicherkarte leeren, damit sie nicht überläuft)


Kann mir kurz jemand auf die Schiene helfen?



Gruß
Tim
Sirius-2337
Beiträge: 71
Registriert: 29.05.2010 20:55

Re: Nikon SDK für Kamerasteuerung

Beitrag von Sirius-2337 »

Die Kamera ist per USB angeschlossen?
Dann müssten die PB-FileSystem Libary (http://www.purebasic.com/german/documen ... index.html) dafür schon ausreichen.
Benutzeravatar
chrizl
Beiträge: 60
Registriert: 31.08.2004 15:03
Wohnort: Pbg.
Kontaktdaten:

Re: Nikon SDK für Kamerasteuerung

Beitrag von chrizl »

Hey,

schön, dass sich noch jemand für das Thema interessiert.

Ich muss meine D5000 demnächst auch noch mal testen, ob ich da noch ein bisschen dran machen kann.


In erster Linie würde ich aber sagen, dass es am einfachsten geht, die SD-Karte einfach über den Explorer auszulesen.
Ich selbst habe viel versucht, um die Bilder mit der SDK aus der Kamera zu bekommen.

Vlt. schaffe ich das ja in den nächsten Woche.

Ein schönes Wochenende wünsche ich schon einmal.

Grüße,

Christian
Mit freundlichen Grüßen,
chrizl
tim
Beiträge: 21
Registriert: 05.12.2010 20:49

Re: Nikon SDK für Kamerasteuerung

Beitrag von tim »

Hi,
PB-FileSystem Libary
die Idee hatte ich auch schon, nur leider wird
die Kamera nicht als Wechseldatenträger angezeigt.


Gruß
Tim
Antworten