筆記一下,要在Mac 使用OpenCV 有一些步驟
後面會有一個網路參考的人臉辨識範例
首先到OpenCV 官網 https://opencv.org/
https://opencv.org/opencv-4-0-0.html
我使用 4.0 當範例,下載Sources 包,抓回來後解壓縮,裡面一堆東西,先不管
要在Java 使用openCV,必須要將原本的source 打包過,才能變成java 可以用的jar 檔
我是參考網路用 cmake 的方式打包
https://cmake.org/ 到官網抓下來安裝後,設定環境變數
touch ~/.bash_profile; open ~/.bash_profile
# 在 bash_profile內加上環境變數
# Add Cmake Root to Path
export CMAKE_ROOT=/Applications/CMake.app/Contents/bin/
export PATH=$CMAKE_ROOT:$PATH
source .bash_profile
設定好後,輸入 cmake --version 看看是否有跑出版本,看到代表成功
WUNTWCEML103:Downloads leeray$ cmake --version
cmake version 3.14.0-rc4
CMake suite maintained and supported by Kitware (kitware.com/cmake).
還需要安裝 ant 編譯才會成功
我使用Homebrew 來安裝
brew install ant
安裝完成後,到openCV目錄下,新增一個文件並執行命令
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
結束後會看到一些本機的資訊,例如剛安裝的ant
結束後在執行
make -j8
需要一段時間,結束後會在bin 下看到 opencv-400.jar
.../opencv-4.0.0/release/bin
到這邊本機的設定差不多結束,接著可以開始Eclipse 的設定
新增一個Java專案
接著到偏好設定
Java -> Build Path -> User Libraries -> New 一個 Libraries 名稱可以自己取
jar 檔,就選bin 下那個 opencv-400jar
然後 Native 要選擇 release 下的 lib 路徑
第一個範例:hello openCV
package openCV;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
public class HelloOpenCV {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat mat = Mat.eye( 3, 5, CvType.CV_8UC1 );
System.out.println( "mat = " + mat.dump() );
}
}
執行完結果,看到這裡代表成功,可以開始玩其他東西了,下面有一個圖片辨識人臉的範例
package openCV;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
public class FaceCheck {
static {
// Java 在使用 OpenCV 前必须加载 Core.NATIVE_LIBRARY_NAME 類別,否則會報錯
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
face();
}
/**
* OpenCV-4.0.0 人臉辨識
* @return: void
* @date: 2019年3月14日
*/
public static void face() {
// 1 讀取 OpenCV自带的人臉辨識特征XML文件
//OpenCV 圖像識別庫一般位于 opencv\sources\data 下面
CascadeClassifier facebook=new CascadeClassifier("/Users/leeray/Downloads/opencv-4.0.0/data/haarcascades/haarcascade_frontalface_alt.xml");
// 2 讀取測試圖片
//Mat image=Imgcodecs.imread("/Users/leeray/Downloads/20190124141937514.png");
Mat image=Imgcodecs.imread("/Users/leeray/Downloads/aaa.jpg");
// 2-1 確認圖片是否有抓到
System.out.println("image="+image.empty());
// 3 特征匹配
MatOfRect face = new MatOfRect();
facebook.detectMultiScale(image, face);
// 4 匹配 Rect 矩阵 数组
Rect[] rects=face.toArray();
System.out.println("匹配到 "+rects.length+" 个人脸");
// 5 為每張識別到的人臉畫一个圈
for (int i = 0; i < rects.length; i++) {
Imgproc.rectangle(image,
new Point(rects[i].x, rects[i].y),
new Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height),
new Scalar(0, 0, 255));
//方格加上文字
//Imgproc.putText(image,"Human", new Point(rects[i].x, rects[i].y),Imgproc.FONT_HERSHEY_SCRIPT_SIMPLEX, 1.0, new Scalar(0, 255, 0),1,Imgproc.LINE_AA,false);
Mat dst = image.submat(rects[i]);
//模糊化(可先拿掉)
Imgproc.GaussianBlur(dst, dst, new Size(5, 5), 1);
}
// 6 展示圖片
HighGui.imshow("圖片Title", image);
HighGui.waitKey(0);
}
}
網路找到這張圖片當作範例(若需要移除請告知,謝謝)
執行完後結果,紅色框就是辨識出來,有些可能側臉所以沒辨識到