জাভা ওয়েবক্যাম থেকে চিত্র ক্যাপচার?


85

কীভাবে আমি একটি ওয়েবক্যাম থেকে ক্রমাগত চিত্রগুলি ক্যাপচার করতে পারি?

আমি অবজেক্টের স্বীকৃতি নিয়ে পরীক্ষা করতে চাই (সম্ভবত জাভা মিডিয়া ফ্রেমওয়ার্ক ব্যবহার করে)।

আমি দুটি থ্রেড তৈরি করার কথা ভাবছিলাম

এক থ্রেড:

  • নোড 1: লাইভ চিত্র ক্যাপচার করুন
  • নোড 2: চিত্রটিকে "1.jpg" হিসাবে সংরক্ষণ করুন
  • নোড 3: 5 সেকেন্ড অপেক্ষা করুন
  • নোড 4: পুনরাবৃত্তি ...

অন্যান্য থ্রেড:

  • নোড 1: চিত্র ক্যাপচার হওয়া পর্যন্ত অপেক্ষা করুন
  • নোড 2: "1.jpg" ব্যবহার করে প্রতিটি পিক্সেল থেকে রঙ পান
  • নোড 3: অ্যারেতে ডেটা সংরক্ষণ করুন
  • নোড 4: পুনরাবৃত্তি ...

উত্তর:


49

এই জাভাসিভি বাস্তবায়ন সূক্ষ্মভাবে কাজ করে।

কোড:

import org.bytedeco.javacv.*;
import org.bytedeco.opencv.opencv_core.IplImage;

import java.io.File;

import static org.bytedeco.opencv.global.opencv_core.cvFlip;
import static org.bytedeco.opencv.helper.opencv_imgcodecs.cvSaveImage;

public class Test implements Runnable {
    final int INTERVAL = 100;///you may use interval
    CanvasFrame canvas = new CanvasFrame("Web Cam");

    public Test() {
        canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    }

    public void run() {

        new File("images").mkdir();

        FrameGrabber grabber = new OpenCVFrameGrabber(0); // 1 for next camera
        OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
        IplImage img;
        int i = 0;
        try {
            grabber.start();

            while (true) {
                Frame frame = grabber.grab();

                img = converter.convert(frame);

                //the grabbed frame will be flipped, re-flip to make it right
                cvFlip(img, img, 1);// l-r = 90_degrees_steps_anti_clockwise

                //save
                cvSaveImage("images" + File.separator + (i++) + "-aa.jpg", img);

                canvas.showImage(converter.convert(img));

                Thread.sleep(INTERVAL);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Test gs = new Test();
        Thread th = new Thread(gs);
        th.start();
    }
}

এছাড়াও আছে JavaCV জন্য কনফিগারেশন পোস্ট

আপনি কোডগুলি সংশোধন করতে পারেন এবং নিয়মিত বিরতিতে চিত্রগুলি সংরক্ষণ করতে সক্ষম হন এবং আপনি চান বাকী প্রক্রিয়াজাতকরণ করতে পারেন।


4
+1 আপনি রক! আমি উইন্ডোজ এবং লিনাক্স উভয় ক্ষেত্রেই ওয়েবক্যাম ক্যাপচারের জন্য জেএমএফ-এর একটি ভাল ওপেন সোর্স এবং সমর্থিত বিকল্পের সন্ধান করছিলাম। এটি একটি মোহন মত কাজ করে! আপনাকে ধন্যবাদ :)
ম্যাপেল_শ্যাফট

4
এটি আমার জন্য কাজ করে না, এটি থ্রেড "মেইন" জাভা.এল.বাংলাদেশ সম্পর্কে অসম্পূর্ণ লিঙ্ক এরর: সি: \ ব্যবহারকারী \ স্টিভ \ অ্যাপডাটা \ স্থানীয় \ টেম্প \ জাভাক্প্প 213892357885346 ni জনিওপেনসিভি_কোর.ডিল: নির্ভর লাইব্রেরি খুঁজে পাচ্ছে না
স্টেপান ইয়াকোভেনকো

এটি কাজ করবে, তবে ভিডিওর মানটি যেমন হওয়া উচিত ততটা ভাল নয়। ভাল উত্তর আউটপুট মানের জন্য আমার উত্তর দেখুন।
syb0rg

আপনার পরামর্শের জন্য ধন্যবাদ। আমি কীভাবে এটি উইন্ডোজে সেট করব? আমার কি 3 জিবি এক্সট্রাক্ট জিপ লাগবে? অন্যথায় আমার প্রোগ্রাম, লিনাক্সে জাভাসিভি ব্যবহার করে ভাল কাজ করে।
ইলিয়ান জাপ্রিয়ানভ

@ স্টেপেন ইয়াকোভেনকো আপনার ওপেনসিভি ইনস্টল করা দরকার।
ম্যাথিউউ

33

কিছু সময় আগে আমি জেনেরিক জাভা লাইব্রেরি তৈরি করেছি যা পিসি ওয়েবক্যামের সাহায্যে ছবি তোলার জন্য ব্যবহার করা যেতে পারে। এপিআই খুব সহজ, অত্যধিক বৈশিষ্ট্যযুক্ত নয়, স্ট্যান্ডেলোন কাজ করতে পারে তবে অতিরিক্ত ওয়েবক্যাম ড্রাইভার যেমন ওপেনআইএমএজে, জেএমএফ, এফএমজে, এলটিআই-সিভিআইএল, এবং কিছু আইপি ক্যামেরা সমর্থন করে।

প্রকল্পের লিঙ্কটি হল https://github.com/sarxos/webcam- ক্যাপচার

উদাহরণ কোড (ছবি তুলুন এবং টেস্ট.জেপিজে সংরক্ষণ করুন):

Webcam webcam = Webcam.getDefault();
webcam.open();
BufferedImage image = webcam.getImage();
ImageIO.write(image, "JPG", new File("test.jpg"));

এটি ম্যাভেন সেন্ট্রাল রিপোজিটরিতে বা পৃথক জিপ হিসাবে উপলভ্য যা সমস্ত প্রয়োজনীয় নির্ভরতা এবং তৃতীয় পক্ষের জেআর অন্তর্ভুক্ত।


4
শুরু করার স্বাচ্ছন্দ্যের জন্য এটি ভালভাবে দেখার মতো। কোডটি আমার পক্ষে দুর্দান্ত কাজ করেছে, আশা করি
আপনিও

@ বার্টোস ফিরিন: হ্যালো আমি আপনার এপিআইয়ের সাথে কাজ করছি। দুর্দান্ত মানুষ! তবে এখন আমি জানতে চাই ক্যামেরা জুম করা সমর্থন করে কিনা? কীভাবে এই এপিআই ব্যবহার করে ক্যামেরা জুম করবেন?
জাভা ম্যান

@ জাভামন, জুম করার জন্য কোনও দেশীয় সমর্থন নেই।
বার্টোস ফিরিন

4
@ জাভামন, আপনি নিজের কাস্টম পেইন্টার উদাহরণটি সেট করে ক্যামেরা (ওয়েবক্যাম্পেল) থেকে দৃশ্য প্রদর্শন করা প্যানেলে বা ওয়েবক্যামআইমেজট্রান্সফর্মার বৈশিষ্ট্যটি ব্যবহার করে ক্যামেরা থেকে সরাসরি আসা চিত্রটিতে সরাসরি আঁকতে পারেন। আরও তথ্যের জন্য দয়া করে গিথুবের ওয়েবক্যাম ক্যাপচার প্রকল্পের পৃষ্ঠাতে টিকিটটি খুলুন যেহেতু আমি স্ট্যাক ওভারফ্লো (এখানে লেখার জন্য খুব বেশি এবং মন্তব্যগুলিতে ব্যবহার করার জন্য খুব কম অক্ষর) এখানে বিশদগুলিতে এটি ব্যাখ্যা করতে চাই না। প্রকল্পটি এখানে পাওয়া যাবে github.com/sarxos/webcam- ক্যাপচার
বার্টোস ফিরিন

4
@ ইলিয়াস হাদিজাদেহ, সমস্যার ক্ষেত্রে আপনি সর্বদা github.com/sarxos/webcam- ক্যাপচারে নতুন ইস্যু টিকিট তৈরি করতে পারেন যেখানে আপনি ডকুমেন্টেশন এবং উদাহরণগুলিও পেতে পারেন। দয়া করে মনে রাখবেন যে এটি জাভাটির সাথে পরিচিত ব্যক্তিদের জন্য কাঠামো। আপনি জাভা নব্বইয়ের ক্ষেত্রেও সাহায্য করতে ইচ্ছুক লোক রয়েছে তবে আপনাকে নিজেরাই বেসিকগুলি শিখতে হবে।
বার্টোস ফিরিন



5

এই জাতীয় জাভাসিভি ব্যবহার করে gt_ebuddy এর উত্তর বন্ধ হয়, কিন্তু আমার ভিডিও আউটপুট তার উত্তর পরে অনেক উচ্চ মানের হয়। আমিও (যেমন প্রোগ্রাম বন্ধ যখন যেমন কিছু অন্যান্য র্যান্ডম উন্নতি জুড়েছেন ESCএবং CTRL+Cচাপা, এবং সম্পদ সঠিকভাবে প্রোগ্রাম ব্যবহার বন্ধ করার নিশ্চিত)।

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;

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

public class HighRes extends JComponent implements Runnable {
    private static final long serialVersionUID = 1L;

    private static CanvasFrame frame = new CanvasFrame("Web Cam");
    private static boolean running = false;
    private static int frameWidth = 800;
    private static int frameHeight = 600;
    private static OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
    private static BufferedImage bufImg;

    public HighRes()
    {
        // setup key bindings
        ActionMap actionMap = frame.getRootPane().getActionMap();
        InputMap inputMap = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

        for (Keys direction : Keys.values())
        {
            actionMap.put(direction.getText(), new KeyBinding(direction.getText()));
            inputMap.put(direction.getKeyStroke(), direction.getText());
        }

        frame.getRootPane().setActionMap(actionMap);
        frame.getRootPane().setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, inputMap);

        // setup window listener for close action
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                stop();
            }
        });
    }

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

    @Override
    public void run()
    {
        try
        {

            grabber.setImageWidth(frameWidth);
            grabber.setImageHeight(frameHeight);
            grabber.start();
            while (running)
            {

                final IplImage cvimg = grabber.grab();
                if (cvimg != null)
                {

                    // cvFlip(cvimg, cvimg, 1); // mirror

                    // show image on window
                    bufImg = cvimg.getBufferedImage();
                    frame.showImage(bufImg);
                }
            }
            grabber.stop();
            grabber.release();
            frame.dispose();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

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

    public void stop()
    {
        running = false;
    }

    private class KeyBinding extends AbstractAction {

        private static final long serialVersionUID = 1L;

        public KeyBinding(String text)
        {
            super(text);
            putValue(ACTION_COMMAND_KEY, text);
        }

        @Override
        public void actionPerformed(ActionEvent e)
        {
            String action = e.getActionCommand();
            if (action.equals(Keys.ESCAPE.toString()) || action.equals(Keys.CTRLC.toString())) stop();
            else System.out.println("Key Binding: " + action);
        }
    }
}

enum Keys
{
    ESCAPE("Escape", KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)),
    CTRLC("Control-C", KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK)),
    UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)),
    DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)),
    LEFT("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)),
    RIGHT("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0));

    private String text;
    private KeyStroke keyStroke;

    Keys(String text, KeyStroke keyStroke)
    {
        this.text = text;
        this.keyStroke = keyStroke;
    }

    public String getText()
    {
        return text;
    }

    public KeyStroke getKeyStroke()
    {
        return keyStroke;
    }

    @Override
    public String toString()
    {
        return text;
    }
}


3

আমি ভিডিও কনফারেন্স অ্যাপ্লিকেশনটিতে জেএমএফ ব্যবহার করেছি এবং এটি দুটি ল্যাপটপে ভালভাবে কাজ করেছে: একটি ইন্টিগ্রেটেড ওয়েবক্যাম এবং অন্যটি পুরানো ইউএসবি ওয়েব ক্যামের সাথে। এটি জেএমএফের আগে ইনস্টল এবং কনফিগার হওয়া দরকার, তবে আপনি একবার হয়ে গেলে আপনি জাভা কোডের মাধ্যমে মোটামুটি সহজেই হার্ডওয়্যারটি অ্যাক্সেস করতে পারবেন।


3

আপনি মার্ভিন ফ্রেমওয়ার্ক চেষ্টা করতে পারেন । এটি ক্যামেরাগুলির সাথে কাজ করার জন্য একটি ইন্টারফেস সরবরাহ করে। তদ্ব্যতীত, এটি অবজেক্ট ট্র্যাকিং এবং ফিল্টারিংয়ের মতো রিয়েল-টাইম ভিডিও প্রসেসিং বৈশিষ্ট্যগুলির একটি সেট সরবরাহ করে।

এক নজর দেখে নাও!

রিয়েল-টাইম ভিডিও প্রসেসিং ডেমো:
http://www.youtube.com/watch?v=D5mBt0kRYvk

আপনি নীচের উত্স ব্যবহার করতে পারেন। মাত্র 5 সেকেন্ডে মারভিনআইমেজআইও.সেসিমেজ () ব্যবহার করে একটি ফ্রেম সংরক্ষণ করুন ।

ওয়েবক্যাম ভিডিও ডেমো:

public class SimpleVideoTest extends JFrame implements Runnable{

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

    public SimpleVideoTest(){
        super("Simple Video Test");
        videoAdapter = new MarvinJavaCVAdapter();
        videoAdapter.connect(0);
        videoPanel = new MarvinImagePanel();
        add(videoPanel);
        new Thread(this).start();
        setSize(800,600);
        setVisible(true);
    }
    @Override
    public void run() {
        while(true){
            // Request a video frame and set into the VideoPanel
            image = videoAdapter.getFrame();
            videoPanel.setImage(image);
        }
    }
    public static void main(String[] args) {
        SimpleVideoTest t = new SimpleVideoTest();
        t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

যারা কেবল একটি ছবি তুলতে চান তাদের জন্য:

ওয়েবক্যামপিকচার.জভা

public class WebcamPicture {
    public static void main(String[] args) {
        try{
            MarvinVideoInterface videoAdapter = new MarvinJavaCVAdapter();
            videoAdapter.connect(0);
            MarvinImage image = videoAdapter.getFrame();
            MarvinImageIO.saveImage(image, "./res/webcam_picture.jpg");
        } catch(MarvinVideoInterfaceException e){
            e.printStackTrace();
        }
    }
}

2

http://grack.com/downloads/school/enel619.10/report/java_media_framework.html

দোল দিয়ে প্লেয়ার ব্যবহার করে

প্লেয়ারটি খুব সহজেই একটি সুইং অ্যাপ্লিকেশনটিতে ব্যবহার করা যেতে পারে। নিম্নলিখিত কোডটি পুরো উইন্ডোতে প্রদর্শিত ভিডিও আউটপুট সহ একটি সুইং-ভিত্তিক টিভি ক্যাপচার প্রোগ্রাম তৈরি করে:

import javax.media.*;
import javax.swing.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.event.*;

public class JMFTest extends JFrame {
    Player _player;
    JMFTest() {
        addWindowListener( new WindowAdapter() {
            public void windowClosing( WindowEvent e ) {
                _player.stop();
                _player.deallocate();
                _player.close();
                System.exit( 0 );
            }
        });
          setExtent( 0, 0, 320, 260 );
        JPanel panel = (JPanel)getContentPane();
        panel.setLayout( new BorderLayout() );
        String mediaFile = "vfw://1";
        try {
            MediaLocator mlr = new MediaLocator( mediaFile );
            _player = Manager.createRealizedPlayer( mlr );
            if (_player.getVisualComponent() != null)
            panel.add("Center", _player.getVisualComponent());
            if (_player.getControlPanelComponent() != null)
            panel.add("South", _player.getControlPanelComponent());
        }
        catch (Exception e) {
            System.err.println( "Got exception " + e );
        }
    }

    public static void main(String[] args) {
        JMFTest jmfTest = new JMFTest();
        jmfTest.show();
    }
}

2

আমি ওয়েবক্যাম্প ক্যাপচার এপিআই ব্যবহার করেছি ... আপনি এই http://webcam-capture.sarxos.pl/ থেকে ডাউনলোড করতে পারেন

        webcam = Webcam.getDefault();
        webcam.open();

        if (webcam.isOpen()) { //if web cam open 
            BufferedImage image = webcam.getImage();
            JLabel imageLbl = new JLabel();
            imageLbl.setSize(640, 480);             //show captured image
            imageLbl.setIcon(new ImageIcon(image));

            int showConfirmDialog = JOptionPane.showConfirmDialog(null, imageLbl, "Image Viewer", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, new ImageIcon(""));

            if (showConfirmDialog == JOptionPane.YES_OPTION) {
                JFileChooser chooser = new JFileChooser();
                chooser.setDialogTitle("Save Image");
                chooser.setFileFilter(new FileNameExtensionFilter("IMAGES ONLY", "png", "jpeg", "jpg")); //this file extentions are shown
                int showSaveDialog = chooser.showSaveDialog(this);
                if (showSaveDialog == 0) {                  //if pressed 'Save' button
                    String filePath = chooser.getCurrentDirectory().toString().replace("\\", "/");
                    String fileName = chooser.getSelectedFile().getName(); //get user entered file name to save
                    ImageIO.write(image, "PNG", new File(filePath + "/" + fileName + ".png"));

                }
            }
        }

আপনার কোডের সাথে কিছু ব্যাখ্যা সরবরাহ করা উচিত
fen1x

4
ধন্যবাদ এটি হালকা এবং পরিবর্তে জাভ্যাক এই আমার জন্য কাজ করে।
লুক্ক

1

জাভা সাধারণত হার্ডওয়্যার অ্যাক্সেস পছন্দ করে না, সুতরাং আপনার কোনও প্রকারের ড্রাইভার প্রোগ্রামের প্রয়োজন হবে, যেমনটি সোনালীমেন বলেছে। আমি আমার ল্যাপটপে একটি কমান্ড লাইন প্রোগ্রাম খুঁজে পেয়েছি যা একটি ছবি স্ন্যাপ করে। তারপরে এটি সোনারমীনের ব্যাখ্যা অনুসারে একই; আপনি আপনার জাভা প্রোগ্রাম থেকে কপিকচার () রুটিনে কমান্ড লাইন প্রোগ্রামটি চালান, এবং আপনার কোডের বাকী কোডটি একই কাজ করে।

একটি অ্যারেতে পিক্সেল মানগুলি পড়ার অংশটি বাদ দিয়ে আপনি সম্ভবত বিএমপি-তে ফাইল সংরক্ষণ করে আরও ভাল পরিবেশিত হতে পারেন, এটি ইতিমধ্যে প্রায় ফর্ম্যাট, তারপরে এটিতে স্ট্যান্ডার্ড জাভা ইমেজ লাইব্রেরি ব্যবহার করে।

একটি কমান্ড লাইন প্রোগ্রাম ব্যবহার করা আপনার প্রোগ্রামের উপর নির্ভরতা যুক্ত করে এবং এটি কম পোর্টেবল করে তোলে, তবে কী ওয়েবক্যামটি ঠিক ছিল?


1

মাল্টিমিডিয়া আপেক্ষিক জাভা অ্যাপ্লিকেশানের জন্য এফএমজে ব্যবহার করে পুনঃসমন


0

আমি বিশ্বাস করি যে ওয়েব-ক্যাম অ্যাপ্লিকেশন সফ্টওয়্যার যা ওয়েব ক্যামের সাথে আসে, বা আপনি ওয়েব উইন্ডো ওয়েব ক্যাম সফটওয়্যারটি ওয়েব ক্যাম চালু করার পরে একটি ব্যাচ স্ক্রিপ্ট (উইন্ডোজ / ডস স্ক্রিপ্ট) এ চালানো যেতে পারে (যেমন যদি এটি একটি বাহ্যিক শক্তির প্রয়োজন হয় তবে সরবরাহ)। ব্যাস স্ক্রিপ্টে, আপনি নির্দিষ্ট সময়সীমার পরে ক্যাপচারে উপযুক্ত বিলম্ব যুক্ত করতে পারেন। এবং লুপে ক্যাপচার কমান্ড চালিয়ে যান।

আমার ধারণা এটি সম্ভব হওয়া উচিত

-বিজ্ঞাপন


0

প্রসেসিংয়ে এটির জন্য খুব সুন্দর একটি ইন্টারফেস রয়েছে , যা গ্রাফিক্সের জন্য ডিজাইন করা একটি পিডজিন জাভা। এটি কিছু চিত্রের স্বীকৃতি কাজে যেমন লিঙ্কটি ব্যবহৃত হয়।

আপনার যা দরকার তা নির্ভর করে আপনি সেখানে জাভাতে ব্যবহৃত ভিডিও লাইব্রেরিটি লোড করতে সক্ষম হতে পারেন, বা আপনি যদি কেবল এটির সাথে খেলেন তবে আপনি নিজেই প্রসেসিং ব্যবহার করে পেতে সক্ষম হতে পারেন।


0

এফএমজে এটি করতে পারে, এটি যেমন সমর্থনকারী লাইব্রেরি ব্যবহার করে, এলটিআই-সিভিল। দু'জনেই সোর্সফোরে রয়েছে।


0

জাভা ব্যবহার করে কীভাবে ওয়েবক্যাম ব্যবহার করবেন জেএমরন ব্যবহার করে দেখুন । আমি মনে করি জাভা ব্যবহার করে কোনও ওয়েবক্যাম অ্যাক্সেস করার সহজ উপায় জেএমরন ব্যবহার করা। আমি এটি একটি 64-বিট প্রসেসরের সাহায্যে ব্যবহার করার চেষ্টা করেছি, তবে এটি আমাকে একটি ত্রুটি দিয়েছে। যদিও এটি 32-বিট প্রসেসরটিতে ঠিক কাজ করেছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.