2012-04-14 19 views
5

Fondamentalmente ho un chip della fotocamera (modulo telecamera: C3038, utilizza il sensore di immagine CMOS OmniVision OV6630) collegato a un PC tramite un collegamento RS232. Voglio leggere i dati delle immagini in un programma Java che è in questo formato (in base alle specifiche della macchina fotografica): formatoElaborazione delle immagini della telecamera

dati - YCrCb 4: 2: 2, GRB 4: 2: 2, RGB dati grezzi

Qualche suggerimento su come farlo?

mia realizzazione:

import gnu.io.CommPortIdentifier; 
import gnu.io.PortInUseException; 
import gnu.io.SerialPort; 
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import gnu.io.UnsupportedCommOperationException; 

import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 
import java.util.*; 
import javax.swing.*; 
import javax.imageio.*; 

public class SimpleRead1 implements Runnable, SerialPortEventListener { 
static CommPortIdentifier portId; 
static Enumeration portList; 

InputStream inputStream; 
SerialPort serialPort; 
Thread readThread; 
byte [] readBuffer; 
static byte [] storeBuffer; 

public SimpleRead1() { 
    try { 
     serialPort = (SerialPort) portId.open("SimpleReadApp", 2000); 
    }catch (PortInUseException e) {System.out.println(e);} 

    try { 
     inputStream = serialPort.getInputStream(); 
    }catch (IOException e) {System.out.println(e);} 

    try { 
     serialPort.addEventListener(this); 
    } catch (TooManyListenersException e) {System.out.println(e);} 

    serialPort.notifyOnDataAvailable(true); 

    try { 
     serialPort.setSerialPortParams(9600, 
      SerialPort.DATABITS_8, 
      SerialPort.STOPBITS_1, 
      SerialPort.PARITY_NONE); 
    } catch (UnsupportedCommOperationException e) {System.out.println(e);} 

    readThread = new Thread(this); 
    readThread.start(); 
} 

public void run() { 
    try { 
     Thread.sleep(20000); 
    } catch (InterruptedException e) {System.out.println(e);} 
} 

@Override 
public void serialEvent(SerialPortEvent event){ 
    switch(event.getEventType()) { 
    case SerialPortEvent.BI: 
    case SerialPortEvent.OE: 
    case SerialPortEvent.FE: 
    case SerialPortEvent.PE: 
    case SerialPortEvent.CD: 
    case SerialPortEvent.CTS: 
    case SerialPortEvent.DSR: 
    case SerialPortEvent.RI: 
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
     break; 
    case SerialPortEvent.DATA_AVAILABLE: 
     readBuffer = new byte[Integer.MAX_VALUE]; 

     try { 
      while (inputStream.available() > 0) { 

       int numBytes = inputStream.read(readBuffer); 
       System.out.print(new String(readBuffer)); 
      } 
      } catch (IOException e) {e.printStackTrace();} 

     InputStream in = new ByteArrayInputStream(readBuffer); 
     BufferedImage image = null; 

     try { 
      image = ImageIO.read(in); 
     } catch (IOException e) {e.printStackTrace();} 

     //GUI for displaying image 
     ImageIcon imageIcon = new ImageIcon(image); 
     JLabel label = new JLabel(); 
     label.setIcon(imageIcon); 
     JFrame frame = new JFrame("image display"); 
     frame.getContentPane().add(label,BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true);      
     break; 
    } 
} 

public static void main(String[] args) throws Exception { 
    portList = CommPortIdentifier.getPortIdentifiers(); 

    while (portList.hasMoreElements()) { 
     portId = (CommPortIdentifier) portList.nextElement(); 
     if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { 
      if (portId.getName().equals("COM7")) { 
     //    if (portId.getName().equals("/dev/term/a")) { 
       SimpleRead1 reader = new SimpleRead1(); 
      } 
     } 
    } 
} 
} 
+1

Modulo telecamera: C3038, utilizza il sensore di immagine CMOS OmniVision OV6630. – stud91

+0

Grazie, modificato questa informazione. nella domanda per renderlo più prominente. Non so la risposta, ma una domanda interessante. +1 –

risposta

0

La questione è una specie di ampia in modo da non so quanta esperienza hai, ma per RS-232 si sta andando ad avere bisogno di utilizzare un SerialPort. Here è un semplice esempio per iniziare a leggere da una porta COM.

3

Sfortunatamente Java non supporta le porte seriali da solo - per questo è necessaria una libreria esterna. Vorrei suggerire di dare un'occhiata a the RXTX library, che sembra essere un po 'uno standard defacto in questi giorni.

I chip del sensore video hanno in genere interfacce di comunicazione relativamente semplici (cioè senza un chip bridge). Di solito si riduce all'impostazione dei parametri dell'immagine, iniziando il trasferimento effettivo dei dati dell'immagine e quindi leggendo un numero di byte in un buffer. A volte può essere implicata l'inizio o la fine della firma dei dati dell'immagine, ma è tutto qui.

Non dovrebbe essere troppo difficile se si dispone di tutta la documentazione per si chip a portata di mano - ho occasionalmente fatto qualcosa di simile in C senza alcuna documentazione ...

EDIT:

Dopo aver letto l'immagine in un array di byte, è possibile utilizzare the BufferedImage class per renderlo utilizzabile per Java. Detto questo, non sono stato in grado di determinare se Java supporta qualsiasi cosa tranne le variazioni ARGB - potresti dover fare la conversione dello spazio colore da solo (o tramite una libreria di terze parti, suppongo) se vuoi usare un non -Modalità RGB nel sensore.

+0

grazie so come leggere da una porta COM usando la libreria RXTX ma quello di cui ho bisogno è elaborare i dati dalla porta COM in un'immagine in Java – stud91

+0

Codice modificato e caricato ... Tuttavia, c'è un modo che potrei Rileva la fine dell'immagine per fermare il ciclo while che è mentre (inputStream.available()> 0) – stud91

+0

@ stud91: beh, il modo ovvio sarebbe quello di contare il numero di byte. Le immagini non elaborate hanno una dimensione di byte fissa, a seconda della risoluzione e dei byte/pixel. Fai attenzione ai bit di riempimento nei formati con ad es. 12 bit/pixel. Alcuni sensori hanno anche sequenze di byte delimitanti. È necessario controllare la documentazione del sensore per i dettagli sui formati di output supportati ... – thkala

Problemi correlati