2012-04-14 32 views
5

基本的に私は、RS232リンクを介してPCに接続されたカメラチップ(カメラモジュール:C3038、OmniVisionのCMOSイメージセンサOV6630を使用しています)を持っています。 Iは、(カメラの仕様に従って)このフォーマットであるJavaプログラムの画像データを読みたい:カメラ画像処理

データ形式 - のYCrCb 4:2:2、GRB 4:2:2、RGB生データ

どのようにそれを行うためのヒント?

私の実装:

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

カメラモジュール:C3038、OmniVisionのCMOSイメージセンサーOV6630を使用します。 – stud91

+0

ありがとう、その情報を編集しました。それをより顕著にするために質問に答えてください。答えは分かりませんが、面白い質問です。 +1 –

答えて

0

質問の種類の幅広いので、私はあなたが持っているが、RS-232のためにあなたがSERIALPORTを使用する必要があるとしているどのくらいの経験を知らないです。 Hereは、COMポートからの読み取りを開始する簡単な例です。

3

残念ながら、Javaはシリアルポートを単独でサポートしていません。そのためには外部ライブラリが必要です。私はthe RXTX libraryを見てみることをお勧めします。これは、最近、幾分デファクトスタンダードのようです。

ビデオセンサーチップは、通常、比較的単純な通信インターフェースを(ブリッジチップなしで)持っています。通常は、画像パラメータの設定、実際の画像データ転送の開始、バッファへのバイト数の読み込みまでに至ります。時には、画像データの開始または終了の署名が関与することもありますが、それはそれに関するものです。

お手元にあなたのチップのためにすべてのドキュメントを持っている場合はすぎ難しいことではありません - 私は時折なしC内の任意のマニュアルを参照して似たような行っている...

EDIT:

イメージをバイト配列に読み込んだら、the BufferedImage classを使用してJavaで使用できるようにすることができます。つまり、JavaがARGBのバリエーション以外のものをサポートしているかどうかを判断することはできませんでした。もし、あなたが自分で(またはサードパーティのライブラリを使って)色空間変換を行わなければならないかもしれません。センサーの-RGBモード。

+0

ありがとう私はRXTXライブラリを使用してCOMポートから読み込む方法を知っていますが、私が必要とするものはCOMポートからJavaのイメージにそのデータを処理することです – stud91

+0

コードを編集してアップロードしました。しかし、 (inputStream.available()> 0) – stud91

+0

@ stud91:明らかに、バイト数を数えることになります。 RAWイメージは、解像度とバイト/ピクセルに応じて固定バイトサイズを持ちます。フォーマットのビットをパディングすることに注意してください。 12ビット/ピクセル。一部のセンサーには、デリミタバイトシーケンスもあります。サポートされている出力フォーマットの詳細については、センサーのマニュアルを参照してください。 – thkala