最后编辑于2020-05
本帖主要示例人流量统计-动态版接口。通过读取视频转图片识别。直接获取摄像头的识别示例请访问http://ai.baidu.com/forum/topic/show/940536
ffmepg javacv 请自行百度了解一下
【Java】人流量统计-动态版之摄像头识别显示 http://ai.baidu.com/forum/topic/show/940536
- 需要用到的jar
//xml格式会丢失标签。社区技术要看一下哦。语言最好也支持xml 开发者们自行访问 URL地址 复制maven的xml配置内容即可
// URL: https://mvnrepository.com/artifact/org.bytedeco/javacv
compile group: 'org.bytedeco', name: 'javacv', version: '1.4.1'
// URL: https://mvnrepository.com/artifact/com.alibaba/fastjson
compile group: 'com.alibaba', name: 'fastjson', version: '1.2.35'
// URL: https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/ffmpeg-platform
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg-platform', version: '3.2.1-1.3'
- 需要用到的Java工具类
FileUtil=https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
Base64Util=https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
HttpUtil=https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
- 小帅写的工具类(仅供参考不接受批评code low不low)
import java.awt.image.BufferedImage;
import java.io.IOException;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
/**
* 视频转图片
* @author 小帅丶
*/
public class VideoFrame2ImageUtil {
private static FFmpegFrameGrabber fFmpegFrameGrabber;
/**
* 获取视频一帧内容转为BufferedImage
* 将视频文件帧处理并以“jpg”格式进行存储。
* 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
* @param videoPath 视频本地路径地址包含视频文件名称和后缀名
*/
public static BufferedImage getVideoFramer4bufferedImage(String videoPath) {
//Frame对象
Frame frame = null;
BufferedImage bufferedImage = null;
//获取视频文件
fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath);
try {
fFmpegFrameGrabber.start();
//获取视频每秒的帧数
double secondFramr = fFmpegFrameGrabber.getFrameRate();
System.out.println("视频一秒的帧数: " + secondFramr);
//获取视频总帧数
int ftp = fFmpegFrameGrabber.getLengthInFrames();
System.out.println("视频时长(秒): " + ftp/fFmpegFrameGrabber.getFrameRate());
System.out.println("开始运行视频提取一帧并返回BufferedImage,耗时较短");
// 获取帧
frame = fFmpegFrameGrabber.grabImage();
if (frame != null) {
bufferedImage = FrameToBufferedImage(frame);
}
System.out.println("============运行结束============");
fFmpegFrameGrabber.stop();
fFmpegFrameGrabber.close();
} catch (IOException e) {
System.out.println("出现异常了"+e.getMessage());
}
return bufferedImage;
}
/**
* FrameToBufferedImage Frame转BufferedImage
* @param frame
* @return BufferedImage
*/
public static BufferedImage FrameToBufferedImage(Frame frame) {
// 创建BufferedImage对象
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}
- 调用接口示例代码
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.net.URLEncoder;
import javax.imageio.ImageIO;
import cn.xsshome.util.Base64Util;
import cn.xsshome.util.HttpUtil;
import cn.xsshome.util.VideoFrame2ImageUtil;
/**
* 视频帧转图片请求人流量统计(动态版)接口
* @author 小帅丶
*
*/
public class BodyTrackingAPISample {
//人流量统计(动态版)接口地址
private static String BODY_TRACKING_URL="https://aip.baidubce.com/rest/2.0/image-classify/v1/body_tracking";
public static void main(String[] args) throws Exception {
String access_token = "token";
String videoPath = "本地一个视频文件路径";
BufferedImage bufferedImage = VideoFrame2ImageUtil.getVideoFramer4bufferedImage(videoPath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", baos);
//转为base64
String base64 = Base64Util.encode(baos.toByteArray());
String params = "image="+URLEncoder.encode(base64,"utf-8")+"&dynamic=false&show=true";
String result = HttpUtil.post(BODY_TRACKING_URL, access_token, params );
System.out.println(result);
}
}
TOP
切换版块
示例代码的分享很方便了
确实是,动态版更强大
说得没错,共同期待呀
解决问题的思路总是越讨论就越清晰,期待看到各位的实现方案。
提供了不错的思路~
人流统计问题,我认为关键是两个因素:(1)人的密度;(2)流速;
第一个因素感觉不难解决,人头数/面积就可以得到单位面积的人数,由于是动态统计可以每隔一段时间t1统计一次,频率不用过于频繁,数据要求大致准确即可满足大部分需求;
第二个因素会比较复杂一点,初步想了一个方案,大家看看是否有可操作性,每隔一个较长时间间隔t1记录一个较短时间间隔t2内的所有人头移动的距离,分别/t2得到每个人瞬时速度,再取均值得到瞬时人群流速;
这样一来,全天或者某个时段的人流都可以方便的通过对时段内每个t1的流速进行微积分处理来求得。
大家也可以集思广益看看是否还有更简洁恰当的方案。
你可以按24帧存一张图片。那一分钟就是60张了
这个问题好。建议你问问百度的相关负责人
人流量统计总是觉得很难的
另外不同帧画面相同的人头像如何去重呢?
每秒如果是24帧的话,每秒就存储24帧,那么一分钟 就有 60*24 的图片,是不是需要巨大的存储
动态版也是很智能啦
厉害厉害,获益了,学习
coding可high了呢 帅总
帅总威武,又来造福大家啦!~