『 JavaCV 』JavaCV之调用本机摄像头

最近学习用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。群里目前已有1800人,每天都非常活跃,但为了筛选掉那些不怀好意的朋友进来搞破坏,所以目前入群方式已改成了付费方式,你只需要支付9块钱,即可获取到群文件中的所有干货以及群里面各位前辈们的疑惑解答;为了鼓励良好风气的发展,让每个新人提出的问题都得到解决,所以我将得到的入群收费收入都以红包的形式发放到那些主动给新手们解决疑惑的朋友手中。在这里,我们除了谈技术,还谈生活、谈理想;在这里,我们为你的学习方向指明方向,为你以后的求职道路提供指路明灯;在这里,我们把所有好用的干货都与你分享。还在等什么,快加入我们吧!

2018.4.21更:如果群1无法加入,请加Java学习交流2群:305335626 。群2作为群1的附属群,除了日常的技术交流、资料分享、学习方向指明外,还会在每年互联网的秋春招时节在群内发布大量的互联网内推方式,话不多说,快上车吧!

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.

坚持原创技术分享,您的支持将鼓励我继续创作!