美文网首页图像识别程序员
Mac+OpenCV+IntelliJ+JAVA环境搭建

Mac+OpenCV+IntelliJ+JAVA环境搭建

作者: 热血沸腾 | 来源:发表于2017-08-18 10:49 被阅读1102次

前言

OpenCV是一个流行的,开源的,底层由C++写的图形图像处理库。众所周知C++的学习成本是很高的,作者虽然也用C++实现了行驶证判断工程,但希望通过我们所熟悉的Java来编写上层,调用中间件JNI,然后再使用底层C++库。如图架构


image.png

好,废话不多讲,直接配置环境。

配置步骤

一.安装IntelliJ
国内有很多破解版本的链接可以使用,目前最新破解版15.0.2

二.安装MacPorts
作者Mac下装有HomeBrew,也确实用它安装过C++版本的。但是装Java版本的遇到问题,
就是-with java命令提示不存在,未找到解决办法,
所以用了同类产品,但是它下载很慢,作者用了4个小时,
主要它要下载相关的所有依赖,而不是使用系统里已经有的,
这一点也是优点,因为不依赖系统,HomeBrew则不同,比如你无意删掉其中一个依赖,恐怕就影响使用了。
安装MacPorts需要Xcode环境,如何安装请参考MacPorts官网,并配置环境变量。
如果不懂,则可以键入到MacPorts的安装目录下使用下面命令。实在不会操作,再给作者留言。
键入命令
sudo port install opencv +java
它下载后的opencv放在了文件夹
/opt/local/share/OpenCV
并且你会看到一个java文件夹里面有2个文件分别是(以3.2.0版本为例)
libopencv_java320.dylib
opencv-320.jar
前者是动态链接库,JNI 在Windows上结尾就是.dll咯
后者是jar包
这两个包对接下来配置是至关重要的,你只要记住路径就可以了。路径再打一遍
/opt/local/share/OpenCV/java/libopencv_java320.dylib
/opt/local/share/OpenCV/java/opencv-320.jar

接下来启动IntellJ进行配置
1.添加 opencv-320.jar
2.添加依赖libopencv_java320.dylib

-Djava.library.path=/opt/local/share/OpenCV/java

分别为图1和图2展示,然后本文结束
配置编译 配置启动

给出测试例子,注意自己创建resources目录,放一张图片。该例子是加载并展示一张图,源码为:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

public class Main {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);//很重要
    }

    public static void main(String[] args) {

        Mat mat = Imgcodecs.imread("./resources/test.jpg");
        ImageViewer viewer = new ImageViewer(mat);
        viewer.imshow();

    }
}

对了,在Java中没有方便的通过 imShow()来展示一张图,所以封装了一个ImageViewer类,源码如下:

import org.opencv.core.Mat;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

public class ImageViewer {
    private JLabel imageView;

    private Mat image;
    private String windowName;

    /**
     * 如果使用junit测试时调用该方法,图像会一闪而过,可通过sleep()等方式暂时显示
     *
     * @param
     */

    public ImageViewer(Mat image) {
        this.image = image;
    }


    /**
     * @param image      要显示的mat
     * @param windowName 窗口标题
     */
    public ImageViewer(Mat image, String windowName) {
        this.image = image;
        this.windowName = windowName;
    }

    /**
     * 图片显示
     */
    public void imshow() {
        setSystemLookAndFeel();
        Image loadedImage = toBufferedImage(image);
        JFrame frame = createJFrame(windowName, image.width(), image.height());
        imageView.setIcon(new ImageIcon(loadedImage));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 用户点击窗口关闭
    }

    private void setSystemLookAndFeel() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
    }

    private JFrame createJFrame(String windowName, int width, int height) {
        JFrame frame = new JFrame(windowName);
        imageView = new JLabel();
        final JScrollPane imageScrollPane = new JScrollPane(imageView);
        imageScrollPane.setPreferredSize(new Dimension(width, height));
        frame.add(imageScrollPane, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        return frame;
    }


    private Image toBufferedImage(Mat matrix) {
        int type = BufferedImage.TYPE_BYTE_GRAY;
        if (matrix.channels() > 1) {
            type = BufferedImage.TYPE_3BYTE_BGR;
        }
        int bufferSize = matrix.channels() * matrix.cols() * matrix.rows();
        byte[] buffer = new byte[bufferSize];
        matrix.get(0, 0, buffer); // 获取所有的像素点
        BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type);
        final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
        System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);
        return image;
    }

全文完结

相关文章

  • Mac+OpenCV+IntelliJ+JAVA环境搭建

    前言 OpenCV是一个流行的,开源的,底层由C++写的图形图像处理库。众所周知C++的学习成本是很高的,作者虽然...

  • React Native学习总结篇

    一、环境搭建 1.1 React Native环境搭建 1.1.1 IOS环境搭建 环境:MacOS 注意:不要使...

  • linux 第四天

    Lamp环境搭建 /*******************Lamp环境搭建:*******************...

  • codePush说明

    codePush环境搭建 环境搭建文章:环境搭建 git地址:codePush git地址2.0.3,And...

  • angular学习--02英雄指南

    环境搭建 angular官网--搭建本地开发环境和工作空间windows 10 搭建angular开发环境免搭建环...

  • Gradle开发-Groovy环境搭建

    ##Groovy环境搭建 在使用 Groovy 之前首先要搭建几个环境: Groovy 的环境搭建 JDK 环境搭...

  • 搭建 LNMP + CodeIgniter 开发环境

    搭建 LNMP + CodeIgniter 开发环境搭建 LNMP 环境首先搭建 LNMP 的服务器环境安装 Ng...

  • iOS中RN与Flutter混合开发

    一 搭建环境 1. 搭建flutter环境 1.1 搭建系统开发环境 参考链接:https://flutter....

  • 第一个MyBatis程序

    思路:搭建环境---导入MyBatis--编写代码---测试! 一、搭建环境 1、搭建数据库环境: engine=...

  • Robot Framework用法总结

    一,环境的搭建 关于robotframework环境搭建请参考博文:Robot Framework的环境搭建[ht...

网友评论

  • 一杯茶一本书:你好,想咨询一下mac下能否编译出so的库呢 谢谢!
    热血沸腾:@一杯茶一本书 应该是可以的,我没试过。
  • be02398a57d6:作者你好,之前因为某些原因删掉了macports,现在重新安装的时候出现错误Failed to build db48: command execution failed,请问有什么解决办法吗?
    热血沸腾:@传说中的骚年A 因为错误我没遇到过。所以这些解决方案,也是我通过搜索找到的。仅供参考https://blog.csdn.net/logcabin/article/details/7458486
    be02398a57d6:@热血沸腾 感谢回复,我在输入sudo port install opencv +java后开始安装,出现db48报错,再输入sudo port clean db48后显示Warning: xcodebuild exists but failed to execute
    ---> Cleaning db48,之后再次输入sudo port install opencv +java,依旧出现db48报错。
    热血沸腾:先卸载掉,执行
    sudo port clean db48
  • be02398a57d6:你好,我在配置opencv环境的时候按照你的方法,输入sudo port install opencv+java后提示port opencv+java not found,然后我输入sudo port install opencv安装结束后在idea中无法找到后缀为jar和dylib的两个文件,请问是哪里做错了吗?
    热血沸腾:必须要键入 “ +java “ 的安装,这样才会主动编译出支持Java的库. 你才可以找到那两个文件。 因为opencv不仅提供了Java支持的,还有Python等等
    热血沸腾:@当凹遇上凸 谢谢提醒,复制粘贴到MarkDown上不知道为什么空格丢掉了。
    cd002734b69a:应该是输入sudo port opencv +java,中间有个空格的

本文标题:Mac+OpenCV+IntelliJ+JAVA环境搭建

本文链接:https://www.haomeiwen.com/subject/invorxtx.html