使用JavaCV播放视频、摄像头、人脸识别
一、导入Maven依赖包
<dependencies>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-platform</artifactId>
<version>3.4.1-1.4.1</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> </dependencies>
二、查看前文了解基础
https://www.cnblogs.com/songxingzhu/p/9088204.html
三、使用JavaCV播放视频的多种测试
import org.bytedeco.javacpp.*;
import org.bytedeco.javacv.*;
import org.junit.Test; import javax.swing.*;
import java.io.File;
import java.math.RoundingMode;
import java.net.MalformedURLException;
import java.util.Map;
import java.util.concurrent.TimeUnit; import static org.bytedeco.javacpp.opencv_core.Mat;
import static org.bytedeco.javacpp.opencv_imgproc.COLOR_BGRA2GRAY; public class JavaCVTest { private void showFrames(String winTitle, FrameGrabber grabber) throws FrameGrabber.Exception, InterruptedException {
CanvasFrame canvas = new CanvasFrame(winTitle,1);//新建一个窗口
canvas.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while (true) {
if (!canvas.isVisible()) {
break;
}
Frame frame = grabber.grab();
canvas.showImage(frame);
Thread.sleep(50);//50毫秒刷新一次图像
}
} private void showFramesWithFace(String winTitle, FrameGrabber grabber) throws FrameGrabber.Exception, InterruptedException {
OpenCVFrameConverter.ToMat convertToMat = new OpenCVFrameConverter.ToMat();
File fileAbsolutePath = new File(ClassLoader.getSystemClassLoader().getResource("data/lbpcascade_frontalface_improved.xml").getFile());
//opencv_objdetect.CvHaarClassifierCascade face_cascade=opencv_objdetect.cvLoadHaarClassifierCascade(fileAbsolutePath.getAbsolutePath(),new opencv_core.CvSize(0,0));
opencv_objdetect.CascadeClassifier face_cascade = new opencv_objdetect.CascadeClassifier(fileAbsolutePath.getAbsolutePath());
opencv_core.RectVector faces = new opencv_core.RectVector();
CanvasFrame canvas = new CanvasFrame(winTitle,1);//新建一个窗口
canvas.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while (true) {
if (!canvas.isVisible()) {
break;
}
Frame frame = grabber.grab();
Mat mat = convertToMat.convert(frame);
if (mat.empty())
continue;
Mat videoMatGray = new Mat();
opencv_imgproc.cvtColor(mat, videoMatGray, COLOR_BGRA2GRAY);
opencv_imgproc.equalizeHist(videoMatGray, videoMatGray);
//int[] rejectLevels = new int[0];
//double[] levelWeights = new double[0];
face_cascade.detectMultiScale(videoMatGray, faces);
for (int i = 0; i < faces.size(); i++) {
opencv_core.Rect face = faces.get(i);
opencv_imgproc.rectangle(mat, face, opencv_core.Scalar.RED, 4, 8, 0);
} //opencv_highgui.imshow(winTitle, mat);
//opencv_highgui.waitKey(30);
canvas.showImage(convertToMat.convert(mat));
Thread.sleep(30);//50毫秒刷新一次图像
}
} @Test
public void testCamera() throws InterruptedException, FrameGrabber.Exception {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.setImageWidth(1280);
grabber.setImageHeight(720);
grabber.start(); //开始获取摄像头数据
showFrames("Camera", grabber);
grabber.stop();
grabber.close();
} @Test
public void testCamera1() throws FrameGrabber.Exception, InterruptedException {
VideoInputFrameGrabber grabber = new VideoInputFrameGrabber(0);
grabber.start(); //开始获取摄像头数据
showFrames("Camera", grabber);
grabber.stop();
grabber.close();
} @Test
public void testCamera2() throws FrameGrabber.Exception, InterruptedException, MalformedURLException {
IPCameraFrameGrabber grabber = new IPCameraFrameGrabber("http://admin:12345@192.0.0.64:554/MPEG-4/ch1/main/av_stream", 30, 30, TimeUnit.SECONDS);
grabber.start();
showFrames("IPCamera", grabber);
grabber.stop();
grabber.close();
} @Test
public void testVideo() throws FrameGrabber.Exception, InterruptedException, MalformedURLException {
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault("rtmp://127.0.0.1:12580/live/app"); //这里也可以是本地文件,也可以网络文件。如:rtmp://127.0.0.1:12580/live/app
grabber.setImageWidth(1366);
grabber.setImageHeight(768);
grabber.start();
showFrames("Video", grabber);
grabber.stop();
grabber.close();
} @Test
public void testFaceRecognize() throws FrameGrabber.Exception, InterruptedException, MalformedURLException, FrameRecorder.Exception {
OpenCVFrameGrabber grabber = OpenCVFrameGrabber.createDefault(0);
grabber.start();
showFramesWithFace("Video", grabber);
grabber.stop();
grabber.close();
} }
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_objdetect;
import org.bytedeco.javacv.*; public class Test {
public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception, InterruptedException {
// Preload the opencv_objdetect module to work around a known bug.
String str = Loader.load(opencv_objdetect.class);
System.out.println(str); FrameGrabber grabber = FrameGrabber.createDefault(0);
grabber.start();
Frame grabbedImage = grabber.grab();//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加
int width = grabbedImage.imageWidth;
int height = grabbedImage.imageHeight; String outputFile = "d:\\record.mp4";
//String outputFile = "rtmp://127.0.0.1:1935/rtmplive/picamera";
FrameRecorder recorder = FrameRecorder.createDefault(outputFile, width, height); //org.bytedeco.javacv.FFmpegFrameRecorder
System.out.println(recorder.getClass().getName());//org.bytedeco.javacv.FFmpegFrameRecorder
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// avcodec.AV_CODEC_ID_H264,编码
recorder.setFormat("flv");//封装格式,如果是推送到rtmp就必须是flv封装格式
recorder.setFrameRate(25);
recorder.start();//开启录制器
long startTime = 0;
long videoTS;
CanvasFrame frame = new CanvasFrame("camera", CanvasFrame.getDefaultGamma() / grabber.getGamma()); //2.2/2.2=1
//frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setAlwaysOnTop(true);
Frame rotatedFrame;
while (frame.isVisible() && (rotatedFrame = grabber.grab()) != null) {
frame.showImage(rotatedFrame);
if (startTime == 0) {
startTime = System.currentTimeMillis();
}
videoTS = (System.currentTimeMillis() - startTime) * 1000;//这里要注意,注意位
recorder.setTimestamp(videoTS);
recorder.record(rotatedFrame);
Thread.sleep(40);
}
recorder.stop();
recorder.release();
frame.dispose();
grabber.stop();
grabber.close();
}
}
使用JavaCV播放视频、摄像头、人脸识别的更多相关文章
- Python3利用Dlib19.7实现摄像头人脸识别的方法
0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的: 可以自动从摄像头中抠取人脸图片存储到本地,然后提取构建 ...
- Python 3 利用 Dlib 19.7 实现摄像头人脸识别
0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的: 可以自动从摄像头中抠取人脸图片存储到本地: 根据抠取的 ...
- OpenCV摄像头人脸识别
注: 从外设摄像装置中获取图像帧,把每帧的图片与人脸特征进行匹配,用方框框住识别出来的人脸 需要用到的函数: CvHaarClassifierCascade* cvLoadHaarClassifier ...
- matlab-调用摄像头人脸识别
----------------------------边学边写边学习------------------------------------- 版本:2014a 调用摄像头 a = imaqhwin ...
- C# 视频多人脸识别
上一篇内容的调整,并按 @轮回 的说法,提交到git了,https://github.com/catzhou2002/ArcFaceDemo 基本思路如下: 一.识别线程 1.获取当前图片 2.识别当 ...
- C# 视频多人脸识别的实现过程
整个项目是用虹软技术完成开发 上一篇内容的调整,提交到git了,https://github.com/catzhou2002/ArcFaceDemo 基本思路如下: 一.识别线程 1.获取当前图片 2 ...
- C# 视频多人脸识别的实现
上一篇内容的调整,提交到git了,https://github.com/catzhou2002/ArcFaceDemo基本思路如下:一.识别线程1.获取当前图片2.识别当前图片的人脸位置,并将结果存入 ...
- matlab使用摄像头人脸识别
#关于matlab如何读取图片.视频.摄像头设备数据# 参见:http://blog.csdn.net/u010177286/article/details/45646173 但是,关于摄像头读取,上 ...
- Github开源人脸识别项目face_recognition
Github开源人脸识别项目face_recognition 原文:https://www.jianshu.com/p/0b37452be63e 译者注: 本项目face_recognition是一个 ...
随机推荐
- python接口自动化测试二十九:yaml配置文件的写和读
# 先安装ruamel.yaml模块 写入配置文件: import os# 先安装ruamel.yaml模块from ruamel import yaml # 将字典写入到yamldict = { ' ...
- [转] 深入理解React 组件状态(State)
React 的核心思想是组件化的思想,应用由组件搭建而成,而组件中最重要的概念是State(状态),State是一个组件的UI数据模型,是组件渲染时的数据依据. 一. 如何定义State 定义一个合适 ...
- [Wc]Dface双面棋盘()
题解: 一道维护奇怪信息的线段树... 我刚开始看了标签想的是删去图上一个点后求连通性 发现不会 于是退化成一般图支持删除 插入 维护连通性 发现有2两种做法 1.lct维护 按照结束顺序先后排序,给 ...
- [AH2017/HNOI2017]礼物
题解: 水题 化简一波式子会发现就是个二次函数再加上一个常数 而只有常数中的-2sigma(xiyi)是随移动而变化的 所以只要o(1)求出二次函数最大值然后搞出sigma(xiyi)就可以了 这个东 ...
- 6-4 破碎的键盘 uva11988
基础的数组链表 用cur标记光标之前的 用last标记最后的十分巧妙 数组开的不够大会引起RE!! next[0]=0:这使得最后一项所指的为0 核心语句: next[i]=next[cur] ne ...
- 11.Django|中间件
中间件 文件夹为middlewareDemo 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨 ...
- 048 hive运行的相关配置
一:执行SQL的方式 1.配置的键值 2.minimal下运行fetch 3.设定hive.fetch.task.conversion=more 4.在more下运行fetch 二:虚拟列 一共三个虚 ...
- ACM笔记
写给自己看,纯属打发时间... Sacnf的返回值是成功赋值的变量个数 for(int i=0; i<100; i++) 在C++标准中指出for循环条件中定义的变量,作用域仅限于循环内部 ...
- STL容器底层数据结构的实现
C++ STL 的实现: 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque ...
- Manjaro 初始配置----anaconda-pycharm-opencv-tensorflow
1.安装蟒蛇 1)安装 yaourt anaconda source /opt/anaconda/bin/active root 2)添加环境变量 在〜/ .bashrc中添加 export PATH ...