2012-04-14 244 views
5

基本上我有一个通过RS232链接连接到PC的摄像头芯片(摄像头模块:C3038,使用OmniVision的CMOS图像传感器OV6630)。我想读在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 2012-04-14 07:51:03

+0

谢谢,编辑了这个信息。纳入问题中,使其更加突出。不知道答案,但有趣的问题。 +1 – 2012-04-14 07:54:39

回答

0

的问题是一种广泛的,所以我不知道你有多少经验,但对于RS-232,你将需要使用的SerialPort。 Here是让你开始从COM端口读取的简单示例。

3

不幸的是,Java不支持自己的串行端口 - 您需要一个外部库。我建议看看the RXTX library,这些日子似乎有些事实上的标准。

视频传感器芯片通常自身具有相对简单的通信接口(即没有桥接芯片)。通常归结为设置图像参数,启动实际的图像数据传输,然后将一些字节读入缓冲区。有时候可能会涉及图像数据的开始或结束签名,但就是这样。

它不应该是太如果你把所有的文档,你凑钱在手 - 我偶尔会做用C类似的东西没有任何文档 ...

编辑:

将图像读取到字节数组后,您可能可以使用the BufferedImage class使其可用于Java。也就是说,我一直无法确定Java是否支持除ARGB以外的其他任何东西 - 如果您想使用非空格,您可能必须自行(或通过第三方库)进行色彩空间转换-RGB模式在您的传感器。

+0

谢谢我知道如何使用RXTX库从COM端口读取数据,但我需要的是将数据从COM端口处理成Java中的图像 – stud91 2012-04-14 08:00:48

+0

代码已编辑并上传..但是,有没有办法检测图像的结束以停止while循环while(inputStream.available()> 0) – stud91 2012-04-15 01:21:02

+0

@ stud91:好的,显而易见的方法是计算字节数。原始图像具有固定的字节大小,具体取决于分辨率和字节/像素。请注意以格式填充比特,例如12位/像素。一些传感器也具有分隔符字节序列。您应该检查您的传感器文档以了解其支持的输出格式的详细信息... – thkala 2012-04-15 09:46:10