在Java OpenCV中加速网络摄像头访问 我将我的C++ OpenCV代码的一部分移植到java OpenCV中。我使用的是WraveCuto编写的java包装,即C++背后的OpenCV组。我没有使用javacv(托管在谷歌代码上)

在Java OpenCV中加速网络摄像头访问 我将我的C++ OpenCV代码的一部分移植到java OpenCV中。我使用的是WraveCuto编写的java包装,即C++背后的OpenCV组。我没有使用javacv(托管在谷歌代码上),java,opencv,video,Java,Opencv,Video,部分代码访问网络摄像头的视频流并对其进行处理。用C++我可以在实时显示网络摄像头视频:如果我挥挥手,屏幕上的视频显示我挥手。使用Java,如果我挥手,视频(从网络摄像头拍摄)就无法跟上我的节奏:帧速率非常慢 我所做的是: 我使用OpenCV读取网络摄像头视频的帧,它是一个名为frame的Mat对象 我访问帧的字节数组,并使用它构建缓冲区图像 图像显示在其paint方法内的JPanel中 我在OSX10.8.5上使用java版本1.7和OpenCV 2.4.8 你对我如何加快整个过程有什么建议

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

我所做的是:

  • 我使用OpenCV读取网络摄像头视频的帧,它是一个名为
    frame
    的Mat对象

  • 我访问
    帧的字节数组
    ,并使用它构建
    缓冲区图像

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

我在OSX10.8.5上使用java版本1.7和OpenCV 2.4.8

你对我如何加快整个过程有什么建议吗


试试这个,它会给你更好的结果

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

非常感谢。由于我使用的是Willow Garage制作的OpenCV到Java的移植,不幸的是我无法使用您的代码。我将修改我的问题,以明确这一点。我已经做了根据您的需要,请通过这个代码查看。。。我已经编辑了代码@谢谢你,非常感谢。我终于能够加快访问速度:我没有将Mat对象编码为jpg图像,而是使用Mat中的原始数据构建了一个BuffereImage(使用在某处找到的代码,可能在StackOverflow上找到)。使用system.arraycopy似乎可以提供一些加速(在绘图时),(查看最后的注释)谢谢,但我已经尽可能使用System.arraycopy。