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

前言

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


image.png

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

配置步驟

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

二.安裝MacPorts
作者M(jìn)ac下裝有HomeBrew簇捍,也確實(shí)用它安裝過C++版本的只壳。但是裝Java版本的遇到問題,
就是-with java命令提示不存在暑塑,未找到解決辦法吼句,
所以用了同類產(chǎn)品,但是它下載很慢事格,作者用了4個(gè)小時(shí)惕艳,
主要它要下載相關(guān)的所有依賴,而不是使用系統(tǒng)里已經(jīng)有的分蓖,
這一點(diǎn)也是優(yōu)點(diǎn)尔艇,因?yàn)椴灰蕾囅到y(tǒng),HomeBrew則不同么鹤,比如你無意刪掉其中一個(gè)依賴终娃,恐怕就影響使用了。
安裝MacPorts需要Xcode環(huán)境蒸甜,如何安裝請(qǐng)參考MacPorts官網(wǎng)棠耕,并配置環(huán)境變量。
如果不懂柠新,則可以鍵入到MacPorts的安裝目錄下使用下面命令窍荧。實(shí)在不會(huì)操作,再給作者留言恨憎。
鍵入命令
sudo port install opencv +java
它下載后的opencv放在了文件夾
/opt/local/share/OpenCV
并且你會(huì)看到一個(gè)java文件夾里面有2個(gè)文件分別是(以3.2.0版本為例)
libopencv_java320.dylib
opencv-320.jar
前者是動(dòng)態(tài)鏈接庫(kù)蕊退,JNI 在Windows上結(jié)尾就是.dll咯
后者是jar包
這兩個(gè)包對(duì)接下來配置是至關(guān)重要的,你只要記住路徑就可以了憔恳。路徑再打一遍
/opt/local/share/OpenCV/java/libopencv_java320.dylib
/opt/local/share/OpenCV/java/opencv-320.jar

接下來啟動(dòng)IntellJ進(jìn)行配置
1.添加 opencv-320.jar
2.添加依賴libopencv_java320.dylib

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

分別為圖1和圖2展示瓤荔,然后本文結(jié)束
配置編譯
配置啟動(dòng)

給出測(cè)試?yán)樱⒁庾约簞?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();

    }
}

對(duì)了程梦,在Java中沒有方便的通過 imShow()來展示一張圖点把,所以封裝了一個(gè)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測(cè)試時(shí)調(diào)用該方法屿附,圖像會(huì)一閃而過郎逃,可通過sleep()等方式暫時(shí)顯示
     *
     * @param
     */

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


    /**
     * @param image      要顯示的mat
     * @param windowName 窗口標(biāo)題
     */
    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);// 用戶點(diǎn)擊窗口關(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); // 獲取所有的像素點(diǎn)
        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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挺份,隨后出現(xiàn)的幾起案子衣厘,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件影暴,死亡現(xiàn)場(chǎng)離奇詭異错邦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)型宙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門撬呢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妆兑,你說我怎么就攤上這事魂拦。” “怎么了搁嗓?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵芯勘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我腺逛,道長(zhǎng)荷愕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任棍矛,我火速辦了婚禮安疗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘够委。我一直安慰自己荐类,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布茁帽。 她就那樣靜靜地躺著玉罐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潘拨。 梳的紋絲不亂的頭發(fā)上厌小,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音战秋,去河邊找鬼。 笑死讨韭,一個(gè)胖子當(dāng)著我的面吹牛脂信,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播透硝,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狰闪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了濒生?” 一聲冷哼從身側(cè)響起埋泵,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后丽声,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體礁蔗,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年雁社,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浴井。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霉撵,死狀恐怖磺浙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情徒坡,我是刑警寧澤撕氧,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站喇完,受9級(jí)特大地震影響伦泥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜何暮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一奄喂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧海洼,春花似錦跨新、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至是整,卻和暖如春肖揣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浮入。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工龙优, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人事秀。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓彤断,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親易迹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宰衙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容