java调起本地摄像头,利用openCV进行人脸识别(一)
嗨咯,又好久沒有更新了。今天寫個前陣子做的人臉識別程序。該程序客戶端基于Jave JFrame
客戶端的主要作用是,調用電腦的攝像頭(我的直接調用筆記本攝像頭),然后回顯攝像頭錄取的信息,再利用openCV進行人臉識別。可以框出人臉、并采集人臉數據,采集好后進行模型訓練,訓練得到模型后,可以進行人臉對比。
這個客戶端目前已經實現以上功能,但是實現得比較簡單,每一步還需要手動點擊,為了使他更智能,客戶端目前還在改進。
所以今天就先簡單講下openCV的環境部署,以及基本的調用。
首先,要部署openCV的環境,解壓openCV的環境包,然后配置環境變量。
這個包我已經上傳我的資源,可以直接下載。也可以到openCV官網去進行下載。
解壓以后長這樣
然后,我們去系統環境變量里邊,添加一下路徑,我的包在F盤,所以環境變量為?F:\face\install\x64\vc14\bin
然后是openCV的簡單調用,以下這個類是調起攝像頭,可以利用openCV識別出人臉,在畫面上邊畫出框框
FaceDetection.java
package face.detect;import javax.swing.*;import face.util.VideoPanel; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; import org.opencv.objdetect.Objdetect; import org.opencv.videoio.VideoCapture;public class FaceDetection {public static void main(String[] args) {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);// 新建窗口JFrame cameraFrame = new JFrame("camera");cameraFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);cameraFrame.setSize(640, 480);cameraFrame.setBounds(0, 0, cameraFrame.getWidth(), cameraFrame.getHeight());VideoPanel videoPanel = new VideoPanel();cameraFrame.setContentPane(videoPanel);cameraFrame.setVisible(true);CascadeClassifier faceCascade = new CascadeClassifier();// 獲取模型文件faceCascade.load("F:/face/install/etc/haarcascades/haarcascade_frontalface_alt.xml");// 調用攝像頭VideoCapture capture = new VideoCapture();try {capture.open(0);if (capture.isOpened()) {Mat image = new Mat();while(true) {capture.read(image);if (!image.empty()) {detectAndDisplay(image, faceCascade);videoPanel.setImageWithMat(image);cameraFrame.repaint();} else {break;}}}} finally {capture.release();}}/*** 繪制圖形界面* @param frame* @param faceCascade*/public static void detectAndDisplay(Mat frame, CascadeClassifier faceCascade){MatOfRect faces = new MatOfRect();Mat grayFrame = new Mat();// convert the frame in gray scaleImgproc.cvtColor(frame, grayFrame, Imgproc.COLOR_BGR2GRAY);// equalize the frame histogram to improve the resultImgproc.equalizeHist(grayFrame, grayFrame);// compute minimum face size (20% of the frame height, in our case)int absoluteFaceSize = 0;int height = grayFrame.rows();if (Math.round(height * 0.2f) > 0) {absoluteFaceSize = Math.round(height * 0.2f);}// detect facesfaceCascade.detectMultiScale(grayFrame, faces, 1.1, 2, 0 | Objdetect.CASCADE_SCALE_IMAGE,new Size(absoluteFaceSize, absoluteFaceSize), new Size());// each rectangle in faces is a face: draw them!Rect[] facesArray = faces.toArray();for (int i = 0; i < facesArray.length; i++)Imgproc.rectangle(frame, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0), 3);}}面板工具類?VideoPanel.java
import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*;import org.opencv.core.Mat;public class VideoPanel extends JPanel {private BufferedImage image;public void setImageWithMat(Mat mat) {image = mat2BufferedImage.matToBufferedImage(mat);this.repaint();}@Override protected void paintComponent(Graphics g) {super.paintComponent(g);if (image != null) g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), this);}public static VideoPanel show(String title, int width, int height, int open) {JFrame frame = new JFrame(title);if(open==0) {frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);} else {frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}frame.setSize(width, height);frame.setBounds(0, 0, width, height);VideoPanel videoPanel = new VideoPanel();videoPanel.setSize(width, height);frame.setContentPane(videoPanel);frame.setVisible(true);return videoPanel;} }然后運行FaceDetection.java類就可以啟動程序啦,效果圖所示
?
然后突然想起來,還需要下載這個jar包,導入到工程里邊
這次忘記上傳了,這個百度一下就可以下載到。
openCV人臉識別的初步運用先寫到這里,下次會把項目打包上傳
-----------------------------------------------------------------------------------------------------------------------
2020-07-16 補充代碼?
有小伙伴反映有個地方不能運行,然后我發現有個工具類忘記貼了
mat2BufferedImage.java
import org.opencv.core.Mat;import java.awt.image.BufferedImage;public class mat2BufferedImage {public static BufferedImage matToBufferedImage(Mat matrix) {int cols = matrix.cols();int rows = matrix.rows();int elemSize = (int) matrix.elemSize();byte[] data = new byte[cols * rows * elemSize];int type;matrix.get(0, 0, data);switch (matrix.channels()) {case 1:type = BufferedImage.TYPE_BYTE_GRAY;break;case 3:type = BufferedImage.TYPE_3BYTE_BGR;// bgr to rgbbyte b;for (int i = 0; i < data.length; i = i + 3) {b = data[i];data[i] = data[i + 2];data[i + 2] = b;}break;default:return null;}BufferedImage image2 = new BufferedImage(cols, rows, type);image2.getRaster().setDataElements(0, 0, cols, rows, data);return image2;} }?
相關博客:
java利用openCV進行人臉識別,采集照片和訓練模型(二)
總結
以上是生活随笔為你收集整理的java调起本地摄像头,利用openCV进行人脸识别(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 考托福要不停的告诉自己:每临大事有静气!
- 下一篇: linux系统下载18.04,在Ubun