1. 程式人生 > >Java+opencv實現人臉檢測

Java+opencv實現人臉檢測

版本

Java1.8

opencv3.4

程式碼:

import java.awt.Graphics;

import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;

import org.opencv.core.Mat;
import org.opencv.core.MatOfDouble;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; import org.opencv.objdetect.HOGDescriptor; import org.opencv.videoio.VideoCapture; import org.opencv.videoio.Videoio; public class FaceDetection extends JPanel { private BufferedImage mImg;
private static JFrame jFrame; //Mat轉成image private BufferedImage matToImage(Mat mat){ int dataSize =(int) (mat.total()*mat.channels()); byte[] data=new byte[dataSize]; mat.get(0, 0,data); int type=mat.channels()==1? BufferedImage.TYPE_BYTE_GRAY:BufferedImage.TYPE_3BYTE_BGR;
if(type==BufferedImage.TYPE_3BYTE_BGR){ for(int i=0;i<dataSize;i+=3){ byte blue=data[i+0]; data[i+0]=data[i+2]; data[i+2]=blue; } } //建立空的image BufferedImage image=new BufferedImage(mat.cols(),mat.rows(),type); //幀資料拷貝 image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data); return image; } /** * Jpanel呼叫repaint的時候會自動呼叫該繪圖方法 */ public void paintComponent(Graphics g){ if(mImg!=null){ g.drawImage(mImg, 0, 0, mImg.getWidth(),mImg.getHeight(),this); } } static{
     //System.loadLibrary(Core.NATIVE_LIBRARY_NAME); System.load(
"D:/opencv/build/java/x64/opencv_java320.dll"); } public static void creatFrame(JPanel jPanel,int width,int height){ jFrame = new JFrame("camera"); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jFrame.setVisible(true); //將內容新增到JFrame jFrame.setSize(width,height); jFrame.setContentPane(jPanel); } public static void main(String[] args) throws Exception { //開啟攝像頭 VideoCapture capture=new VideoCapture(0); FaceDetection jPanel=new FaceDetection(); creatFrame(jPanel,(int)capture.get(Videoio.CAP_PROP_FRAME_WIDTH),(int)capture.get(Videoio.CAP_PROP_FRAME_HEIGHT)); Mat mat=new Mat(); while(true){ if(!capture.isOpened()){ System.out.println("camera is not open"); System.exit(0); } capture.read(mat); jPanel.mImg=jPanel.matToImage(detectFace(mat)); jPanel.repaint(); } } /** * opencv實現人臉識別 * @param img */ public static Mat detectFace(Mat mat) throws Exception { // 從配置檔案lbpcascade_frontalface.xml中建立一個人臉識別器,該檔案位於opencv安裝目錄中 CascadeClassifier faceDetector = new CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"); // 在圖片中檢測人臉 MatOfRect faceDetections = new MatOfRect(); faceDetector.detectMultiScale(mat, faceDetections); Rect[] rects = faceDetections.toArray(); for (Rect rect : rects) { //標出臉 Imgproc.rectangle(mat, new Point(rect.x, rect.y), //標記框的左下點座標 new Point(rect.x + rect.width, rect.y + rect.height), //標記框的右上點座標 new Scalar(0, 255, 0), //顏色 2); //粗細 } return mat; } }