基于JavaCv并发读取本地视频流并提取每帧32位dhash特征
1.读取本地视频流,pom依赖
依赖于 org.bytedeco下的javacv/opencv/ffmpeg 包
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv</artifactId>
<version>3.4.-1.4.</version>
<classifier>linux-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.0.-1.4.</version>
<classifier>linux-x86_64</classifier>
</dependency>
2.读取本地视频流并解帧为 opencv_core.Mat
File file = new File("/home/lab/javacv/t11.mp4");
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(file);
grabber.start();
// 解帧为opencv_core.Mat
List<opencv_core.Mat> mats = new ArrayList<>();
for (int i = ; i < grabber.getLengthInFrames(); i++) {
Frame frame = grabber.grabImage();
OpenCVFrameConverter.ToMat toMat = new OpenCVFrameConverter.ToMat();
opencv_core.Mat mat = toMat.convert(frame);
if (mat != null) {
mats.add(mat.clone());
}
}
grabber.stop();
3.获取32位dhash特征
dhash特征提取思路,图片Mat转为单通道的灰度图,并重置为5*5的Size,最后将其转储为长度为 25 的byte数组用以求取32位dhash特征
// 声明空的灰度图 Mat
opencv_core.Mat grayImg = new opencv_core.Mat(mat.rows(), mat.cols(), opencv_imgcodecs.IMREAD_GRAYSCALE);
// 转储为灰度图
opencv_imgproc.cvtColor(mat, grayImg, opencv_imgproc.COLOR_RGB2GRAY);
// 修改Mat长宽size
opencv_core.Mat resizedImg = new opencv_core.Mat();
opencv_core.Size size = new opencv_core.Size(,);
opencv_imgproc.resize(grayImg,resizedImg,size);
// 转为 5*5 byte 数组
byte[] bytePixels = new byte[ * ];
resizedImg.data().get(bytePixels);
int[] pixels = new int[bytePixels.length];
for (int i=; i<pixels.length; i++) {
pixels[i] = bytePixels[i] & 0xff;
}
// 获取32位dhash特征
int feature = ;
for (int j=; j<; j++) {
for (int i=; i<; i++) {
int colBit = pixels[i*+j] > pixels[(i+)*+j] ? : ;
feature = (feature << ) + colBit;
int rowBit = pixels[i*+j] > pixels[i*+j+] ? : ;
feature = (feature << ) + rowBit;
}
}
多线程部分,可参考该博: https://www.cnblogs.com/nyatom/p/10119306.html
基于JavaCv并发读取本地视频流并提取每帧32位dhash特征的更多相关文章
- [Tool] Chrome内的本地网页,使用XMLHttpRequest读取本地档案
[Tool] Chrome内的本地网页,使用XMLHttpRequest读取本地档案 问题情景 开发Cordova这类以网页内容作为UI的Hybrid APP时,开发人员可以使用IDE的功能将程序布署 ...
- [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案
[Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案 问题情景 在Android里,可以使用WebView来呈现本地或是远程的网页内容.但是在显示本地网页时,如 ...
- 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互
实际上我们通常是使用WebView控件对本地html进行读取,这样就可以体会类似web app和安卓原生混合开发的乐趣了.在读取本地html并展示在前台的时候,并不需要在Androidmenifast ...
- .NET 读取本地文件绑定到GridViewRow
wjgl.aspx.cs: using System; using System.Collections; using System.Configuration; using System.Data; ...
- 读取本地外网IP地址
读取本地外网IP地址. 根据启动并运行的网卡名称,找到本机实际的IP地址(已知当前运行的无线网卡名包含某一个字符) import java.net.InterfaceAddress; import j ...
- 前台JS(type=‘file’)读取本地文件的内容,兼容各种浏览器
[自己测了下,能兼容各种浏览器,但是读取中文会出现乱码.自己的解决方法是用notepad++把txt文件编码改为utf-8(应该是和浏览器编码保持一致吧?..)] 原文 http://blog.cs ...
- 手工创建tomcat应用,以及实现js读取本地文件内容
手工创建tomcat应用: 1.在webapps下面新建应用目录文件夹 2.在文件夹下创建或是从其他应用中复制:META-INF,WEB-INF这两个文件夹, 其中META-INF清空里面,WEB-I ...
- window.open()读取本地图片简单使用总结
最近做了一个项目,需要读取本地图片出来,问了一些人,感觉在数据库中存取路径比较合适,故做此方法. 后台查询出来的路径
- 读取本地excel发短信
package com.cmcc.zysoft.sellmanager.controller; import java.io.File; import java.io.FileInputStream; ...
随机推荐
- #WEB安全基础 : HTML/CSS | 0x7HTML5和W3C验证
标准,标准,什么都有标准 你听说过HTML5吗?这是一个新版本,当然也有新标准 我只准备了一个index.html文件 以下是代码 <!DOCTYPE html> <!--告诉浏览器 ...
- 推荐一款好用的office转换PDF工具
北京博信施科技有限公司是一家专业从事数据格式转换.数据处理领域研发软件产品和解决方案实施的技术型公司.在当今信息时代,PDF文档格式是在Internet上进行电子文档发行和数字化信息传播的理想文档格式 ...
- linux命令df中df -h和df -i
df 命令: linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [ ...
- join的简单总结
BAT面试题:现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多 ...
- DVWA 黑客攻防演练(一) 介绍及安装
原本是像写一篇 SELinux 的文章的.而我写总结文章的时候,总会去想原因是什么,为什么会有这种需求.而我发觉 SELinux 的需求是编程人员的神奇代码或者维护者的脑袋短路而造成系统容易被攻击.就 ...
- spring学习总结——高级装配学习二(处理自动装配的歧义性)
我们已经看到如何使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中.自动装配能够提供很大的帮助.不过,spring容器中仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不 ...
- 智能POS如何获取日志&数据库文件
使用Teamviewer连接安卓机器,文件传输 ================================================================== 智能POS查看数据 ...
- PJSUA2开发文档--第五章 帐户(号)Accounts
第五章 帐户(号) 帐户提供正在使用该应用程序的用户的身份(或身份).一个帐户有一个与之相关的SIP统一资源标识符(URI).在SIP术语中,该URI用作该人的记录地址( Address of Rec ...
- LeetCode算法题-Poor Pigs(Java实现)
这是悦乐书的第235次更新,第248篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第102题(顺位题号是455).有1000个水桶,其中只有一个水桶含有毒药,其余的都没毒 ...
- centos下 telnet访问百度
先在命令行输入以下命令: telnet www.baidu.com 80 点击确认之后出现如下界面 然后接着输入以下两行命令 GET /index.html HTTP/1.1 Host: www.ba ...