2014-01-17 53 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。 –