5

基本的に、RS232 リンクを介して PC に接続されたカメラ チップ (カメラ モジュール: C3038、OmniVision の CMOS イメージ センサー OV6630 を使用) があります。この形式の Java プログラムで画像データを読み取りたい (カメラの仕様による):

データフォーマット - YCrCb 4:2:2、GRB 4:2:2、RGB Raw Data

それを行う方法に関するヒントはありますか?

私の実装:

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();
           }
        }
    }
}
}
4

2 に答える 2

3

残念ながら、Java はそれ自体ではシリアル ポートをサポートしていません。そのためには外部ライブラリが必要です。最近では事実上の標準のように思われるRXTX ライブラリをご覧になることをお勧めします。

通常、ビデオ センサー チップは、それ自体に比較的単純な通信インターフェイスを備えています (つまり、ブリッジ チップなし)。通常、画像パラメータの設定、実際の画像データ転送の開始、およびバッファへのバイト数の読み取りに要約されます。画像データの開始署名または終了署名が関係する場合もありますが、それだけです。

手元にチップのすべてのドキュメントがあれば、それほど難しくないはずです - 私は時折、ドキュメントなしで C で同様のことをしました...

編集:

イメージをバイト配列に読み取ったら、BufferedImage クラスを使用して Java で使用できるようにすることができます。とは言っても、Java が ARGB バリエーション以外をサポートしているかどうかを判断することはできませんでした。 -センサーのRGBモード。

于 2012-04-14T07:58:43.690 に答える
0

質問は幅広いので、あなたの経験はわかりませんが、RS-232 の場合は SerialPort を使用する必要があります。COM ポートからの読み取りを開始するための簡単な例を次に示します

于 2012-04-14T07:58:20.493 に答える