java - 加快 Java OpenCV 中网络摄像头的访问速度

标签 java opencv video

我正在将部分基于 C++ OpenCV 的代码移植到 Java OpenCV。我正在使用 Willow Garage 准备的 Java 包装器,即 c++ OpenCV 背后的团队。我没有使用 javacv(托管在 googlecode)。

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

我所做的是:

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

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

  • 图像显示在 JPanelpaint 方法中。

我在 OS X 10.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();
    }
}

关于java - 加快 Java OpenCV 中网络摄像头的访问速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21181795/

相关文章:

c++ - 在图像中查找相似(大)图案

matlab - 为什么 cv.findChessboardCorners 不适合我?

video - 如何根据 FFMpeg 编码命令或输出确定 AV1 文件的正确 HTML5 视频编解码器属性?

c# - 在 .net 中使用 FFmpeg?

audio - ffmpeg concat vidoes 找不到流 1 的编解码器参数

c# - 为接口(interface)使用 'I' 前缀或不使用

java - OpenCV Java : Matlab code to Java equivalency

Java - 在断言中调用函数时无法进入函数

java - 除 BigDecimal 值 : java. lang.ArithmeticException 时出错:非终止十进制扩展;没有精确可表示的十进制结果

java - Glide - 应用程序因另一个 Activity 中的上下文错误而崩溃