最近做一个项目,需要用到虹软的JDK实现一个人脸识别的电脑桌面应用系统。本认为是一项很简单的事情,却踩了不少的坑,特此记录一下,方便需要的兄弟借鉴。
打开摄像头是最简单的一步,也是坑最多的一步。java中打开摄像头主要有两种方式
,通过两种方式:
- JMF
- javacv
JMF中的坑比较多,我找了很多资料,最后成功安装之后,却发现运行出错,使用不了,也不知道是哪里的原因,所以最后还是考虑用javacv来打开摄像头
。
首先我们先下载javacv,最重要的就是四个文件:javacpp
、javacv
、opencv
、opencv-windows-x86_64
。把四个文件复制一份放到项目的lib文件夹
中,方便管理。然后我们在intellij IDE中导入再四个库文件:File->Project Structure->Libraries->"+"
然后把四个库文件分别添加进来,我们导入完成之后的情况:
需要注意:javacv是依赖opencv库的,因此需要自行去opencv官网下载最新版的opencv
并安装。图中opencv-430
便是官网下载的。
我们测试一下是否成功:
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import javax.swing.*;
public class study {
public static void main(String[] args) throws FrameGrabber.Exception, InterruptedException {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start(); //开始获取摄像头数据
CanvasFrame canvas = new CanvasFrame("人脸检测");//新建一个窗口
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while(true)
{
if(!canvas.isEnabled())
{//窗口是否关闭
grabber.stop();//停止抓取
System.exit(0);//退出
}
Frame frame=grabber.grab();
canvas.showImage(frame);//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
Thread.sleep(50);//50毫秒刷新一次图像
}
}
}