java - जावा-आधारित एप्लिकेशन द्वारा उपयोग के लिए लाइव वीडियो डिवाइस से छवियों को कैप्चर करने का सबसे अच्छा तरीका क्या है?




video image-processing (4)

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

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

इस चर्चा के उद्देश्य से मैं "सर्वश्रेष्ठ" परिभाषित करता हूं:

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

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

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


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


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

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

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


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

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 वास्तविक समय वीडियो प्रसंस्करण के लिए एकाधिक एल्गोरिदम लागू करना।


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

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;
    }
}






image-capture