2014-01-17 28 views
0

我将基于C++ OpenCV的部分代码移植到Java OpenCV中。我使用的是由Willow Garage编写的Java包装器,即C++ OpenCV背后的组织。我没有使用javacv(托管在googlecode)。加速Java中的摄像头访问OpenCV

此代码的一部分访问摄像头的视频流并对其进行处理。使用C++,我可以实时显示摄像头视频:如果我挥动手,屏幕上的视频会显示我挥动手。使用Java,如果我挥动我的手,视频(从网络摄像头拍摄)无法保持我的速度:帧速率非常慢。

我要做的就是:

  • 我阅读使用OpenCV的网络摄像头视频的帧,它被命名为frame一个垫目标;

  • 我访问frame的字节数组并使用它来构建BufferedImage;

  • 该图像显示在其paint方法内的JPanel中。

我在OS X 10.8.5上使用java版本1.7和OpenCV 2.4.8。

您对我如何加快整个过程有何建议?

问候

+0

似乎给一些加速(而拉丝),http://answers.opencv.org/ question/18304/which-class-can-show-an-image-in-java /(看最后一条评论) – berak

+0

谢谢,但我已经在使用System.arraycopy了。 –

回答

2

试试这个,,,它将给ü更好的结果使用system.arraycopy

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.ByteArrayInputStream; 

import java.io.InputStream; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

import org.opencv.core.Core; 
import org.opencv.core.Mat; 
import org.opencv.core.MatOfByte; 
import org.opencv.highgui.Highgui; 
import org.opencv.highgui.VideoCapture; 


public class Robot extends JPanel implements Runnable { 

    static BufferedImage bufImagew = null; 
    public Robot() { 

     JFrame f=new JFrame(); 
     f.setVisible(true); 
     f.add(this); 
     f.setSize(new Dimension(640,500)); 

    } 

    @Override 
    public void run() { 

     System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
     VideoCapture camera = new VideoCapture(0); 
     // 1 for next camera 
     int i = 0; 
     try { 

      Mat frame = new Mat(); 
      while (true) { 
        camera.read(frame); 
        Mat image_tmp = frame; 

        MatOfByte matOfByte = new MatOfByte(); 
        BufferedImage bufImage = null; 

        if(image_tmp!=null) 
        Highgui.imencode(".jpg", image_tmp, matOfByte); 


        byte[] byteArray = matOfByte.toArray(); 
        try { 

         InputStream in = new ByteArrayInputStream(byteArray); 
         bufImage = ImageIO.read(in); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 


        bufImagew=bufImage; 
        this.repaint(); 
        if(i==5) 
         i=0; 
       } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    public void paintComponent(Graphics g) 
    { 
     System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
     DetectFaceDemo d=new DetectFaceDemo(); 
     try { 

     super.paintComponent(g); 
     g.drawImage(bufImagew,0,0,null); 

     } 
     catch(Exception e){} 
    } 

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

谢谢。由于我使用Willow Garage制作的OpenCV移植到Java,不幸的是我无法使用您的代码。我会修改我的问题来说明清楚。 –

+0

我已经完成了代码根据您的需要请通过这个看...我编辑了代码... @AntonioSesto –

+1

谢谢你,非常友善。我终于可以加速访问:我没有将Mat对象编码为jpg图像,而是使用Mat中的原始数据(使用在某处可能找到的代码,可能位于StackOverflow中)构建了一个BufferedImage。 –