[Mac] OpenCV4.0 + Java , IDE Eclipse 相關設定 (linux) ,ant ,cmake, 環境變數,範例.人臉辨識

筆記一下,要在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);
	}
	
}




網路找到這張圖片當作範例(若需要移除請告知,謝謝)

執行完後結果,紅色框就是辨識出來,有些可能側臉所以沒辨識到