微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果通过nu.pattern.OpenCV.loadShared加载了openCV,则Java open CV会在VideoCapture上挂起文件

如何解决如果通过nu.pattern.OpenCV.loadShared加载了openCV,则Java open CV会在VideoCapture上挂起文件

我有一个来自https://ratiler.wordpress.com/2014/09/08/detection-de-mouvement-avec-javacv/的示例代码,与使用nu.pattern.OpenCV.loadShared();将打开的cv库加载到静态块中的差别很小:

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
import org.opencv.imgproc.Imgproc;

public class JavaCVPrjt01 {
    static {
        //System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        nu.pattern.OpenCV.loadShared();
    }
    public static void main(String[] args) {
        JFrame jframe = new JFrame("HUMAN MOTION DETECTOR FPS");
        jframe.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        JLabel vidpanel = new JLabel();
        jframe.setContentPane(vidpanel);
        jframe.setSize(1280,720) ;
        jframe.setVisible(true);

        Mat frame = new Mat();
        Mat outerBox = new Mat();
        Size sz = new Size(1280,720);
        VideoCapture camera = new VideoCapture("D:/Downloads/video4.mp4");

        while (true) {
            if (camera.read(frame)) {
                Imgproc.resize(frame,frame,sz );
                outerBox = new Mat(frame.size(),CvType.CV_8UC1);
                Imgproc.cvtColor(frame,outerBox,Imgproc.COLOR_BGR2GRAY);
                Imgproc.GaussianBlur(outerBox,new Size(3,3),0);

                ImageIcon image = new ImageIcon(Mat2bufferedImage(outerBox));
                vidpanel.setIcon(image);
                vidpanel.repaint();

            }
        }
    }

    public static BufferedImage Mat2bufferedImage(Mat image) {
        MatOfByte bytemat = new MatOfByte();
        Imgcodecs.imencode(".jpg",image,bytemat);
        byte[] bytes = bytemat.toArray();
        InputStream in = new ByteArrayInputStream(bytes);
        BufferedImage img = null;
        try {
            img = ImageIO.read(in);
        } catch (IOException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        }
        return img;
    }

}

,当然,还添加了所需的依赖项:

    <dependency>
        <groupId>org.bytedeco.javacpp-presets</groupId>
        <artifactId>opencv</artifactId>
        <version>3.2.0-1.3</version>
    </dependency>

    <dependency>
        <groupId>org.openpnp</groupId>
        <artifactId>opencv</artifactId>
        <version>3.2.0-1</version>
    </dependency>

因此,代码是在执行之前

VideoCapture camera = new VideoCapture("D:/Downloads/video4.mp4");

它挂在什么地方,我不知道那里的JNI级别有什么问题。

解决方法

这是一个许可问题,因此无法将ffmpeg包括在内

 <dependency>
    <groupId>org.openpnp</groupId>
    <artifactId>opencv</artifactId>
    <version>3.2.0-1</version>
</dependency>

(它似乎发生在所有版本中,我都尝试过maven中的所有可用功能)

https://github.com/openpnp/opencv/issues/55

UPD。

因此仍然需要显式加载dll。就我而言

static {
        //System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        System.load("D:\\Downloads\\opencv\\build\\java\\x64\\opencv_java2411.dll");
        System.load("D:\\Downloads\\opencv\\build\\x64\\vc12\\bin\\opencv_ffmpeg2411_64.dll");     
    }

opencv_javaopencv_ffmpeg的显式负载可以解决问题。在没有显式加载opencv_ffmpeg的情况下,VideoCapture's .read(frame)总是返回false,而未提及任何丢失的本机ffmpeg依赖性问题。

pom.xml中必需的java依赖项是:

    <dependency>
        <groupId>org.bytedeco.javacpp-presets</groupId>
        <artifactId>opencv</artifactId>
        <version>2.4.11-0.11</version>
    </dependency>
    <dependency>
        <groupId>org.openpnp</groupId>
        <artifactId>opencv</artifactId>
        <version>2.4.11-2</version>
    </dependency>

(请问我是否已将opencv版本降级了)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。