2008-09-22 22 views
23

Tôi đang xem xét vấn đề xử lý hình ảnh để phát hiện thời gian thực trong một số trường hợp nhất định. Mục tiêu của tôi là đưa video trực tiếp đến dưới dạng khung Motion JPEG trong mã Java của tôi bằng cách nào đó.Phương pháp tốt nhất để chụp ảnh từ thiết bị video trực tiếp để sử dụng bởi một ứng dụng dựa trên Java là gì?

Tôi quen thuộc với Java Media Framework và, thật đáng buồn, tôi nghĩ chúng tôi có thể xem xét rằng API đã chết hiệu quả. Tôi cũng quen thuộc với Axis boxes và, trong khi tôi thực sự thích giải pháp của họ, tôi sẽ đánh giá cao bất kỳ phản hồi quan trọng nào về các điểm yêu thích cụ thể của tôi.

Đây là cách tôi xác định "tốt nhất" cho mục đích của cuộc thảo luận này:

  • trễ - nếu tôi kiểm soát máy ảnh sử dụng dòng video này, tôi muốn giữ độ trễ khứ hồi của tôi tại ít hơn 100 mili giây nếu có thể. Đó được đo là thời gian giữa đầu vào điều khiển của tôi cho đến khi tôi thấy thay đổi hiển thị. EDIT một thời gian sau đó: một điều cần lưu ý là điều khiển máy ảnh có khả năng là một sự kết hợp của hướng dẫn sử dụng và tự động (sự kiện gây nên). Chúng tôi cần xem những hình ảnh đó ngay lập tức, ngay cả khi nguồn cấp dữ liệu chất lượng cao được lưu trữ riêng biệt.
  • Chi phí - miễn phí/mã nguồn mở tốt hơn không miễn phí.
  • Các thông số codec có thể điều chỉnh - Tôi cần có thể điều chỉnh codec cho một số trường hợp nhất định. Đôi khi, luồng có độ phân giải thấp tốc độ cao thực sự dễ xử lý hơn.
  • "Tích hợp" với Java - có bao nhiêu vấn đề khi móc giải pháp này vào mã của tôi? Tôi có đang gửi gói dữ liệu qua ổ cắm không? Nhập URL? Cài đặt kết hợp Direct3D/JNI?
  • Windows/Linux/cả hai? - Tôi thích một giải pháp bất khả tri của hệ điều hành bởi vì tôi phải phân phối tới một số hương vị của hệ điều hành nhưng có thể có một giải pháp tối ưu cho một nhưng không phải là giải pháp khác.

LƯU Ý: Tôi biết các codec hình ảnh/video khác và đó không phải là trọng tâm của câu hỏi này. Tôi đặc biệt là không phải quan tâm đến các API phát trực tuyến (ví dụ: MPEG4) do mất độ chính xác của khung. Tuy nhiên, nếu có giải pháp cho câu hỏi của tôi cung cấp luồng dữ liệu chính xác khác, vui lòng liên hệ.

Theo dõi câu hỏi này: Tôi rất muốn mua các thiết bị như Axis video encoders thay vì hơn là cố gắng nắm bắt video trong phần mềm hoặc trên PC trực tiếp. Tuy nhiên, nếu ai đó có lựa chọn thay thế, tôi rất muốn nghe họ.

Trả lời

0

Bạn đã bao giờ xem Processing.org chưa? Về cơ bản, nó là một khung ứng dụng đơn giản để phát triển các ứng dụng "nghệ thuật" và các nền tảng máy tính vật lý, nhưng nó dựa trên Java và bạn có thể đào sâu xuống Java "thực" bên dưới. Lý do bạn cần lưu ý là có một số video libraries để xử lý về cơ bản là các thành phần Java (ít nhất tôi nghĩ chúng là - trang web có tất cả thông tin kỹ thuật bạn có thể cần). Có một tutorial về cách sử dụng các thư viện và công cụ xử lý trong IDE Eclipse. Ngoài ra còn có rất nhiều examples khi quay và xử lý video.

Thậm chí nếu bạn không thể trực tiếp sử dụng thư viện, Xử lý là một ngôn ngữ/môi trường tuyệt vời để giải quyết các thuật toán. Có một số ví dụ tuyệt vời về chụp ảnh và quay video và xử lý thời gian thực ở đó.

2

Liên quan đến dead-ness của JMF, bạn có biết về số FMJ implementation không?Tôi không biết liệu nó có đủ điều kiện là giải pháp "tốt nhất" hay không, nhưng nó có thể đáng để thêm vào cuộc thảo luận.

+0

Bản cập nhật cuối cùng có vẻ đã được khá lâu rồi: http://sourceforge.net/project/showfiles.php?group_id=161490 Một API đã chết từ năm 2007 có lẽ sẽ không giúp ích gì cho chúng tôi. Cảm ơn anyway, mặc dù. –

3

FMJ chắc chắn có thể quay video và biến nó thành khung MJPEG.

7

Việc triển khai JavaCV này hoạt động tốt.

Mã sản phẩm:

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

Cũng post on viewing live video là từ Camera .Và configuration for JavaCV :

Tôi nghĩ rằng đây sẽ đáp ứng yêu cầu của bạn.

+0

Thú vị - có bất kỳ dữ liệu nào có sẵn về thời gian chờ của bộ chọn khung không? –

+0

Tôi chưa tính toán hoặc không tìm thấy dữ liệu đó. nhưng nó có vẻ tốt. Trong video này http://www.youtube.com/watch?v=r02no-zIBnI, tôi hiển thị hình ảnh đã chụp (IplImage img = grabber.grab()) trong JFrame. – gtiwari333

0

Đây là triển khai JavaCV của tôi với đầu ra video có độ phân giải cao và không giảm đáng kể tốc độ khung hình so với các giải pháp khác (chỉ khi nào webcam của tôi lấy lại nét nhẹ, chỉ trong giây lát).

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

Dưới đây được thể hiện triển khai rất đơn giản sử dụng Marvin Framework. Sử dụng Marvin, bạn có thể dễ dàng xử lý video thời gian thực.

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

Khác example áp dụng nhiều thuật toán để xử lý video trong thời gian thực.

+0

Điều này thật thú vị - bạn có thể nói với các yêu cầu về độ trễ của tôi ở trên không? –

+0

Độ trễ sẽ tùy thuộc vào độ phân giải phần cứng, máy ảnh và video của ứng dụng của bạn. Tuy nhiên, tôi nghĩ rằng nó là khả thi. Hãy xem quá trình xử lý video thời gian thực này [demo] (http://www.youtube.com/watch?v=D5mBt0kRYvk). Nó cho thấy khuôn khổ này đang hoạt động. –