2012-04-14 49 views
5

Về cơ bản tôi có một chip camera (Camera module: C3038, sử dụng cảm biến hình ảnh CMOS của OmniVision OV6630) được kết nối với PC thông qua liên kết RS232. Tôi muốn đọc dữ liệu hình ảnh trong một chương trình Java mà là ở định dạng này (theo đặc điểm kỹ thuật camera): Định dạngXử lý ảnh máy ảnh

dữ liệu - YCrCb 4: 2: 2, GRB 4: 2: 2, RGB Raw Data

Bất kỳ gợi ý nào về cách thực hiện?

thực hiện của tôi:

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

Mô-đun máy ảnh: C3038, sử dụng cảm biến hình ảnh CMOS của OmniVision OV6630. – stud91

+0

Cảm ơn, đã chỉnh sửa thông tin đó. vào câu hỏi để làm cho nó nổi bật hơn. Không biết câu trả lời, nhưng câu hỏi thú vị. +1 –

Trả lời

0

Câu hỏi đặt ra là loại rộng vì vậy tôi không biết có bao nhiêu kinh nghiệm bạn có nhưng đối với RS-232 bạn sẽ cần phải sử dụng một SerialPort. Here là một ví dụ đơn giản để bạn bắt đầu đọc từ một cổng COM.

3

Thật không may Java không hỗ trợ cổng nối tiếp riêng của mình - bạn cần một thư viện bên ngoài cho điều đó. Tôi sẽ đề nghị xem xét the RXTX library, mà dường như là một phần của một tiêu chuẩn defacto những ngày này.

Chip cảm biến video thường có giao diện truyền thông tương đối đơn giản (ví dụ: không có chip cầu). Thông thường, nó sẽ đổ xuống để thiết lập các tham số hình ảnh, bắt đầu truyền dữ liệu hình ảnh thực tế và sau đó đọc một số byte vào một bộ đệm. Đôi khi một dữ liệu hình ảnh bắt đầu hoặc kết thúc chữ ký có thể được tham gia, nhưng đó là về nó.

Không nên quá cứng nếu bạn có tất cả các tài liệu hướng dẫn cho bạn chip trong tầm tay - Tôi đã thỉnh thoảng làm điều gì đó tương tự như trong C mà không bất kỳ tài liệu ...

EDIT:

Khi bạn đã đọc hình ảnh vào một mảng byte, bạn có thể sử dụng the BufferedImage class để làm cho nó có thể sử dụng được cho Java. Điều đó nói rằng, tôi không thể xác định xem Java có hỗ trợ gì ngoài các biến thể của ARGB không - bạn có thể phải thực hiện chuyển đổi không gian màu (hoặc thông qua thư viện của bên thứ ba), nếu bạn muốn sử dụng Chế độ -RGB trong cảm biến của bạn.

+0

cảm ơn tôi biết cách đọc từ cổng COM bằng thư viện RXTX nhưng những gì tôi cần là xử lý dữ liệu đó từ cổng COM thành hình ảnh trong Java – stud91

+0

Mã đã chỉnh sửa và tải lên..Tuy nhiên, có cách nào tôi có thể phát hiện phần cuối của hình ảnh để dừng vòng lặp while trong khi đó (inputStream.available()> 0) – stud91

+0

@ stud91: tốt, cách hiển nhiên sẽ là đếm số byte. Hình ảnh thô có kích thước byte cố định, tùy thuộc vào độ phân giải và byte/pixel. Cẩn thận với các bit đệm trong các định dạng, ví dụ: 12 bit/pixel. Một số cảm biến cũng có các chuỗi byte phân cách. Bạn nên kiểm tra tài liệu cảm biến để biết chi tiết về định dạng đầu ra được hỗ trợ ... – thkala

Các vấn đề liên quan