不同平臺(tái)下載安裝搭建OpenCV + Java環(huán)境

不同平臺(tái)下載安裝搭建OpenCV + Java環(huán)境

  • macos

  • windows

  • linux

Windows平臺(tái)

太簡(jiǎn)單了盅粪,直接去官網(wǎng) https://opencv.org/releases/ 下載OpenCV 的 windows 版本举哟,安裝完筷登,就能找到j(luò)ar包和dll動(dòng)態(tài)庫(kù),然后直接看后面怎么使用吧形用。

MacOS 平臺(tái)

系統(tǒng)版本:macOS Big Sur (11.3.1)

時(shí)間:2022年2月16日,時(shí)間很重要,因?yàn)楦鞣N庫(kù)的版本都會(huì)更新,有可能在你看到這篇文章的時(shí)候缤灵,庫(kù)已經(jīng)更新了,再使用我的安裝方法的話蓝晒,可能會(huì)導(dǎo)致你安裝失敗腮出,我只能描述我是如何安裝的。

安裝需要用到的工具

Homebrew

需要使用到Homebrew工具

以下是Homebrew工具的安裝

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

我本地已經(jīng)安裝過(guò)了拔创,上面步驟不再重復(fù)

在執(zhí)行后續(xù)安裝前,可以先使用 brew update brew upgrade 進(jìn)行了升級(jí)之后富蓄,再安裝后面的依賴庫(kù)

如果Homebrew安裝失敗剩燥,那就移步百度去找Homebrew怎么安裝吧~ ^ __ ^

依賴庫(kù)

參考,但不是完全照抄立倍,我在安裝過(guò)程中灭红,也遇到了好多問(wèn)題

主要針對(duì)ffmpeg做了調(diào)整,如果默認(rèn)安裝口注,以我當(dāng)前時(shí)間变擒,安裝的這個(gè)庫(kù)版本為5,而我實(shí)際安裝的最新的OpenCV-4.5.4版本的話寝志,它使用的還是4版本娇斑,如果安裝錯(cuò)誤策添,會(huì)導(dǎo)致安裝過(guò)程中ffmpeg庫(kù)找不到某些接口

調(diào)整前

brew install gcc git cmake pkg-config ffmpeg libgphoto2 libav libjpeg libpng libtiff libdc1394 ant

調(diào)整后

brew install gcc git cmake pkg-config ffmpeg@4 libgphoto2 libav libjpeg libpng libtiff libdc1394 ant zlib

JAVA 環(huán)境

我用的是Oracle JDK 1.8u291,怎么安裝不贅述了毫缆。

?  lib Java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

OpenCV + Java 依賴環(huán)境配置

在依賴庫(kù)安裝之后唯竹,使用ant命令,檢查ant是否安裝成功苦丁,如果安裝失敗浸颓,請(qǐng)手動(dòng)安裝,傳送門(mén)旺拉。

?  lib ant -version
Apache Ant(TM) version 1.10.12 compiled on October 13 2021
環(huán)境變量配置

我這里用的是~/.zshrc文件产上,除此之外,~/.bash_profile蛾狗、~/.bashrc晋涣、/etc/profile 這些文件都可以添加環(huán)境變量,不用糾結(jié)我為什么在zshrc中添加(啟動(dòng)終端會(huì)自動(dòng)加載的環(huán)境變量配置文件)

  • export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home (改成你的即可淘太,已經(jīng)配置過(guò)忽略)

  • export PATH=$JAVA_HOME/bin:$PATH (已經(jīng)配置過(guò)可以忽略)
    ========================分割線-很重要========================

  • export JAVA_AWT_INCLUDE_PATH=$JAVA_HOME

  • export JAVA_AWT_LIBRARY=$JAVA_HOME

  • export JAVA_INCLUDE_PATH=$JAVA_HOME/indclude

  • export JAVA_INCLUDE_PATH2=$JAVA_HOME/include/darwin

  • export JAVA_JVM_LIBRARY=$JAVA_HOME
    ============================================================

分割線中間內(nèi)容姻僧,就是折磨我一天的配置,我之前一直沒(méi)有配置蒲牧,也不知道怎么配置撇贺,導(dǎo)致我安裝OpenCV之后,一直沒(méi)有找到生成的Jar包和dylib動(dòng)態(tài)庫(kù)冰抢。所以要特別感謝這位 博主 給我的啟發(fā)

配置完了保存松嘶,別忘了使用source命令重載配置,并檢查是否配置成功

echo $JAVA_INCLUDE_PATH2 // 檢查是否配置成功

如果紅色字體不配置的話挎扰,Cmake之后的結(jié)果如下:

...
--   Java:                          
--     ant:                         /usr/local/bin/ant (ver 1.10.12)
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
...

配置之后翠订,Cmake之后結(jié)果如下:

...
--   Java:                          
--     ant:                         /usr/local/bin/ant (ver 1.10.12)
--     JNI:                         /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/include /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/include/darwin /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/include
--     Java wrappers:               YES
--     Java tests:                  YES
...

就是這個(gè)差別,會(huì)影響最后到底有沒(méi)有生成Jar包和動(dòng)態(tài)庫(kù)

安裝OpenCV

Homebrew安裝

參考

brew edit opencv

In the text editor that will open, change the line -DBUILD_opencv_java=OFF to -DBUILD_opencv_java=ON, and save the file.

修改-DBUILD_opencv_java=OFF 為 -DBUILD_opencv_java=ON

brew install --build-from-source opencv

等待安裝結(jié)束

查看目錄:/usr/local/Cellar/opencv/{version}

不過(guò)這個(gè)方式我只是把庫(kù)裝好了遵倦,沒(méi)有找到對(duì)應(yīng)的jar

安裝完了我沒(méi)刪除尽超,這樣不用去配置opencv的環(huán)境了,直接就有了梧躺。

源碼安裝

去官網(wǎng) https://opencv.org/releases/ 下載OpenCV

我下載的是 OpenCV – 4.5.4 版本(4.5.5版本我試過(guò)似谁,沒(méi)成功,為什么選用4.5.4版本是因?yàn)槲覈L試過(guò))掠哥,下載完成后解壓巩踏,通過(guò)Terminal進(jìn)入到解壓后的目錄,并創(chuàng)建build目錄

cd Downloads/opencv-4.5.4
mkdir build

執(zhí)行cmake命令進(jìn)行安裝

cd Downloads/opencv-4.5.4
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=OFF -DWITH_IPP=OFF -DCMAKE_INSTALL_PREFIX={你的路徑}/opencv-4.5.4 ../


如果遇到了(表示你Cmake太多次了)
1.FATAL:In-source builds are not allowed.
You should create separate directory for build files.
解決方法:1)先刪除剛才在當(dāng)前目錄下創(chuàng)建的CMakeCache.txt文件和CMakeFIles目錄续搀;2)再新建目錄塞琼,比如build目錄,在build目錄執(zhí)行cmake.

... 開(kāi)始進(jìn)行配置/編譯

注意檢查最后:
--   Java:                          
--     ant:                         
--     JNI:                         
--     Java wrappers:               
--     Java tests:    

這后面的值有沒(méi)有禁舷,如果沒(méi)有說(shuō)明環(huán)境變量沒(méi)有配置成功

等待片刻后在當(dāng)前目錄下會(huì)出現(xiàn)一堆文件彪杉,這時(shí)使用命令

make -j 8

等待編譯完成毅往,然后進(jìn)行安裝,等待結(jié)束

make install

遇到報(bào)錯(cuò)太正常了

中間遇到了很多報(bào)錯(cuò)在讶,其中一個(gè)就是ffmpeg庫(kù)導(dǎo)致的報(bào)錯(cuò)煞抬,我去翻了百度、谷歌构哺,都沒(méi)找到很好的辦法革答,后來(lái)我就想到了時(shí)間,因?yàn)閹?kù)會(huì)更新曙强,所以残拐,很有可能是版本不同導(dǎo)致的有些東西找不到,只要環(huán)境一樣碟嘴,理論上都可以安裝成功溪食,一定要耐心一些。

為了解決ffmpeg的報(bào)錯(cuò)娜扇,我使用brew search ffmpeg去找別的版本错沃,果然發(fā)現(xiàn)了,還有別的版本雀瓢,抱著試試的態(tài)度枢析,安裝了ffmpeg@4再次make,結(jié)果這個(gè)報(bào)錯(cuò)就沒(méi)了刃麸,別提多開(kāi)心了醒叁。

后來(lái)遇到了找不到zlib包,所以我在優(yōu)化后的依賴庫(kù)中加了zlib包泊业。

再后來(lái)遇到了xxx_dnn的報(bào)錯(cuò)把沼,當(dāng)時(shí)我用的是opencv_4.5.5版本,這個(gè)死活沒(méi)辦法吁伺,后來(lái)我通過(guò)homebrew安裝了一次opencv饮睬,安裝成功了,但是沒(méi)有jar包篮奄,但是我好奇的看了一下opencv的版本捆愁,發(fā)現(xiàn)是4.5.4版本,索性我又去下載了4.5.4版本重新cmake宦搬,make牙瓢,make install一頓操作之后劫拗,居然成功安裝了间校。特別開(kāi)心,但是死活找不到j(luò)ar包页慷。

為了解決jar包沒(méi)生成的問(wèn)題憔足,才找到了上面說(shuō)的胁附,環(huán)境變量的問(wèn)題。

所以滓彰,心態(tài)要好控妻,一定別慌。我沒(méi)有任何人可以問(wèn)揭绑,只能一步一步自己弄弓候。我就是一個(gè)搞Java的,由于工作原因要用到OpenCV他匪,沒(méi)學(xué)過(guò)C++菇存,C就懂點(diǎn)皮毛,連入門(mén)都不算邦蜜,所以也走了很多很多彎路依鸥。

找Jar包和dylib動(dòng)態(tài)庫(kù)

安裝結(jié)束后,可以找到安裝目錄悼沈,找到對(duì)應(yīng)的動(dòng)態(tài)鏈接庫(kù)以及對(duì)應(yīng)的Jar文件

cd ~/Downloads/opencv-4.5.4/build/bin
能找到 opencv-454.jar 文件

cd ~/Downloads/opencv-4.5.4/build/lib
能找到 libopencv_java454.dylib 文件

至此贱迟,OpenCV的安裝結(jié)束

OpenCV環(huán)境變量配置
  1. 如果使用了Homebrew完成了OpenCV安裝,則忽略這一步

  2. 如果直接使用的源碼安裝絮供,則需要配置環(huán)境變量

  • export OPENCV_HOME={你的目錄}

  • export PATH=$OPENCV_HOME/build/bin:$PATH

別忘了source加載

? opencv_version
4.5.4

看到這個(gè)環(huán)境變量就配置成功了

IDEA + Java 使用OpenCV

必備:opencv-454.jar衣吠、libopencv_java454.dylib (在windows環(huán)境下,應(yīng)該為dll文件杯缺,在Linux環(huán)境下蒸播,應(yīng)該為.so文件)

將jar包放入項(xiàng)目根目錄./lib目錄下

1. maven項(xiàng)目引入jar包

<dependency>
    <groupId>org.opencv</groupId>
    <artifactId>opencv</artifactId>
    <version>4.5.4</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/opencv-454.jar</systemPath>
</dependency>

2. 編寫(xiě)測(cè)試類

public class OpenCVTest {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        Mat imread = Imgcodecs.imread("WechatIMG26763.jpeg");
        System.out.println(imread);
    }
}

點(diǎn)擊執(zhí)行,這個(gè)時(shí)候會(huì)報(bào)錯(cuò)萍肆,不要管

點(diǎn)開(kāi)IDEA的運(yùn)行Configurations袍榆,找到OpenCVTest選項(xiàng),添加VM參數(shù)

-Djava.library.path={你的libopencv_java454.dylib所在目錄}
例如:/Home/Users/my/Download/opencv_4.5.4/build/lib

再次點(diǎn)擊運(yùn)行:

Mat [ 873*1920*CV_8UC3, isCont=true, isSubmat=false, nativeObj=0x7fb3524176b0, dataAddr=0x7fb356aaa000 ]

至此塘揣,開(kāi)發(fā)環(huán)境搭建完成包雀。

3. 關(guān)于打包執(zhí)行問(wèn)題

參考

主要是需要把我們獨(dú)立引入的lib下的包打包到j(luò)ar中

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <includeSystemScope>true</includeSystemScope>
        <fork>true</fork>
      </configuration>
    </plugin>
  </plugins>
</build>

打包后,所有依賴包都會(huì)打包到j(luò)ar中

4. 建議把Jar包上傳至Maven倉(cāng)庫(kù)亲铡,方便正常打包使用

mvn install:install-file -Dfile={jar地址} -DgroupId=org.opencv -DartifactId=opencv-454-for-mac -Dversion4.5.4 -Dpackaging=jar

Linux 平臺(tái)

Centos 7 安裝必要依賴庫(kù)

yum install epel-release git gcc gcc-c++ cmake3 qt5-qtbase-devel \
 python python-devel python-pip cmake python-devel numpy \
 python34-numpy gtk2-devel libpng-devel jasper-devel \
 openexr-devel libwebp-devel libjpeg-turbo-devel libtiff-devel \
 libdc1394-devel tbb-devel eigen3-devel gstreamer-plugins-base-devel \
 freeglut-devel mesa-libGL mesa-libGL-devel  boost boost-thread \
 boost-devel libv4l-devel ant -y
環(huán)境變量配置

我這里用的是~/.zshrc文件才写,除此之外,~/.bash_profile奖蔓、~/.bashrc赞草、/etc/profile 這些文件都可以添加環(huán)境變量,不用糾結(jié)我為什么在zshrc中添加(啟動(dòng)終端會(huì)自動(dòng)加載的環(huán)境變量配置文件)

  • export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home (改成你的即可吆鹤,已經(jīng)配置過(guò)忽略)

  • export PATH=$JAVA_HOME/bin:$PATH (已經(jīng)配置過(guò)可以忽略)

  • export JAVA_AWT_INCLUDE_PATH=$JAVA_HOME

  • export JAVA_AWT_LIBRARY=$JAVA_HOME

  • export JAVA_INCLUDE_PATH=$JAVA_HOME/indclude

  • export JAVA_INCLUDE_PATH2=$JAVA_HOME/include/darwin

  • export JAVA_JVM_LIBRARY=$JAVA_HOME

下載源碼

去官網(wǎng) https://opencv.org/releases/ 下載OpenCV

我下載的是 OpenCV – 4.5.4 版本(4.5.5版本我試過(guò)厨疙,沒(méi)成功,為什么選用4.5.4版本是因?yàn)槲覈L試過(guò))疑务,下載完成后解壓沾凄,通過(guò)Terminal進(jìn)入到解壓后的目錄梗醇,并創(chuàng)建build目錄

cd Downloads/opencv-4.5.4
 mkdir build

執(zhí)行cmake命令進(jìn)行安裝

cd Downloads/opencv-4.5.4
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=OFF -DWITH_IPP=OFF -DCMAKE_INSTALL_PREFIX={你的路徑}/opencv-4.5.4 ../

如果遇到了(表示你Cmake太多次了)
1.FATAL:In-source builds are not allowed.
You should create separate directory for build files.
解決方法:1)先刪除剛才在當(dāng)前目錄下創(chuàng)建的CMakeCache.txt文件和CMakeFIles目錄;2)再新建目錄撒蟀,比如build目錄叙谨,在build目錄執(zhí)行cmake.

... 開(kāi)始進(jìn)行配置/編譯

注意檢查最后:
-- Java:
-- ant:
-- JNI:
-- Java wrappers:
-- Java tests:

這后面的值有沒(méi)有,如果沒(méi)有說(shuō)明環(huán)境變量沒(méi)有配置成功</pre>

等待片刻后在當(dāng)前目錄下會(huì)出現(xiàn)一堆文件保屯,這時(shí)使用命令

make -j 8

等待編譯完成手负,然后進(jìn)行安裝,等待結(jié)束

make install

代碼演示

public class SliderUnlock {
 
  static {
  System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
  }
 
  /**
  * 解析兩個(gè)圖片之間的像素距離百分比
  * @param templateUrl
  * @param imageUrl
  * @return
  */
  public static int offsetDistance(String templateUrl, String imageUrl, int webImageWidth) throws IOException {
  long currentTime = System.currentTimeMillis();
  Mat slideBgMat = backgroundHandle(saveNetImage(imageUrl, currentTime, false));
  Mat slideBlockMat = templateHandle(saveNetImage(templateUrl, currentTime, true));
 
  Mat result = new Mat();
  /*
  * matchTemplate:在模板和輸入圖像之間尋找匹配,獲得匹配結(jié)果圖像
  * result:保存匹配的結(jié)果矩陣
  * TM_CCOEFF_NORMED標(biāo)準(zhǔn)相關(guān)匹配算法
  */
  Imgproc.matchTemplate(slideBgMat, slideBlockMat, result, Imgproc.TM_CCOEFF_NORMED);
 
  /*
  反饋匹配結(jié)果
  */
  /*Point ml = new Point();
  Core.MinMaxLocResult mmlr = Core.minMaxLoc(result);
  ml = mmlr.maxLoc;
  Imgproc.rectangle(slideBgMat, ml,
  new Point(ml.x + slideBlockMat.cols(), ml.y + slideBlockMat.rows()),
  new Scalar(0, 0, 0, 0));
  new ImageViewer(slideBgMat).imshow();
  System.out.println(slideBgMat.width());*/
  /*
  * minMaxLoc:在給定的結(jié)果矩陣中尋找最大和最小值姑尺,并給出它們的位置
  * maxLoc最大值
  */
  Point matchLocation = Core.minMaxLoc(result).maxLoc;
  // 返回匹配點(diǎn)的橫向距離 / 原圖寬度虫溜,得到偏移量,把結(jié)果再乘以頁(yè)面上的圖片寬度就得到了偏移像素了股缸。
  return (int) Math.round(matchLocation.x * webImageWidth / slideBgMat.width());
  }
 
  /**
  * 匹配滑塊處理
  * @param filePath
  * @return
  */
  private static Mat templateHandle(String filePath) {
  Mat slidBlockMat = Imgcodecs.imread(filePath);
  // 刪除圖片
  new File(filePath).delete();
  // 1衡楞。 灰度
  Imgproc.cvtColor(slidBlockMat, slidBlockMat, Imgproc.COLOR_BGR2GRAY);
  // 2\. 去除周圍黑邊
  for (int row = 0; row < slidBlockMat.height(); row++) {
  for (int col = 0; col < slidBlockMat.width(); col++) {
  if (slidBlockMat.get(row, col)[0] == 0) {
  slidBlockMat.put(row, col, 96);
  }
  }
  }
  // 3\. inRange二值化轉(zhuǎn)黑白圖
  Core.inRange(slidBlockMat, Scalar.all(96), Scalar.all(96), slidBlockMat);
  return slidBlockMat;
  }
 
  /**
  * 背景圖處理
  * @param filePath
  * @return
  */
  private static Mat backgroundHandle(String filePath) {
  Mat slideBgMat = Imgcodecs.imread(filePath);
  // 刪除圖片
  new File(filePath).delete();
  // 1\. 灰度化圖片
  Imgproc.cvtColor(slideBgMat, slideBgMat, Imgproc.COLOR_BGR2GRAY);
  // 2\. 二值化
  Imgproc.threshold(slideBgMat, slideBgMat, 127, 255, Imgproc.THRESH_BINARY);
  return slideBgMat;
  }
 
  /**
  * 保存網(wǎng)絡(luò)上的圖片至本地
  * @param url 圖片地址
  * @param currentTime 當(dāng)前時(shí)間,作為文件名
  * @param isTemplate 是否是模板敦姻, 如果是則會(huì)添加template作為結(jié)尾
  * @return
  */
  private static String saveNetImage(String url, long currentTime, boolean isTemplate) throws IOException {
  BufferedImage buffer = ImageIO.read(new URL(url));
  String fileName = isTemplate ? currentTime + "_template.png" : currentTime + ".jpeg";
  File file = new File("/tmp/" + fileName);
  String absolutePath = file.getAbsolutePath();
  ImageIO.write(buffer, isTemplate ? "png" : "jpeg", new FileImageOutputStream(file));
  return absolutePath;
  }
 
  /**
  * 讀取圖片
  * @param filePath
  * @return
  */
  private static Mat readImage(String filePath) {
  return Imgcodecs.imread(filePath, Imgcodecs.IMREAD_UNCHANGED);
  }
 //
 //    public static void main(String[] args) throws IOException {
 ////        Mat imread = Imgcodecs.imread("/Users/wuyujia/Desktop/WechatIMG26763.jpeg");
 ////        System.out.println(imread);
 ////        saveNetImage("https://p9-catpcha.byteimg.com/tos-cn-i-188rlo5p4y/52642779215b43f0aa8b00add6156bcd~tplv-188rlo5p4y-2.jpeg",
 ////                System.currentTimeMillis(), false);
 ////        String path = saveNetImage("https://p9-catpcha.byteimg.com/tos-cn-i-188rlo5p4y/159aa92eae634f6d8221f213b7d2d87e~tplv-188rlo5p4y-1.png",
 ////                System.currentTimeMillis(), true);
 ////        System.out.println(path);
 //        String templateUrl = "https://p9-catpcha.byteimg.com/tos-cn-i-188rlo5p4y/a4b1042da716481cbac0df6a2e98cec3~tplv-188rlo5p4y-1.png";
 //        String imageUrl = "https://p9-catpcha.byteimg.com/tos-cn-i-188rlo5p4y/d9584766ad204220a1c86c7b2085bac5~tplv-188rlo5p4y-2.jpeg";
 //        double x = offsetDistance(templateUrl, imageUrl);
 //        System.out.println(x);
 ////        Mat mat = backgroundHandle(saveNetImage(imageUrl, System.currentTimeMillis(), false));
 ////        new ImageViewer(mat).imshow();
 //    }
 package org.spiderflow.custom.utils.opencv;
 
 import org.opencv.core.Mat;
 
 import javax.swing.*;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.awt.image.DataBufferByte;
 
 /**
  * Created by kofee on 2016/3/28.
  */
 public class ImageViewer {
  private JLabel imageView;
 
  private Mat image;
  private String windowName;
 
  /**
  * 如果使用junit測(cè)試時(shí)調(diào)用該方法瘾境,圖像會(huì)一閃而過(guò),可通過(guò)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;
  }
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镰惦,一起剝皮案震驚了整個(gè)濱河市迷守,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旺入,老刑警劉巖兑凿,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茵瘾,居然都是意外死亡礼华,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)拗秘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)圣絮,“玉大人,你說(shuō)我怎么就攤上這事雕旨“缃常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵凡涩,是天一觀的道長(zhǎng)棒搜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)活箕,這世上最難降的妖魔是什么力麸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上末盔,老公的妹妹穿的比我還像新娘。我一直安慰自己座慰,他們只是感情好陨舱,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著版仔,像睡著了一般游盲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛮粮,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天益缎,我揣著相機(jī)與錄音,去河邊找鬼然想。 笑死莺奔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的变泄。 我是一名探鬼主播令哟,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼妨蛹!你這毒婦竟也來(lái)了屏富?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛙卤,失蹤者是張志新(化名)和其女友劉穎狠半,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體颤难,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡神年,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了行嗤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘤袖。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昂验,靈堂內(nèi)的尸體忽然破棺而出捂敌,到底是詐尸還是另有隱情,我是刑警寧澤既琴,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布占婉,位于F島的核電站,受9級(jí)特大地震影響甫恩,放射性物質(zhì)發(fā)生泄漏逆济。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奖慌。 院中可真熱鬧抛虫,春花似錦、人聲如沸简僧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岛马。三九已至棉姐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啦逆,已是汗流浹背伞矩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夏志,地道東北人乃坤。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沟蔑,于是被迫代替她去往敵國(guó)和親侥袜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361