2012-04-14 13 views
5

असल में मेरे पास एक कैमरा चिप है (कैमरा मॉड्यूल: सी 3038, ओमनीविजन के सीएमओएस छवि सेंसर ओवी 6630 का उपयोग करता है) एक पीसी से आरएस 232 लिंक के माध्यम से जुड़ा हुआ है। मैं (कैमरा विनिर्देश के अनुसार) एक जावा प्रोग्राम जो इस प्रारूप में में छवि डेटा पढ़ना चाहते हैं:कैमरा छवि प्रसंस्करण

डाटा प्रारूप - YCrCb 4: 2: 2, GRB 4: 2: 2, आरजीबी कच्चे डाटा

इसे कैसे करें इस पर कोई संकेत?

मेरे कार्यान्वयन:

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

कैमरा मॉड्यूल: सी 3038, ओमनीविजन के सीएमओएस छवि सेंसर ओवी 6630 का उपयोग करता है। – stud91

+0

धन्यवाद, उस जानकारी को संपादित किया गया। इसे और अधिक प्रमुख बनाने के लिए सवाल में। जवाब नहीं जानते, लेकिन दिलचस्प सवाल है। +1 –

उत्तर

0

सवाल तरह के व्यापक इसलिए मैं नहीं जानता कि आप है, लेकिन के लिए 232 रुपये आप एक serialport उपयोग करने की आवश्यकता करने जा रहे हैं कितना अनुभव है। Here एक COM पोर्ट से पढ़ना शुरू करने के लिए एक साधारण उदाहरण है।

3

दुर्भाग्य से जावा अपने आप ही सीरियल पोर्ट का समर्थन नहीं करता - आपको लगता है कि के लिए एक बाहरी पुस्तकालय की जरूरत है। मैं the RXTX library पर एक नज़र डालने का सुझाव दूंगा, जो कि इन दिनों एक डिफैक्टो मानक का कुछ हद तक प्रतीत होता है।

वीडियो सेंसर चिप्स आमतौर पर अपेक्षाकृत सरल संचार इंटरफेस होते हैं (यानी पुल चिप के बिना)। आम तौर पर यह छवि पैरामीटर सेट करने, वास्तविक छवि डेटा स्थानांतरण शुरू करने और फिर बफर में कई बाइट पढ़ने के लिए उबलता है। कभी-कभी एक छवि डेटा प्रारंभ या समाप्ति हस्ताक्षर शामिल हो सकता है, लेकिन यह इसके बारे में है।

यह नहीं होना चाहिए भी कठिन अगर आप सभी दस्तावेज आप हाथ में चिप के लिए - मैं कभी कभी किसी भी प्रलेखन के बिना सी में कुछ इसी तरह किया है ...

संपादित करें:

एक बार जब आप एक बाइट सरणी में छवि पढ़ लेंगे, तो आप इसे जावा के लिए उपयोग करने योग्य बनाने के लिए the BufferedImage class का उपयोग करने में सक्षम हो सकते हैं। उस ने कहा, मैं यह निर्धारित करने में सक्षम नहीं हूं कि जावा एआरजीबी विविधता के अलावा कुछ भी समर्थन करता है - यदि आप गैर- का उपयोग करना चाहते हैं तो आपको अपने आप पर रंग-स्थान रूपांतरण करना होगा (या किसी तृतीय-पक्ष लाइब्रेरी के माध्यम से, मुझे लगता है) आपके सेंसर में आरजीबी मोड।

+0

धन्यवाद मुझे पता है कि एक COM पोर्ट से RXTX पुस्तकालय लेकिन का उपयोग कर पढ़ने के लिए मैं क्या जरूरत है जावा – stud91

+0

कोड संपादित और uploaded..However में एक छवि में COM पोर्ट से कि डेटा की प्रक्रिया करने के लिए है, वहाँ एक तरह से मैं कर सकता है जबकि लूप को रोकने के लिए छवि के अंत का पता लगाएं (inputStream.available()> 0) – stud91

+0

@ stud91: ठीक है, स्पष्ट तरीका बाइट्स की संख्या को गिनना होगा। रेज़ोल्यूशन और बाइट्स/पिक्सेल के आधार पर कच्चे चित्रों में एक निश्चित बाइट आकार होता है। प्रारूपों में पैडिंग बिट्स से सावधान रहें उदा। 12 बिट्स/पिक्सेल। कुछ सेंसर में डिलीमीटर बाइट अनुक्रम भी होते हैं। आप अपने समर्थित उत्पादन प्रारूपों पर जानकारी के लिए अपने सेंसर दस्तावेज़ देखने होंगे ... – thkala

संबंधित मुद्दे