2012-04-14 25 views
5

Temel olarak bir bilgisayara bir RS232 bağlantısı üzerinden bağlı bir kamera çipi (Kamera modülü: C3038, OmniVision'ın CMOS görüntü sensörü OV6630 kullanıyor) var. Ben (kamera şartnameye göre) bu biçimde bir Java programı görüntü verilerini okumak istiyorum:Fotoğraf makinesi görüntü işleme

Veri biçimi - YCrCb 4: 2: 2, GRB 4: 2: 2, RGB Ham Veri

Nasıl yapılacağına dair ipuçları var mı?

My uygulaması:

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

Kamera modülü: C3038, OmniVision'ın CMOS görüntü sensörü OV6630 kullanır. – stud91

+0

Teşekkürler, bu bilgiyi düzenledim. daha belirgin hale getirmek için soruya. Cevabı bilmiyorum, ama ilginç bir soru. +1 –

cevap

0

soru tür geniş o yüzden var ama RS-232 için bir SerialPort kullanmaya ihtiyacımız olacak ne kadar deneyim bilmiyoruz. Here, bir COM bağlantı noktasından okumaya başlamanızı sağlayan basit bir örnektir.

3

Ne yazık ki Java seri portları kendi başına desteklemiyor - bunun için harici bir kütüphaneye ihtiyacınız var. Bu günlerde bir defacto standardı gibi görünen the RXTX library'a bakmanızı öneririm. Görüntü algılayıcı çipleri genellikle kendi başlarına göreceli olarak basit iletişim arayüzlerine (yani bir köprü yongası olmadan) sahiptirler. Genellikle görüntü parametrelerini ayarlamaya, gerçek görüntü veri aktarımını başlatmaya ve daha sonra bir bayt sayısını bir ara belleğe okumaya döner. Bazen bir görüntü verisi başlangıcı veya bitiş imzası olabilir, ancak bununla ilgili.

O olmamalı elinizdeki çip için tüm belgelere varsa çok sert - ... ben bazen herhangi belgeler olmadan C benzer bir şey yapmış

DÜZENLEME:

Resmi bayt dizisine okuduktan sonra, Java için kullanılabilir hale getirmek için the BufferedImage class'u kullanabilirsiniz. Bu, Java'nın ARGB varyasyonlarından başka bir şey destekleyip desteklemediğini belirleyemedim - eğer non-non kullanmak istiyorsanız kendi (veya bir üçüncü taraf kütüphanesi aracılığıyla) renk-uzay dönüşümünü yapmanız gerekebilir. Sensörünüzde -RGB modu.

+0

RXTX kütüphanesi kullanarak bir COM portundan okumayı biliyorum ama ihtiyaç duyduğum şey, COM portundan bu görüntüyü Java – stud91

+0

Kodunda bir görüntüye işlemek ve yüklemek .. bir yolu var mı? while döngüsünü durdurmak için görüntünün sonunu algılarken (inputStream.available()> 0) – stud91

+0

@ stud91: açık bir şekilde, bayt sayısını saymak gerekir. Ham görüntülerin çözünürlüğe ve bayt/piksele bağlı olarak sabit bir bayt boyutu vardır. Dolgu uçlarını örn. 12 bit/piksel. Bazı sensörler de sınırlayıcı bayt dizilerine sahiptir. Desteklenen çıktı formatlarıyla ilgili ayrıntılar için sensör belgelerinizi kontrol etmelisiniz ... – thkala

İlgili konular