最近学习用java语言如何进行人脸识别的功能,人脸检测有助于在任何数字图像上识别人脸,在做了一些研究后,我发现OpenCV的库可以帮我检测图像中的人脸,所以接触到了opencv这门技术。
什么是opencv? OpenCV(Open Source Computer Vision) 是一个开源的计算机视觉算法库。是用C/C++写的,旨在发挥多核心的优势。它提供C++、C、Python和Java的接口,并支持所有主流操作系统平台,包括Windows、Linux、Mac OS、iOS及Android。
1.写在前面的话
因为博主在用java开发人脸识别功能时走了不少的弯路,所以有些话我要写在前面,避免你走不少的弯路:
1.因为opencv是用c++写的,所以你要是打算用c++或者python在opencv上进行开发,那么你首先需要的就是在自己的电脑上搭建opencv的开发环境,若是mac系统搜”mac下opencv的搭建”,windows系统搜”windows下opencv的搭建”即可。若是你真的采用上面所说的两种语言开发的,那么本篇文章你就可以跳过去了,因为本篇文章是在java环境下描述的。
2.如果你像我一样打算用java去完成人脸识别,那么恭喜你,opencv的环境就不用你亲自动手去搭建了,本篇文章也很适合你。或许有人会问:opencv是用c++写的嘛,所以自然而言我们要用c++去调用它的相关方法嘛,那么用java如何调用呢?opencv是从2.2.4版本开始后就提供了java语言编写的相关接口,使得java开发人员可以通过JNI去调用opencv的相关库,这里有个很酷的库叫javacv,从javacv0.8版本以后,就完全将opencv的功能封装在自己的库中,所以我们可以直接通过引用opencv对应的系统平台的引用包而不用再搭建繁琐的opencv环境咯。首先点击链接下载javacv中所有的jar包,解压后里面有所有的javacv开发的相关jar包,本篇文章我们需要的jar包只有4个:opencv.jar、javacv.jar、javacpp.jar、opencv-macosx-x86_64.jar(这个jar包要跟自己的操作系统相同,你要是是windows系统就选择相应的opencv-windows-x86_64位或者32位jar包),其他的jar包当遇到时我会再说。
这里说说我遇到的坑,网上很多关于javacv的搭建环境的教程,然后都是大同小异先教你搭建opencv的环境,然后给你一个实例让你测试自己的opencv环境是否成功搭建。说到这里我就想骂人了,那些教需要在电脑上搭建opencv环境的,你不知道javacv0.8版本之后就不用再搭建opencv的环境了吗?麻烦你知道了就快点把博客内容改改吧,不要再耽误我们这些java开发人员的时间了好吗?我看了你们的教程可是关搭建opencv的环境就浪费了两天时间…
另外本篇文章是在mac环境下运行的,windows系统也同样能参考我这篇文章。
2.准备环境
1.相关jar包,本篇文章只需要4个jar包即可:
mac系统:javacpp.jar,javacv.jar,opencv.jar,opencv-macosx-x86_64.jar。
windows系统:javacpp.jar,javacv.jar,opencv.jar,oepncv-windows-x86_64.jar(或者oepncv-windows-x86.jar)。
Linux系统:javacpp.jar,javacv.jar,opencv.jar,,opencv-linux-x86_64.jar。
2.貌似准备环境只需要上述四个jar包即可。。。本地opencv的环境已不再需要你在自己的电脑上搭建。。。当然开发工具eclipse和IDEA都可以。
3.Demo:java通过javacv获取本机电脑摄像头
好了废话不要那么多,直接开始coding吧。新建一个java项目,普通项目即可,创建一个JavacvCameraTest.java,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25//import相关类
public class JavacvCameraTest
{
public static void main(String[] args) throws Exception, InterruptedException
{
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start(); //开始获取摄像头数据
CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while(true)
{
if(!canvas.isDisplayable())
{//窗口是否关闭
grabber.stop();//停止抓取
System.exit(2);//退出
}
canvas.showImage(grabber.grab());//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
Thread.sleep(50);//50毫秒刷新一次图像
}
}
}
然后运行程序,过不了几秒神奇的事就会发生了…我说几秒钟你会出现在你自己的电脑屏幕上你信吗。
后话:本来上级布下任务,要使用javacv完成人脸识别的功能。老实说,用javacv这个东西完全没有人带,网上资料少之又少,可是没办法,领导布置的任务必须要完成。所以自己确实走了不少的弯路,希望总结下来为你解决不少的问题。
当然这里又会有人问,既然是要用javacv做视频流转换成图片的功能,那这篇文章为啥要写用它调用本机摄像头的功能实现呢?亲,你总得先学会使用它的相关API吧!期待我下篇关于javacv的相关API的文章请点击JavaCV+FFmpeg实现推流和拉流
若是我没有更新,请参考某位大神写的关于javacv的系列文章,javacv开发详解之1:调用本机摄像头视频,还有详解2、详解3…详解7,很有参考价值!
2018.3.19更
欢迎加入我的Java交流1群:659957958。
2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626 。
4.联系
If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.