2014-01-17 3 views
0

C++ OpenCV 기반 코드의 일부를 Java OpenCV로 이식하고 있습니다. Willow Garage가 준비한 Java 래퍼 즉, C++ OpenCV 뒤에있는 그룹을 사용하고 있습니다. javacv (googlecode에서 호스팅)를 사용하지 않습니다.Java OpenCV에서 웹캠 액세스 속도 향상

이 코드의 일부는 웹캠의 비디오 스트림에 액세스하여 처리합니다. C++을 사용하면 웹캠 비디오를 '실시간'으로 보여줄 수 있습니다. 손을 흔들면 화면의 비디오가 손을 흔들며 나옵니다. 자바를 사용하면 손을 흔들어 비디오 (웹캠에서 가져옴)가 내 페이스를 유지할 수 없습니다. 프레임 속도는 엄청나게 느립니다.

내가 할 것은 : 내가 OpenCV의를 사용하여 웹캠 비디오의 프레임을 읽을

  • , 그것은 frame라는 매트 개체입니다;

  • frame의 바이트 배열에 액세스하여이를 사용하여 BufferedImage;

  • 이미지는 paint 방법 안에 JPanel으로 표시됩니다.

OS X 10.8.5에서 Java 버전 1.7 및 OpenCV 2.4.8을 사용하고 있습니다.

전체 프로세스 속도를 향상시킬 수있는 방법에 대한 의견이 있으십니까?

감사

+0

약간의 속도 향상 (동안 도면), http://answers.opencv.org/을 줄 것으로 보인다 질문/18304/which-class-can-show-image-in-java/(마지막 코멘트를 보시오.) – berak

+0

고마워,하지만 이미 System.arraycopy를 사용할 수있다. –

답변

2

이 시도 ,,,이 U 더 나은 결과를 줄 것이다 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

감사합니다. Java OpenCV 포팅을 Willow Garage에서 만든 Java로 사용하고 있기 때문에 불행히도 코드를 사용할 수 없습니다. 이 질문을 명확하게하기 위해 질문을 수정하겠습니다. –

+0

나는 당신의 필요에 따라이 코드를 보았습니다 ... 코드를 편집했습니다 ... @AntonioSesto –

+1

감사합니다. 매우 친절합니다. 마침내 액세스 속도를 높일 수있었습니다. Mat 객체를 jpg 이미지로 인코딩하지 않았지만 Mat의 원시 데이터를 사용하여 BufferedImage를 만들었습니다 (코드를 사용하여 StackOverflow에있는 코드를 사용하여). –