OpenCV+Java做人臉識別

安裝及配置

1.首先安裝OpenCV

https://opencv.org/releases.html

這裏我下載的是Windows版的3.4.5

然後安裝即可……

2.Eclipse配置OpenCV

Window->Preferences->Java->User Libraries

New輸入你的Libraries名

這裏我的安裝目錄是D:\OpenCV,所以是:

然後引入dll,我是64位機子,所以是:

Ok,下面創建Java項目做Java與OpenCV的人臉識別~

人臉識別

創建項目後首先右擊選擇Properties

然後引入即可……

引入haarcascade_frontalface_alt.xml這個xml文件:

我的pom文件如下:

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>


		<dependency>
			<groupId>org.bytedeco.javacpp-presets</groupId>
			<artifactId>ffmpeg</artifactId>
			<version>3.1.2-1.2</version>
		</dependency>
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>javacv</artifactId>
			<version>1.4.1</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/ffmpeg-platform -->
		<dependency>
			<groupId>org.bytedeco.javacpp-presets</groupId>
			<artifactId>ffmpeg-platform</artifactId>
			<version>3.4.2-1.4.1</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>


		<!-- 視頻攝像頭 -->
		<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>javacv-platform</artifactId>
			<version>1.4.1</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
		<dependency>
			<groupId>org.bytedeco.javacpp-presets</groupId>
			<artifactId>opencv-platform</artifactId>
			<version>3.4.1-1.4.1</version>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

修改我的端口號:

server.port=8889

最後代碼如下:



import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
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.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/* 
* @author zzf 
* @date 2019年1月17日 下午12:04:45 
*/
@RestController
public class OpenCVController {

	@Value("classpath:haarcascade_frontalface_alt.xml")
	private Resource xml;
	
	@PostMapping("/face")
	public void FaceDetector(HttpServletResponse response,MultipartFile file) throws IOException {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		System.out.println("人臉檢測開始……");

		// 創建臨時文件,因爲boot打包後無法讀取文件內的內容
		File targetXmlFile = new File("src/" + xml.getFilename() + "");
		FileUtils.copyInputStreamToFile(xml.getInputStream(), targetXmlFile);
		CascadeClassifier faceDetector = new CascadeClassifier(targetXmlFile.toString());
		if (faceDetector.empty()) {
			System.out.println("請引入文件……");
			return;
		}
		//創建圖片tempFile
		File tempFile = new File("src/" + file.getOriginalFilename() + "");
		FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile);
		
		//讀取創建的圖片tempFile
		Mat image = Imgcodecs.imread(tempFile.toString());
		MatOfRect faceDetections = new MatOfRect();
		//進行人臉檢測
		faceDetector.detectMultiScale(image, faceDetections);
		System.out.println(String.format("檢測到人臉: %s", faceDetections.toArray().length));
		//製圖將圖填充到image中
		for (Rect rect : faceDetections.toArray()) {
			Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
					new Scalar(0, 255, 0),3);
		}
		//下面部分是返回給頁面
		String filename =file.getOriginalFilename();
		Imgcodecs.imwrite(filename, image);
		File imgFile=new File(filename);
		if (imgFile.exists()) { 
		  response.getOutputStream().write(toByteArray(imgFile));
		  response.getOutputStream().close();
        }  
		
		//刪除臨時文件
		if (targetXmlFile.exists() && targetXmlFile.isFile()) {
			if (targetXmlFile.delete()) {
				System.out.println("刪除臨時文件" + targetXmlFile + "成功!");
			}
		}
		if (imgFile.exists() && imgFile.isFile()) {
			if (imgFile.delete()) {
				System.out.println("刪除臨時文件" + imgFile + "成功!");
			}
		}
		if (tempFile.exists() && tempFile.isFile()) {
			if (tempFile.delete()) {
				System.out.println("刪除臨時文件" + tempFile + "成功!");
			}
		}
	}
	
	public static byte[] toByteArray(File file) throws IOException {  
        File f = file;  
        if (!f.exists()) {  
            throw new FileNotFoundException("file not exists");  
        }  
        ByteArrayOutputStream bos = new ByteArrayOutputStream((int) f.length());  
        BufferedInputStream in = null;  
        try {  
            in = new BufferedInputStream(new FileInputStream(f));  
            int buf_size = 1024;  
            byte[] buffer = new byte[buf_size];  
            int len = 0;  
            while (-1 != (len = in.read(buffer, 0, buf_size))) {  
                bos.write(buffer, 0, len);  
            }  
            return bos.toByteArray();  
        } catch (IOException e) {  
            e.printStackTrace();  
            throw e;  
        } finally {  
            try {  
                in.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            bos.close();  
        }  
    }

}

下面來一張我男神們的合照

 

完美~Nice~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章