OpenCV官網下載地址(下載安裝后,在安裝目錄可以找到動態鏈接庫和OpenCv.jar)
安裝完成后,這是我的安裝目錄
maven 依賴(這個是安裝完成后我把jar放到maven本地倉庫中,然后在maven中就可以直接引用了)
<!-- opencv依賴 --> <dependency> <groupId>org.opencv</groupId> <artifactId>opencv</artifactId> <version>440</version> </dependency>
1.配置OpenCV環境
新建本地依賴
自己定義依賴庫的名稱
選擇動態鏈接庫dll文件的目錄
選擇OpenCV的安裝目錄
這個是根據你的JDK來選擇,如果你的JDK是64位的就選擇x64
2.攝像頭獲取類
package com.crow.safeBoxHardware; import java.awt.FlowLayout; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.File; import java.io.IOException; import java.io.InputStream; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; import org.opencv.videoio.VideoCapture; import org.opencv.videoio.Videoio; import lombok.extern.log4j.Log4j2; @Log4j2 public class Test2 { // 從配置文件lbpcascade_frontalface.xml中創建一個人臉識別器,該文件位於opencv安裝目錄中 private CascadeClassifier faceDetector; private JFrame cameraFrame; public CamarePanel panelCamera; // 是否打開攝像頭 private boolean open = false; // 相機 public VideoCapture capture; // 人臉圖像 public Mat faceMat; // 攝像頭讀取的幀 public Mat capImg; public Test2() { // 初始化人臉檢測器 // faceDetector = new CascadeClassifier( // "C:\\worksplace\\safeBoxHardware\\src\\main\\resources\\native\\face\\xml\\haarcascade_frontalface_alt.xml"); capture = new VideoCapture(); } /** * 打開攝像頭 * * @param x * @param y */ public void open(int x, int y) { capImg = new Mat(); faceMat = new Mat(); cameraFrame = new JFrame("camare"); panelCamera = new CamarePanel(); // 打開相機 capture.open(0); boolean grab = capture.grab(); if (!grab) { throw new BizException(BizErrorCode.CAMARE_OPEN_ERROE); } // 打開攝像頭 open = true; // 設置分辨率 capture.set(Videoio.CAP_PROP_FRAME_WIDTH, 1280); capture.set(Videoio.CAP_PROP_FRAME_HEIGHT, 720); // 設置幀率 capture.set(Videoio.CAP_PROP_FPS, 30); // 添加到Frame cameraFrame.setContentPane(panelCamera); // 設置去掉邊框 cameraFrame.setUndecorated(true); // 是否顯示窗口 cameraFrame.setVisible(true); // 設置在最頂層 cameraFrame.setAlwaysOnTop(true); // 設置關閉 cameraFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // 窗口關閉事件 cameraFrame.addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { } @Override public void windowIconified(WindowEvent e) { } @Override public void windowDeiconified(WindowEvent e) { } @Override public void windowDeactivated(WindowEvent e) { } @Override public void windowClosing(WindowEvent e) { close(); } @Override public void windowClosed(WindowEvent e) { } @Override public void windowActivated(WindowEvent e) { } }); // 設置位置 if (x > 0 && y > 0) { cameraFrame.setBounds(x, y, 400, 600); } else { // 設置大小 cameraFrame.setSize(400, 600); // 居中顯示 cameraFrame.setLocationRelativeTo(null); } while (open) { capture.read(capImg); if (!capImg.empty()) { // 轉換成BufferImage並繪制到Panel panelCamera.setImageWithMat(capImg); // 重新繪制 cameraFrame.repaint(); //檢測人臉並保存 //detectFace(capImg, "C:\\Users\\Crow\\Desktop\\"+System.currentTimeMillis()+".png"); } } log.info("相機已關閉......"); } /** * 關閉窗口和攝像頭釋放資源 */ public void close() { // 關閉循環 open = false; if (cameraFrame != null) { // 關閉窗口 cameraFrame.dispose(); cameraFrame = null; } if (panelCamera != null) { // 清空 panelCamera = null; } if (capture != null && capture.isOpened()) { // 關閉視頻文件或捕獲設備,並釋放資源 capture.release(); } log.warn("關閉相機..........................."); } /** * 檢測人臉,並保存 * * @param videoMat * @param savePath * @return */ public Mat detectFace(Mat videoMat, String savePath) { File file = new File(savePath); // 驗證父目錄是否存在,不存在則新建 if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } // 創建用來裝檢測出來的人臉的容器 MatOfRect faces = new MatOfRect(); // 檢測人臉,videoMat為要檢測的圖片,faces用來存放檢測結果 faceDetector.detectMultiScale(videoMat, faces); Rect[] facesArray = faces.toArray(); if (facesArray.length > 0) { for (int i = 0; i < facesArray.length; i++) { Rect rect = facesArray[i]; // 只獲取人臉行和人臉列 Mat faceImage = videoMat.rowRange(rect.y, rect.y + rect.height).colRange(rect.x, rect.x + rect.width); // 設置大小 Size size = new Size(400, 600); // 調整圖像 Imgproc.resize(faceImage, faceMat, size); // 保存 Imgcodecs.imwrite(savePath, faceMat); } } return faceMat; } public boolean isOpen() { return open; } public void setOpen(boolean open) { this.open = open; } public CamarePanel getPanelCamera() { return panelCamera; } public Mat getFaceMat() { return faceMat; } public static void main(String[] args) { //加載opencv動態鏈接庫 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); //打開攝像頭,並設置位置 new Test2().open(298, 81); } }
3.圖像顯示Panel容器
package com.crow.safeBoxHardware.components.hardware.camare; import java.awt.Graphics; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.HeadlessException; import java.awt.Image; import java.awt.Transparency; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JPanel; import org.opencv.core.Mat;
import org.opencv.highgui.HighGui; /** * <p> * 用於在面板上顯示和拍攝 * </p> * * @author Crow * @version 0.0.1 * @since 2020-9-158:54:36 */ public class CamarePanel extends JPanel { private static final long serialVersionUID = 1L; //攝像頭獲取的原始圖像 private BufferedImage image; //裁剪修正后的圖像 private BufferedImage updateImage; public CamarePanel() { super(); } private BufferedImage getimage() { return image; } /** * 裁剪修正后的圖像 * @return */ public BufferedImage getUpdateImage() { return updateImage; } public void setUpdateImage(BufferedImage updateImage) { this.updateImage = updateImage; } public void setImage(BufferedImage newimage) { image = newimage; return; } public void setImageWithMat(Mat newimage) {
// 將Mat轉換成BufferedImage
image = (BufferedImage) HighGui.toBufferedImage(newimage);
} @Override protected void paintComponent(Graphics g) { super.paintComponent(g);
if (image!= null) {
// 裁剪
updateImage = image.getSubimage(450, 0, 400, 600);
// 繪制
g.drawImage(updateImage, 0, 0, 400, 600, this);
} } }
攝像頭像素較差(百度的度目攝像頭)
效果圖(本人就不上鏡了)

OK,搞定