OpenCV Java实现人脸识别和裁剪功能

官网:https://opencv-java-tutorials.readthedocs.io/en/latest/index.html

安装及配置

1.首先安装OpenCV,地址

这里我下载的是Windows版的3.4.5

OpenCV Java实现人脸识别和裁剪功能

然后安装即可……

2.Eclipse配置OpenCV

Window->Preferences->Java->User Libraries

OpenCV Java实现人脸识别和裁剪功能

New输入你的Libraries名

OpenCV Java实现人脸识别和裁剪功能

这里我的安装目录是D:\OpenCV,所以是:

OpenCV Java实现人脸识别和裁剪功能

然后引入dll,我是64位机子,所以是:

OpenCV Java实现人脸识别和裁剪功能

OpenCV Java实现人脸识别和裁剪功能

Ok,下面创建Java项目做Java与OpenCV的人脸识别。

人脸识别

创建项目后首先右击选择Properties

OpenCV Java实现人脸识别和裁剪功能

OpenCV Java实现人脸识别和裁剪功能

然后引入即可。

引入haarcascade_frontalface_alt.xml这个xml文件:

OpenCV Java实现人脸识别和裁剪功能

我的pom文件如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

<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

最后代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

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.core.Size;

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 {

 // D:\workspace-sts-3.9.2.RELEASE\OpenCV\src\main\resources

 // String opencvpath = System.getProperty("user.dir") +

 // "\\src\\main\\resources\\";

 // String opencvDllName = opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll";

 // System.load(opencvDllName);

 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));

 Integer i = 1;

 // 制图将图填充到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);

 imageCut(tempFile.toString(), i+".jpg", rect.x, rect.y, rect.width, rect.height);// 进行图片裁剪

 i++;

 }

 // 下面部分是返回给页面

 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 void imageCut(String imagePath, String outFile, int posX, int posY, int width, int height) {

 // 原始图像

 Mat image = Imgcodecs.imread(imagePath);

 // 截取的区域:参数,坐标X,坐标Y,截图宽度,截图长度

 Rect rect = new Rect(posX, posY, width, height);

 // 两句效果一样

 Mat sub = image.submat(rect); // Mat sub = new Mat(image,rect);

 Mat mat = new Mat();

 Size size = new Size(width, height);

 Imgproc.resize(sub, mat, size);// 将人脸进行截图并保存

 Imgcodecs.imwrite(outFile, mat);

 System.out.println(String.format("图片裁切成功,裁切后图片文件为: %s", outFile));

  

 }

  

 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();

 }

 }

  

}

下面来一张我男神们的合照

OpenCV Java实现人脸识别和裁剪功能

OpenCV Java实现人脸识别和裁剪功能

OpenCV Java实现人脸识别和裁剪功能

OpenCV Java实现人脸识别和裁剪功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。