您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)OpenCV Java如何實(shí)現(xiàn)人臉識(shí)別和裁剪功能,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
安裝及配置
1.首先安裝OpenCV,地址
這里我下載的是Windows版的3.4.5
然后安裝即可……
2.Eclipse配置OpenCV
Window->Preferences->Java->User Libraries
New輸入你的Libraries名
這里我的安裝目錄是D:\OpenCV,所以是:
然后引入dll,我是64位機(jī)子,所以是:
Ok,下面創(chuàng)建Java項(xiàng)目做Java與OpenCV的人臉識(shí)別。
人臉識(shí)別
創(chuàng)建項(xiàng)目后首先右擊選擇Properties
然后引入即可。
引入haarcascade_frontalface_alt.xml這個(gè)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>
修改我的端口號(hào):
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.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("人臉檢測(cè)開始……"); // 創(chuàng)建臨時(shí)文件,因?yàn)閎oot打包后無(wú)法讀取文件內(nèi)的內(nèi)容 File targetXmlFile = new File("src/" + xml.getFilename() + ""); FileUtils.copyInputStreamToFile(xml.getInputStream(), targetXmlFile); CascadeClassifier faceDetector = new CascadeClassifier(targetXmlFile.toString()); if (faceDetector.empty()) { System.out.println("請(qǐng)引入文件……"); return; } // 創(chuàng)建圖片tempFile File tempFile = new File("src/" + file.getOriginalFilename() + ""); FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile); // 讀取創(chuàng)建的圖片tempFile Mat image = Imgcodecs.imread(tempFile.toString()); MatOfRect faceDetections = new MatOfRect(); // 進(jìn)行人臉檢測(cè) faceDetector.detectMultiScale(image, faceDetections); System.out.println(String.format("檢測(cè)到人臉: %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);// 進(jìn)行圖片裁剪 i++; } // 下面部分是返回給頁(yè)面 String filename = file.getOriginalFilename(); Imgcodecs.imwrite(filename, image); File imgFile = new File(filename); if (imgFile.exists()) { response.getOutputStream().write(toByteArray(imgFile)); response.getOutputStream().close(); } // 刪除臨時(shí)文件 if (targetXmlFile.exists() && targetXmlFile.isFile()) { if (targetXmlFile.delete()) { System.out.println("刪除臨時(shí)文件" + targetXmlFile + "成功!"); } } if (imgFile.exists() && imgFile.isFile()) { if (imgFile.delete()) { System.out.println("刪除臨時(shí)文件" + imgFile + "成功!"); } } if (tempFile.exists() && tempFile.isFile()) { if (tempFile.delete()) { System.out.println("刪除臨時(shí)文件" + tempFile + "成功!"); } } } public static void imageCut(String imagePath, String outFile, int posX, int posY, int width, int height) { // 原始圖像 Mat image = Imgcodecs.imread(imagePath); // 截取的區(qū)域:參數(shù),坐標(biāo)X,坐標(biāo)Y,截圖寬度,截圖長(zhǎng)度 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);// 將人臉進(jìn)行截圖并保存 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(); } } }
下面來一張我男神們的合照
關(guān)于“OpenCV Java如何實(shí)現(xiàn)人臉識(shí)別和裁剪功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。