基于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; ...
随机推荐
- 2019-02-20 在PyPI测试平台发布Python包
参考Packaging Python Projects, 源码在nobodxbodon/test-package-for-pypi 包名/__init__.py: 测试变量 = "值&quo ...
- TS学习随笔(六)->断言
now,我们来看一看TS里面的断言,听起来很上档次啊,其实看完你就发出惊叹,这就是断言啊 类型断言 类型断言(Type Assertion)可以用来手动指定一个值的类型 语法 <类型>值 ...
- SuperMap -WebGL 实现地球的背景透明并显示自定义图片
实现效果如图: 实现代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost
Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost 问题:Tomcat服务器的端口被占用 解决: ...
- Error: Invoke-customs are only supported starting with Android O (--min-api 26)
项目报错: 完美解决: 在App下 gradle.build中Android标签中 添加以下内容: compileOptions { sourceCompatibility JavaVersion.V ...
- spring学习总结——装配Bean学习三(xml装配bean)
通过XML装配bean Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了.不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用 ...
- org.springframework.beans.factory.NoUniqueBeanDefinitionException 导致原因之一
导致此异常原因很多,以下仅是针对其中一种因素的解决办法. 下面是DAO接口.Service接口.Service实现类的全路径名(全部定义在com.xxx.projetc包下) com.xxx.proj ...
- Cube的高级设置
分享来源地址:http://bigdata.51cto.com/art/201705/538648.htm Cube的高级设置 随着维度数目的增加,Cuboid 的数量会爆炸式地增长.为了缓解 Cub ...
- tomcat设置开机启动
一.windows 1. 下载tomcat 2. 进入bin目录,查看是否存在service.dat,如果没有自行创建 3. 打开cmd,进入tomcat>bin目录 说明:用法: servic ...
- Vue学习之路1-集成环境安装
1.前言 Vue 是一款友好的.多用途且高性能的javascript框架,与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用,它能够帮你创建可维护性和可测试性更强的代码库,Vue是渐进式的j ...