IDEA上opencv环境配置后通过java调用openCV打开摄像头发现人脸保存当前画面到桌面

一、opencv下载

https://opencv.org/opencv-3-2.html

二、IDEA环境配置

1、找到下载解压的opencv/build/java文件夹
在这里插入图片描述

2、在maven项目中新建一个opencv文件夹,将上方内容复制到文件夹下
在这里插入图片描述

3.导入opencv-320.jar包

第一步:

在这里插入图片描述

第二步:

在这里插入图片描述

4.配置dll文件路径

第一步:

在这里插入图片描述

第二步:

-Djava.library.path=$PROJECT_DIR$\opencv\x64
-Djava.library.path=$PROJECT_DIR$\opencv\x64

在这里插入图片描述

三、完整代码

package opencv;
import org.opencv.core.*;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.video.Video;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import java.awt.*;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class cv3 extends JPanel {
    private static final long serialVersionUIU = 1L;
    private static BufferedImage mImg;

    private BufferedImage mat2BI(Mat mat) {
        int dataSize = mat.cols() * mat.rows() * (int) mat.elemSize();
        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;

            }
        }
        BufferedImage image = new BufferedImage(mat.cols(), mat.rows(), type);
        image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data);
        return image;

    }

    public void paintComponnent(Graphics g) {
        if (mImg != null) {
            g.drawImage(mImg, 0, 0, mImg.getWidth(), mImg.getHeight(), this);

        }
    }

    public static void main(String[] args) {
        try {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
            Mat capImg = new Mat();
            VideoCapture capture = new VideoCapture(0);
            int height = (int) capture.get(Videoio.CAP_PROP_FRAME_HEIGHT);
            int width = (int) capture.get(Videoio.CAP_PROP_FRAME_WIDTH);
            if (height == 0 || width == 0) {
                throw new Exception("Camera not found");
            }
            JFrame frame = new JFrame("camera");
            frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            cv3 panel = new cv3();
            panel.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("click");
                }

                @Override
                public void mousePressed(MouseEvent e) {
                    System.out.println("mousePressed");
                }


                @Override
                public void mouseReleased(MouseEvent e) {
                    System.out.println("mouseReleased");
                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    System.out.println("mouseEntered");
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    System.out.println("mouseExited");
                }


                @Override
                public void mouseDragged(MouseEvent e) {
                    System.out.println("mouseDragged");
                }

                @Override
                public void mouseMoved(MouseEvent e) {
                    System.out.println("mouseMoved");
                }
            });
            frame.setContentPane(panel);
            frame.setVisible(true);
            frame.setSize(width + frame.getInsets().left + frame.getInsets().right, height + frame.getInsets().top + frame.getInsets().bottom);
            int n = 0;
            Mat temp = new Mat();
            while (frame.isShowing() && n < 500) {
                capture.read(capImg);
                Imgproc.cvtColor(capImg, temp, Imgproc.COLOR_RGB2BGR555);
                Mat detectFace = detectFace(capImg);
                panel.mImg = panel.mat2BI(detectFace);
                panel.repaint();
            }
            capture.release();
            frame.dispose();
        } catch (Exception e) {
            System.out.println("例外:" + e);
        } finally {
            System.out.println("--done--");

        }
    }


    public static Mat detectFace(Mat img) throws Exception {
        System.out.println("Running DetecrFace...");
        CascadeClassifier faceDetector = new CascadeClassifier("F:\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(img, faceDetections);
        Rect[] rects = faceDetections.toArray();
        if (rects != null && rects.length >= 1) {
            for (Rect rect : rects) {
                Imgproc.rectangle(img, new org.opencv.core.Point(rect.x, rect.y), new org.opencv.core.Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 245), 2);

            }
            //拍照
            SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
            String name = sdf.format(new Date());
//获取桌面路径
            File path = FileSystemView.getFileSystemView().getHomeDirectory();
            System.out.println(path);
            String format = "jpg";
            File f = new File(path + File.separator + name + "." + format);
            try {
                ImageIO.write(mImg, format, f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return img;

    }
}

参考于:
https://blog.csdn.net/zwl18210851801/article/details/81075781
https://blog.csdn.net/yinglingsiji/article/details/80238765

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值