[Java/C++] Communicatie met camera driver

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Ik ben net begonnen aan een project waarbij ik de beschikking heb over een Thorlabs CMOS camera. De bedoeling is dat ik de beelden ga uitlezen en analyseren met de ImageJ toolkit. Zoals de naam al doet vermoeden moet dat in Java gebeuren. Ik heb redelijk wat Java ervaring dus dat moet wel goed komen denk ik.

Het probleem is alleen dat ik werkelijk geen flauw idee heb hoe ik de afbeeldingen die de camera maakt beschikbaar krijg in Java. Ik heb de beschikking over drivers voor de camera (Windows, Linux), deze zijn in C++ geschreven. Ik heb tevens de beschikking over een vrij compacte handleiding moet hoe je de camera kan besturen en uitlezen met C++ en Visual Basic.

Waar ik naar op zoek ben is dus waarschijnlijk communicatie tussen de C++ driver en mijn Java programma. Ik heb al even wat research gedaan en ik kwam uit op twee mogelijke oplossingen: gebruik maken van de Java Native Interface (JNI) of ActiveX. Deze laatste optie valt al bij voorbaat af omdat het project platform onafhankelijk moet worden. Kortom, JNI blijft over. Nu had ik hier nog nooit van gehoord en weet ik verder bijna niks van C++ en hardware aansturing dus vraag ik me af of het inderdaad het beste is om JNI te gebruiken voor mijn project?

Tips en advies is welkom! :)

Acties:
  • 0 Henk 'm!

  • Trolando
  • Registratie: April 2005
  • Laatst online: 25-08 13:47
Ik heb een soortgelijk project gedaan een aantal jaren geleden.

JNI zou je kunnen gebruiken maar je vergist je dan wel qua platform-onafhankelijkheid. JNI is namelijk een brug naar een C-implementatie, en uiteindelijk zit je weer aan je platform vast, tenzij je meerdere implementaties maakt. JNI zorgt soms voor hele nare onbegrijpelijke bugs.

Wat ik je aanraad is om voor de communicatie een programma te maken in C, dat de aansturing van de hardware doet (op tijd plaatjes schieten, en opslaan naar het juiste bestand). Ik heb dit ooit in Linux gedaan met de GCC compiler, maar je kunt het ook in Visual C++ doen onder Windows, etc. Maak deze implementatie simpel. Vervolgens schrijf je de rest van je programma in Java en communiceer je met je C-programma, bijvoorbeeld met pipes of via de TCP/IP stack. Qua performance hoef je je niet zoveel zorgen te maken, de TCP/IP stack is snel genoeg als je het enkel gebruikt voor controlling. Je kunt de plaatjes misschien ook wel via TCP/IP doen of gewoon via het file system, dat moet je dan even zelf bekijken wat het handigst is.

Zelf heb ik een high-performance systeem gemaakt, dat meerdere camera's en sensoren aanstuurde, waaronder een camera met een hoge resolutie en hoge framerate en een sensor waarvan ik enkel een Java-driver had gekregen. JNI zorgde voor nare crashes, uiteindelijk heb ik het met meerdere applicaties die via TCP/IP communiceren opgelost. Zolang je niet alle data over TCP/IP gooit is de latency klein. Data schrijf je in een andere thread naar de disk, etc.

Acties:
  • 0 Henk 'm!

  • G70boX
  • Registratie: Juli 2004
  • Laatst online: 21:11
Via stackoverflow.com (zoek op JNI) zijn er nog een hoop alternatieven, ik kan uit je post niet opmaken of je die ook hebt gezien. Twee die vaak genoemd worden:

JNA ( https://github.com/twall/jna ), lijkt vrij gemakkelijk in gebruik.
SWIG ( http://www.swig.org/ )

Kijk wel goed naar de nadelen (JNA schijnt voor bepaalde functies slechte performance te hebben).

Note; ik heb er zelf verder geen ervaring mee.

Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Bedankt voor jullie nuttige en uitgebreide posts! _/-\o_

Het klinkt als een goed idee om een simpel C++ programmaatje te maken dat het uitlezen en aansturen van de camera voor z'n rekening neemt om vervolgens de data door te sturen naar mijn Java programma. Of ik dan voor de communicatie pipes of TCP/IP ga gebruiken moet ik nog even uitzoeken. Bij nader inzien lijken interfaces als JNI / JNA me behoorlijk hoofdpijn verzorgend omdat je volgens mij niet zo goed kan debuggen. Daarbij komt ook nog is dat mijn camera in behoorlijk hoge resolutie schiet en dat ik misschien real-time de beelden door wil kunnen sturen naar mijn Java programma. Performance is dus wel redelijk belangrijk.
Wat ik je aanraad is om voor de communicatie een programma te maken in C
Bedoel je hier specifiek C of kan ik dit net zo goed doen in C++? Ik heb in ieder geval gewoon de .dll en .lib bestanden van de driver. De developers-handleiding bij de camera heeft het in ieder geval alleen over C++ en VB en niet over C.

* monnick gaat dus maar C++ leren :P

Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 06:45

voodooless

Sound is no voodoo!

Kijk eens naar het Java Media Framework. Daarmee heb je met een beetje mazel makkelijke toegang tot je camera zonder dat je glue code hoeft te schrijven.

Do diamonds shine on the dark side of the moon :?


Acties:
  • 0 Henk 'm!

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 21-09 17:22
Kun je die handleiding geven over de implementatie voor c++ en Visual Basic? JNI zou een oplossing kunnen zijn maar als Visual Basic ook met het ding kan communiceren lijkt het me sterk dat Java dat niet direct kan.

...


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Als de camera drivers heeft en geinstalleerd is op de computer kun je deze dan niet gewoon benaderen via een java media library? Of via API calls naar het OS?

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
API calls naar het OS klinken nog aantrekkelijker. Ik heb dus nog nooit met hardware aansturing gewerkt, ik heb eigenlijk geen idee hoe dit werkt. Zou ik hier meer in de handleiding over moeten vinden?

Ik heb de handleiding even geupload, deze is hier te vinden.
(Op pagina 86 begint het gedeelte over de SDK).

Ps. ik heb ook nog een andere (compactere) handleiding waar meer expliciet over VB / C# wordt verteld, maar deze staat alleen op de bijgeleverde cd-rom waar ik even geen toegang tot heb.

[ Voor 22% gewijzigd door monnick op 12-09-2011 09:07 ]


Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Ik heb een mailtje gestuurd naar de technische helpdesk van de camera fabrikant maar die stuurt terug dat ze geen Java ondersteunen. Wel geeft hij nog het advies om ActiveX te gebruiken, maar dat gaat hem niet worden.

Dus de stappen die ik nu het beste kan nemen lijken:

1. Kijken naar Java Media Library (ik verwacht niet dat dit gaat lukken eigenlijk)
2. C++ programma schrijven en data doorsturen naar Java programma met pipes of TCP/IP.

Als iemand anders nog tips / adviezen heeft hoor ik dat graag! :D
Pagina: 1