Mac+OpenCV+IntelliJ+JAVA環(huán)境搭建

前言

OpenCV是一個流行的,開源的,底層由C++寫的圖形圖像處理庫。眾所周知C++的學習成本是很高的,作者雖然也用C++實現(xiàn)了行駛證判斷工程,但希望通過我們所熟悉的Java來編寫上層,調(diào)用中間件JNI,然后再使用底層C++庫。如圖架構(gòu)


image.png

好,廢話不多講,直接配置環(huán)境。

配置步驟

一.安裝IntelliJ
國內(nèi)有很多破解版本的鏈接可以使用,目前最新破解版15.0.2

二.安裝MacPorts
作者Mac下裝有HomeBrew,也確實用它安裝過C++版本的。但是裝Java版本的遇到問題,
就是-with java命令提示不存在,未找到解決辦法,
所以用了同類產(chǎn)品,但是它下載很慢,作者用了4個小時,
主要它要下載相關(guān)的所有依賴,而不是使用系統(tǒng)里已經(jīng)有的,
這一點也是優(yōu)點,因為不依賴系統(tǒng),HomeBrew則不同,比如你無意刪掉其中一個依賴,恐怕就影響使用了。
安裝MacPorts需要Xcode環(huán)境,如何安裝請參考MacPorts官網(wǎng),并配置環(huán)境變量。
如果不懂,則可以鍵入到MacPorts的安裝目錄下使用下面命令。實在不會操作,再給作者留言。
鍵入命令
sudo port install opencv +java
它下載后的opencv放在了文件夾
/opt/local/share/OpenCV
并且你會看到一個java文件夾里面有2個文件分別是(以3.2.0版本為例)
libopencv_java320.dylib
opencv-320.jar
前者是動態(tài)鏈接庫,JNI 在Windows上結(jié)尾就是.dll咯
后者是jar包
這兩個包對接下來配置是至關(guān)重要的,你只要記住路徑就可以了。路徑再打一遍
/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展示,然后本文結(jié)束
配置編譯
配置啟動

給出測試例子,注意自己創(chuàng)建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測試時調(diào)用該方法,圖像會一閃而過,可通過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);// 用戶點擊窗口關(guān)閉
    }

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

全文完結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容