記一次Java調用本地/百度度目 攝像頭(基於OpenCV)


OpenCV官網下載地址(下載安裝后,在安裝目錄可以找到動態鏈接庫和OpenCv.jar)

https://opencv.org/releases/

     

 

 

 

 安裝完成后,這是我的安裝目錄

    

 

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,搞定

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM