【Java】人流量统计-动态版之视频转图识别
用户已被禁言 发布于2018-11 浏览:18362 回复:35
10
收藏
最后编辑于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);
	}
}
收藏
点赞
10
个赞
共35条回复 最后由用户已被禁言回复于2020-05
#16儒雅的李建辉回复于2018-11

示例代码的分享很方便了

0
#15189******80回复于2018-11
#5 我就是九候回复
动态版也是很智能啦

确实是,动态版更强大

0
#14儒雅的李建辉回复于2018-11
#13 13897996271回复
解决问题的思路总是越讨论就越清晰,期待看到各位的实现方案。

说得没错,共同期待呀

1
#1313897996271回复于2018-11
#12 我就是九候回复
提供了不错的思路~

解决问题的思路总是越讨论就越清晰,期待看到各位的实现方案。

0
#12我就是九候回复于2018-11
#11 13897996271回复
人流统计问题,我认为关键是两个因素:(1)人的密度;(2)流速; 第一个因素感觉不难解决,人头数/面积就可以得到单位面积的人数,由于是动态统计可以每隔一段时间t1统计一次,频率不用过于频繁,数据要求大致准确即可满足大部分需求; 第二个因素会比较复杂一点,初步想了一个方案,大家看看是否有可操作性,每隔一个较长时间间隔t1记录一个较短时间间隔t2内的所有人头移动的距离,分别/t2得到每个人瞬时速度,再取均值得到瞬时人群流速; 这样一来,全天或者某个时段的人流都可以方便的通过对时段内每个t1的流速进行微积分处理来求得。 大家也可以集思广益看看是否还有更简洁恰当的方案。
展开

提供了不错的思路~

0
#1113897996271回复于2018-11

人流统计问题,我认为关键是两个因素:(1)人的密度;(2)流速;

第一个因素感觉不难解决,人头数/面积就可以得到单位面积的人数,由于是动态统计可以每隔一段时间t1统计一次,频率不用过于频繁,数据要求大致准确即可满足大部分需求;

第二个因素会比较复杂一点,初步想了一个方案,大家看看是否有可操作性,每隔一个较长时间间隔t1记录一个较短时间间隔t2内的所有人头移动的距离,分别/t2得到每个人瞬时速度,再取均值得到瞬时人群流速;

这样一来,全天或者某个时段的人流都可以方便的通过对时段内每个t1的流速进行微积分处理来求得。

大家也可以集思广益看看是否还有更简洁恰当的方案。

0
#10用户已被禁言回复于2018-11
#6 mxw2552261回复
每秒如果是24帧的话,每秒就存储24帧,那么一分钟 就有 60*24 的图片,是不是需要巨大的存储
展开

你可以按24帧存一张图片。那一分钟就是60张了

1
#9用户已被禁言回复于2018-11
#7 mxw2552261回复
另外不同帧画面相同的人头像如何去重呢?

这个问题好。建议你问问百度的相关负责人

1
#8天空之城23568回复于2018-11

人流量统计总是觉得很难的

0
#7mxw2552261回复于2018-11

另外不同帧画面相同的人头像如何去重呢?

0
#6mxw2552261回复于2018-11

每秒如果是24帧的话,每秒就存储24帧,那么一分钟 就有 60*24 的图片,是不是需要巨大的存储

0
#5我就是九候回复于2018-11

动态版也是很智能啦

0
#4189******80回复于2018-11

厉害厉害,获益了,学习

0
#3goJhou回复于2018-11

coding可high了呢 帅总

0
#2melissayoung回复于2018-11

帅总威武,又来造福大家啦!~

0
TOP
切换版块