Java使用OpenCV实现人脸识别
通過OpenCV實現(xiàn)人臉識別,包括圖片,視頻,攝像頭中人臉識別。
首先看一下效果(在網(wǎng)上隨便找的一張圖片):
下面開始說一下如何實現(xiàn)的:
第一步:? 需要安裝OpenCV
? ? ? ? ? ? ? ? 下載鏈接:https://opencv.org/? ? 或? ?https://download.csdn.net/download/u012804490/10813245
第二步:創(chuàng)建一個Java項目
? ? ? ? ? ? ? ?
第三步:將OpenCV的jar包引入項目(截圖演示)
? ? ? ? 然后? 點OK。
第四步:代碼實現(xiàn)
package com.opencv;import org.opencv.core.*; import org.opencv.core.Point; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; import org.opencv.videoio.VideoCapture;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.awt.image.WritableRaster; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream;import static org.opencv.imgproc.Imgproc.CV_BILATERAL;public class FaceRecognitionDemo {public static void main(String[] args) {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);// filePath可以是圖片路徑,也可以是視頻路徑String filePath ="pic1236710b.jpg";playVideo(filePath);// 調(diào)取攝像頭,進行人臉識別 // recording();}public static void playVideo(String fileName){VideoCapture capture = new VideoCapture(fileName);System.out.println(capture.get(CV_BILATERAL));if (!capture.isOpened()) {System.out.println("未能打開文件");return;}showFace(capture);}public static void recording(){VideoCapture capture = new VideoCapture(0);System.out.println(capture.get(CV_BILATERAL));if (!capture.isOpened()) {System.out.println("未能打開文件");return;}showFace(capture);}public static void showFace(VideoCapture capture){//獲得視屏流幀的寬度int frame_width = (int) capture.get(3);//獲得視屏流幀的高度int frame_height = (int) capture.get(4);//將視頻顯示類進行實例化VideoGui videoGui = new VideoGui();videoGui.createWin("視頻播放",new Dimension(frame_width,frame_height));Mat mat = new Mat();String file = "haarcascade_frontalface_alt.xml";CascadeClassifier classifier = new CascadeClassifier(file);MatOfRect faceDetections = new MatOfRect();while (capture.read(mat)){classifier.detectMultiScale(mat, faceDetections);System.out.println(String.format("Detected %s faces",faceDetections.toArray().length));for (Rect rect : faceDetections.toArray()) {Imgproc.rectangle(mat, new Point(rect.x, rect.y),new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 0, 255));}BufferedImage bufferedImage = matToBufferedImage(mat);//顯示視頻videoGui.imgShow(bufferedImage);}// 關(guān)閉視頻文件capture.release();try {Thread.sleep(5000);videoGui.imgClose();} catch (InterruptedException e) {e.printStackTrace();}}public static BufferedImage matToBufferedImage(Mat mat){try {MatOfByte matOfByte = new MatOfByte();Imgcodecs.imencode(".jpg", mat, matOfByte);byte[] byteArray = matOfByte.toArray();InputStream in = new ByteArrayInputStream(byteArray);BufferedImage bufImage = ImageIO.read(in);return bufImage;} catch (IOException e) {e.printStackTrace();}return null;} } package com.opencv;import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage;public class VideoGui extends JComponent {private BufferedImage image;private JDialog ui = new JDialog();@Overridepublic void paintComponent(Graphics g){Graphics2D g2d = (Graphics2D) g;if(image == null){g2d.setPaint(Color.BLACK);g2d.fillRect(0,0,this.getWidth(),this.getHeight());}else{g2d.drawImage(image,0,0,this.getWidth(),this.getHeight(),null);}}public void createWin(String title,Dimension size){ui.setTitle(title);ui.getContentPane().setLayout(new BorderLayout());ui.getContentPane().add(this,BorderLayout.CENTER);ui.setSize(new Dimension(size));ui.setVisible(true);}public void imgShow(BufferedImage image){this.image = image;this.repaint();}public void imgClose(){ui.dispose();} }第五步:運行:
可能拋異常:Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java400 in java.library.path
解決辦法: 需要配置一下? ?VM options:??
? ? ? ? ? ? ? ? ? ?-Djava.library.path=C:\OpenCV\opencv\build\java\x64;C:\OpenCV\opencv\build\x64\vc14\bin
?
再次運行,成功!
項目下載鏈接:??https://download.csdn.net/download/u012804490/10813371
?
?
? ? ? ?? 如果對您有幫助就打個賞吧(一元以內(nèi)即可)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
總結(jié)
以上是生活随笔為你收集整理的Java使用OpenCV实现人脸识别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内涵!!!程序猿才懂的动图...
- 下一篇: Docker安装elasticsearc