2008-09-22 5 views
23

मैं कुछ परिदृश्यों के अर्द्ध-वास्तविक समय का पता लगाने के लिए एक छवि प्रसंस्करण समस्या को देख रहा हूं। मेरा लक्ष्य है कि लाइव वीडियो मेरे जावा कोड में किसी भी तरह में मोशन जेपीईजी फ्रेम के रूप में पहुंचें।जावा-आधारित एप्लिकेशन द्वारा उपयोग के लिए लाइव वीडियो डिवाइस से छवियों को कैप्चर करने का सबसे अच्छा तरीका क्या है?

मैं Java Media Framework से परिचित हूं और, दुख की बात है, मुझे लगता है कि हम इसे प्रभावी ढंग से मृत एपीआई पर विचार कर सकते हैं। मैं Axis boxes से भी परिचित हूं और, जबकि मुझे वास्तव में उनके समाधान पसंद हैं, मैं अपने विशिष्ट ब्याज के किसी भी महत्वपूर्ण प्रतिक्रिया की सराहना करता हूं।

यह मैं कैसे परिभाषित है "सर्वश्रेष्ठ" इस चर्चा के प्रयोजन के लिए:

  • विलंबता - अगर मैं इस वीडियो स्ट्रीम का उपयोग कर कैमरे को नियंत्रित कर रहा हूँ, मैं पर मेरे राउंड ट्रिप विलंबता रखना चाहते हैं यदि संभव हो तो 100 मिलीसेकंड से कम। जब मुझे दृश्य परिवर्तन दिखाई देता है तो उस समय मेरे नियंत्रण इनपुट के बीच का समय मापा जाता है। कुछ समय बाद संपादित करें: ध्यान में रखना एक और बात यह है कि कैमरा नियंत्रण मैन्युअल और स्वचालित (ईवेंट ट्रिगर्स) का संयोजन होने की संभावना है। हमें उन चित्रों को तुरंत देखने की ज़रूरत है, भले ही उच्च गुणवत्ता वाले फ़ीड को अलग से संग्रहीत किया जाए।
  • लागत मुक्त/मुक्त स्रोत मुफ्त से बेहतर नहीं है।
  • समायोज्य कोडेक पैरामीटर - मुझे कुछ स्थितियों के लिए कोडेक को ट्यून करने में सक्षम होना चाहिए। कभी-कभी एक उच्च स्पीड कम-रिज़ॉल्यूशन स्ट्रीम प्रक्रिया करने में वास्तव में आसान होती है।
  • जावा के साथ "एकीकरण" - इस समाधान को मेरे कोड में कितना परेशानी है? क्या मैं एक सॉकेट पर पैकेट भेज रहा हूं? यूआरएल मार रहा है? डायरेक्ट 3 डी/जेएनआई संयोजन स्थापित करना?
  • विंडोज/लिनक्स/दोनों? - मैं एक ऑपरेटिंग सिस्टम अज्ञेय समाधान को पसंद करूंगा क्योंकि मुझे ओएस के कई स्वादों को वितरित करना है, लेकिन एक समाधान हो सकता है जो एक के लिए इष्टतम है लेकिन दूसरे नहीं।

नोट: मुझे अन्य छवि/वीडियो कैप्चर कोडेक्स के बारे में पता है और यह इस प्रश्न का केंद्र नहीं है। मैं विशेष रूप से फ्रेम सटीकता के नुकसान के कारण एपीआई स्ट्रीमिंग (उदा। एमपीईजी 4) में रुचि रखने वाला हूं। हालांकि, अगर मेरे प्रश्न का कोई समाधान है जो एक और फ्रेम-सटीक डेटा स्ट्रीम प्रदान करता है, तो कृपया

इस प्रश्न का पालन करें: इस बिंदु पर, मैं दृढ़ता से Axis video encoders जैसे उपकरणों को खरीदने के इच्छुक हूं सॉफ्टवेयर या पीसी पर सीधे वीडियो कैप्चर करने की कोशिश करने से। हालांकि, अगर किसी के पास विकल्प हैं, तो मुझे उन्हें सुनना अच्छा लगेगा।

उत्तर

0

क्या आपने कभी Processing.org पर देखा है? यह मूल रूप से "कलात्मक" अनुप्रयोगों और भौतिक कंप्यूटिंग प्लेटफार्मों के विकास के लिए एक सरल अनुप्रयोग ढांचा है, लेकिन यह जावा पर आधारित है और आप नीचे "असली" जावा पर खोद सकते हैं।

कारण यह ध्यान में आया कि प्रोसेसिंग के लिए कई वीडियो libraries हैं जो मूल रूप से जावा घटक हैं (कम से कम मुझे लगता है कि वे हैं - साइट की सभी तकनीकी जानकारी आपको चाहिए)। ग्रहण आईडीई में प्रसंस्करण पुस्तकालयों और उपकरणों का उपयोग करने पर tutorial है। वीडियो कैप्चर और प्रसंस्करण पर कई examples भी हैं।

भले ही आप सीधे पुस्तकालयों का उपयोग नहीं कर सकते हैं, प्रसंस्करण एल्गोरिदम काम करने के लिए एक महान भाषा/पर्यावरण है। छवि और वीडियो कैप्चर और रीयल-टाइम प्रोसेसिंग के कई शानदार उदाहरण हैं।

2

जेएमएफ की मृत-नींद के बारे में, क्या आप FMJ implementation से अवगत हैं?मुझे नहीं पता कि यह "सर्वश्रेष्ठ" समाधान के रूप में योग्य है, लेकिन संभवतः चर्चा में शामिल होने के लायक है।

+0

अंतिम अपडेट काफी समय पहले हुआ प्रतीत होता है: http://sourceforge.net/project/showfiles.php?group_id=161490 2007 से मर चुके एक एपीआई शायद हमारी मदद करने वाला नहीं है। वैसे भी, धन्यवाद। –

3

एफएमजे निश्चित रूप से वीडियो कैप्चर कर सकता है और इसे एमजेपीईजी फ्रेम में बदल सकता है।

7

यह जावासीवी कार्यान्वयन ठीक काम करता है।

कोड:

import com.googlecode.javacv.OpenCVFrameGrabber; 

import com.googlecode.javacv.cpp.opencv_core.IplImage; 
import static com.googlecode.javacv.cpp.opencv_highgui.*; 

public class CaptureImage { 
    private static void captureFrame() { 
     // 0-default camera, 1 - next...so on 
     final OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); 
     try { 
      grabber.start(); 
      IplImage img = grabber.grab(); 
      if (img != null) { 
       cvSaveImage("capture.jpg", img); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    public static void main(String[] args) { 
     captureFrame(); 
    } 
} 

कैमरा .और configuration for JavaCV :

से भी post on viewing live video नहीं है मुझे लगता है कि यह आपकी आवश्यकताओं को पूरा करेगा।

+0

दिलचस्प - क्या फ्रेम हथियार की विलंबता पर कोई डेटा उपलब्ध है? –

+0

मैंने इस तरह की डेटा की गणना या पाया नहीं है। लेकिन यह अच्छा लगता है। इस वीडियो में http://www.youtube.com/watch?v=r02no-zIBnI, मैं जेफ्रेम में कैप्चर की गई छवियों (IplImage img = grabber.grab()) प्रदर्शित कर रहा हूं। – gtiwari333

0

यह मेरा जावासीवी कार्यान्वयन उच्च रिज़ॉल्यूशन वीडियो आउटपुट के साथ है और अन्य समाधानों की तुलना में फ्रेम दर में कोई उल्लेखनीय गिरावट नहीं है (केवल जब मेरा वेबकैम फिर से ध्यान देता है तो मुझे थोड़ी सी गिरावट दिखाई देती है, केवल एक पल के लिए)।

import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.swing.JFrame; 

import com.googlecode.javacv.CanvasFrame; 
import com.googlecode.javacv.OpenCVFrameGrabber; 
import com.googlecode.javacv.OpenCVFrameRecorder; 
import com.googlecode.javacv.cpp.opencv_core.IplImage; 

public class Webcam implements Runnable { 

    IplImage image; 
    static CanvasFrame frame = new CanvasFrame("Web Cam"); 
    public static boolean running = false; 

    public Webcam() 
    { 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      grabber.setImageWidth(800); 
      grabber.setImageHeight(600); 
      grabber.start(); 
      while (running) 
      { 
       IplImage cvimg = grabber.grab(); 
       BufferedImage image; 
       if (cvimg != null) 
       { 
        // opencv_core.cvFlip(cvimg, cvimg, 1); // mirror 
        // show image on window 
        image = cvimg.getBufferedImage(); 
        frame.showImage(image); 
       } 
      } 
      grabber.stop(); 
      frame.dispose(); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String... args) 
    { 
     Webcam webcam = new Webcam(); 
     webcam.start(); 
    } 

    public void start() 
    { 
     new Thread(this).start(); 
     running = true; 
    } 

    public void stop() 
    { 
     running = false; 
    } 
} 
0

नीचे Marvin Framework का उपयोग करके एक बहुत ही सरल कार्यान्वयन दिखाया गया है। मार्विन का उपयोग करके आप आसानी से वास्तविक समय वीडियो प्रसंस्करण जोड़ सकते हैं।

import javax.swing.JFrame; 
import marvin.gui.MarvinImagePanel; 
import marvin.image.MarvinImage; 
import marvin.video.MarvinJavaCVAdapter; 
import marvin.video.MarvinVideoInterface; 

public class SimpleVideoTest extends JFrame implements Runnable{ 

    private MarvinVideoInterface videoAdapter; 
    private MarvinImage    image; 
    private MarvinImagePanel  videoPanel; 

    public SimpleVideoTest(){ 
     super("Simple Video Test"); 

     // Create the VideoAdapter and connect to the camera 
     videoAdapter = new MarvinJavaCVAdapter(); 
     videoAdapter.connect(0); 

     // Create VideoPanel 
     videoPanel = new MarvinImagePanel(); 
     add(videoPanel); 

     // Start the thread for requesting the video frames 
     new Thread(this).start(); 

     setSize(800,600); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SimpleVideoTest t = new SimpleVideoTest(); 
     t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    @Override 
    public void run() { 
     while(true){ 
      // Request a video frame and set into the VideoPanel 
      image = videoAdapter.getFrame(); 
      videoPanel.setImage(image); 
     } 
    } 
} 

एक और example रीयल टाइम वीडियो प्रोसेसिंग के लिए एकाधिक एल्गोरिदम लागू करना।

+0

यह दिलचस्प है - क्या आप उपरोक्त मेरी विलंबता आवश्यकताओं से बात कर सकते हैं? –

+0

विलंबता आपके एप्लिकेशन के हार्डवेयर, कैमरा और वीडियो रिज़ॉल्यूशन पर निर्भर करेगी। हालांकि, मुझे लगता है कि यह व्यवहार्य है। इस रीयल-टाइम वीडियो प्रोसेसिंग [डेमो] (http://www.youtube.com/watch?v=D5mBt0kRYvk) पर एक नज़र डालें। यह कार्रवाई में इस ढांचे को दिखाता है। –

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