【Java】人流量统计-动态版之视频转图识别
用户已被禁言 发布于2018-11 浏览:18561 回复: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
#37用户已被禁言回复于2020-05
#36 Mensongs筱回复
楼主 想问下 咱这个可以连接指定的摄像头吗 不是本地的

这个不清楚。建议你自己研究研究。

0
#36Mensongs筱回复于2020-05

楼主 想问下 咱这个可以连接指定的摄像头吗 不是本地的

0
#35用户已被禁言回复于2020-03
#34 130******93回复
楼主Exception in thread "main" java.lang.NoClassDefFoundError: org/bytedeco/ffmpeg/avformat/Read_packet_Pointer_BytePointer_int这是什么错百度不出来.......楼主这个能不能给份源代码或者教我一下怎么导入抽帧的图片序列我只会导入一张图片.........
展开

博文就都是亲测OK才分享的。

源码地址另一篇文章提供了。  项目代码地址 https://gitee.com/xshuai/bodyTrack  全部源码提供的。

0
#34130******93回复于2020-03

楼主Exception in thread "main" java.lang.NoClassDefFoundError: org/bytedeco/ffmpeg/avformat/Read_packet_Pointer_BytePointer_int这是什么错百度不出来.......楼主这个能不能给份源代码或者教我一下怎么导入抽帧的图片序列我只会导入一张图片.........

0
#33才能我浪费99回复于2019-12

写的很用心

0
#32果断叫小黑回复于2019-11
#29 小李寻猫回复
这个怎么能记录来和走人的人数

其实这个就是市面上客流相机的算法、如果有做这方面算法的朋友可以问问+

0
#31小李寻猫回复于2019-10
#28 果断叫小黑回复
还是不知道视频转图片之后咋统计的人流量。

你做成功了吗

0
#30用户已被禁言回复于2019-10
#29 小李寻猫回复
这个怎么能记录来和走人的人数

这个不太清楚哦。提交工单咨询一下百度官方人员吧。

1
#29小李寻猫回复于2019-10

这个怎么能记录来和走人的人数

0
#28果断叫小黑回复于2019-07

还是不知道视频转图片之后咋统计的人流量。

0
#27用户已被禁言回复于2019-07
#26 Du5tC1ear回复
你好   我想问问这个项目怎么运行呢

main方法运行。需要会Java、Maven。最好Maven搭建

0
#26Du5tC1ear回复于2019-07

你好   我想问问这个项目怎么运行呢

0
#25用户已被禁言回复于2019-04
#24 liguanghui2588回复
这个每秒多少帧是摄像头决定的?

应该是吧。我也没太多研究过。只是给大家实现一下效果。

1
#24liguanghui2588回复于2019-04

这个每秒多少帧是摄像头决定的?

0
#23wangwei8638回复于2019-04

强悍,有没有python版的代码

0
#21189******80回复于2018-11
#14 儒雅的李建辉回复
说得没错,共同期待呀

一起期待

0
#20摩羯Benefiting回复于2018-11
#19 蓝色的湖8889回复
动态版比静态难多了,之于我很有用

楼主真的费心啦

0
#19蓝色的湖8889回复于2018-11

动态版比静态难多了,之于我很有用

0
#18才能我浪费99回复于2018-11

代码很实用,点赞

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

不错

0
TOP
切换版块