【Java】人流量统计-动态版之视频转图识别请访问 http://ai.baidu.com/forum/topic/show/940413

本文是基于上一篇进行迭代的。本文主要是以摄像头画面进行人流量统计。并对返回图像进行展示。需要额外了解JavaCV OpenCV swing awt等

也许JavaCV OpenCV  不需要也可以实现效果。但是小帅丶就先用这样的方式实现了。别的方式大家就自己尝试吧

项目代码地址 https://gitee.com/xshuai/bodyTrack

注意的问题

1.动态识别的area参数为矩阵的4个顶点的xy坐标(即像素) 顺序是 上左下右 也就是顺时针一圈4个点的坐标点

2.case_id为int 请不要给大于int范围的值。或非int类型的值 即正整数就行

3.area的值不要大于图片本身的宽高

需要用到的jar 通过maven引入(下载的jar较多。需要等待较长时间)

https://gitee.com/xshuai/bodyTrack/blob/master/pom.xml

自行查看项目POM文件吧。社区对xml html标签进行了解析导致丢失了

需要用到的Java工具类

HttpUtil https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3

调用接口示例代码(需要自己的电脑有摄像头哦)

import java.awt.image.BufferedImage;

import java.awt.image.DataBufferByte;

import java.awt.image.WritableRaster;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.net.URLEncoder;

import java.util.Base64;

import java.util.Base64.Decoder;

import java.util.Base64.Encoder;

import javax.imageio.ImageIO;

import javax.swing.JFrame;

import org.bytedeco.javacpp.BytePointer;

import org.bytedeco.javacpp.opencv_core.IplImage;

import org.bytedeco.javacv.CanvasFrame;

import org.bytedeco.javacv.Frame;

import org.bytedeco.javacv.Java2DFrameConverter;

import org.bytedeco.javacv.OpenCVFrameConverter;

import org.bytedeco.javacv.OpenCVFrameConverter.ToIplImage;

import org.bytedeco.javacv.OpenCVFrameGrabber;

import com.alibaba.fastjson.JSONObject;

import cn.xsshome.body.util.HttpUtil;

/**

* 获取摄像头画面进行处理并回显图片在画面中

* 人流量统计(动态版)JavaAPI示例代码

* @author 小帅丶

*

*/

public class JavavcCameraTest {

static OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();

//人流量统计(动态版)接口地址

private static String BODY_TRACKING_URL="https://aip.baidubce.com/rest/2.0/image-classify/v1/body_tracking";

private static String ACCESS_TOKEN ="";//接口的token

/**

* 每个case的初始化信号,为true时对该case下的跟踪算法进行初始化,为false时重载该case的跟踪状态。当为false且读取不到相应case的信息时,直接重新初始化

* caseId=0 第一次请求 case_init=true caseId>0 非第一次请求 case_init=false

*/

static int caseId = 0;

public static void main(String[] args) throws Exception,

InterruptedException {

OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);

grabber.start(); // 开始获取摄像头数据

CanvasFrame canvas = new CanvasFrame("人流量实时统计");// 新建一个窗口

canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

canvas.setAlwaysOnTop(true);

int ex = 0;

while (true) {

if (!canvas.isDisplayable()) {// 窗口是否关闭

grabber.stop();// 停止抓取

System.exit(2);// 退出

grabber.close();

}

// canvas.showImage(grabber.grab());//显示摄像头抓取的画面

Java2DFrameConverter java2dFrameConverter = new Java2DFrameConverter();

// 摄像头抓取的画面转BufferedImage

BufferedImage bufferedImage = java2dFrameConverter.getBufferedImage(grabber.grabFrame());

// bufferedImage 请求API接口 检测人流量

String result = getBodyTrack(bufferedImage);

BufferedImage bufferedImageAPI = getAPIResult(result);

// 如果识别为空 则显示摄像头抓取的画面

if (null == bufferedImageAPI) {

canvas.showImage(grabber.grab());

} else {

// BufferedImage转IplImage

IplImage iplImageAPI = BufImgToIplData(bufferedImageAPI);

// 将IplImage转为Frame 并显示在窗口中

Frame convertFrame = converter.convert(iplImageAPI);

canvas.showImage(convertFrame);

}

ex++;

//Thread.sleep(100);// 100毫秒刷新一次图像.因为接口返回需要时间。所以看到的画面还是会有一定的延迟

}

}

/**

* BufferedImage转IplImage

* @param bufferedImageAPI

* @return

*/

private static IplImage BufImgToIplData(BufferedImage bufferedImageAPI) {

IplImage iplImage = null;

ToIplImage iplConverter = new OpenCVFrameConverter.ToIplImage();

Java2DFrameConverter java2dConverter = new Java2DFrameConverter();

iplImage = iplConverter.convert(java2dConverter.convert(bufferedImageAPI));

return iplImage;

}

/**

* IplImage 转 BufferedImage

* @param mat

* @return BufferedImage

*/

public static BufferedImage iplToBufImgData(IplImage mat) {

if (mat.height() > 0 && mat.width() > 0) {

//TYPE_3BYTE_BGR 表示一个具有 8 位 RGB 颜色分量的图像,对应于 Windows 风格的 BGR 颜色模型,具有用 3 字节存储的 Blue、Green 和 Red 三种颜色。

BufferedImage image = new BufferedImage(mat.width(), mat.height(),BufferedImage.TYPE_3BYTE_BGR);

WritableRaster raster = image.getRaster();

DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();

byte[] data = dataBuffer.getData();

BytePointer bytePointer = new BytePointer(data);

mat.imageData(bytePointer);

return image;

}

return null;

}

/**

* 接口结果转bufferimage

* @param result

* @return BufferedImage

* @throws Exception

*/

private static BufferedImage getAPIResult(String result) throws Exception {

JSONObject object = JSONObject.parseObject(result);

BufferedImage bufferedImage = null;

if(object.getInteger("person_num")>=1){

Decoder decoder = Base64.getDecoder();

byte [] b = decoder.decode(object.getString("image"));

ByteArrayInputStream in = new ByteArrayInputStream(b);

bufferedImage = ImageIO.read(in);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ImageIO.write(bufferedImage,"jpg", baos);

byte[] imageInByte = baos.toByteArray();

// Base64解码

for (int i = 0; i < imageInByte.length; ++i) {

if (imageInByte[i] < 0) {// 调整异常数据

imageInByte[i] += 256;

}

}

OutputStream out = new FileOutputStream("G:/testimg/xiaoshuairesult.jpg");//接口返回的渲染图

out.write(imageInByte);

out.flush();

out.close();

return bufferedImage;

}else{

return null;

}

}

/**

* 获取接口处理结果图

* @param bufferedImage

* @return String

* @throws Exception

*/

public static String getBodyTrack(BufferedImage bufferedImage) throws Exception{

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ImageIO.write(bufferedImage,"jpg",baos);

byte[] imageInByte = baos.toByteArray();

Encoder base64 = Base64.getEncoder();

String imageBase64 = base64.encodeToString(imageInByte);

// Base64解码

for (int i = 0; i < imageInByte.length; ++i) {

if (imageInByte[i] < 0) {// 调整异常数据

imageInByte[i] += 256;

}

}

// 生成jpeg图片

OutputStream out = new FileOutputStream("G:/testimg/xiaoshuai.jpg");// 新生成的图片

out.write(imageInByte);

out.flush();

out.close();

System.out.println("保存成功");

baos.flush();

baos.close();

String access_token = ACCESS_TOKEN;

String case_id = "2018";

String case_init = "";

String area = "10,10,630,10,630,470,10,469";

String params = "";

if(caseId==0){

case_init = "true";

params = "image=" + URLEncoder.encode(imageBase64, "utf-8")

+ "&dynamic=true&show=true&case_id=" + case_id

+ "&case_init="+case_init +"&area="+area;

}else{

case_init = "false";

params = "image=" + URLEncoder.encode(imageBase64, "utf-8")

+ "&dynamic=true&show=true&case_id=" + case_id

+ "&case_init="+case_init +"&area="+area;

}

//静态识别

// String params = "image=" + URLEncoder.encode(imageBase64, "utf-8")+"&dynamic=false&show=true";

String result = HttpUtil.post(BODY_TRACKING_URL, access_token, params);

System.out.println("接口内容==>"+result);

return result;

}

/**

* IplImage 转 BufferedImage

* @param mat

* @return BufferedImage

*/

public static BufferedImage bufferimgToBase64(IplImage mat) {

if (mat.height() > 0 && mat.width() > 0) {

BufferedImage image = new BufferedImage(mat.width(), mat.height(),BufferedImage.TYPE_3BYTE_BGR);

WritableRaster raster = image.getRaster();

DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();

byte[] data = dataBuffer.getData();

BytePointer bytePointer = new BytePointer(data);

mat.imageData(bytePointer);

return image;

}

return null;

}

}

摄像头中的内容截图示意(本人头像就不直接显示了。万一吓着大家呢) 也不要用去马赛克的技术还原图片哦。

还是很好玩的、不需要自己去整OpenCV一套就能实现统计摄像头中的人数。

java 网络流量统计_【Java】人流量统计-动态版之摄像头识别显示相关推荐

  1. java网络流量测量工具_使用Indy测量网络流量

    我正在使用TIdTCPCmdServer来处理与客户端应用程序的所有通信. 我希望我的服务器记录所有类型的东西,包括网络流量. 有没有简单或聪明的方法来查看TCPCmdServer实际收到和发送了多少 ...

  2. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  3. 局域网网络流量监控_【干货】Linux网络安全运维:网络流量监控与分析工具Ntop和Ntopng...

    本文授权转载自微信公众号:计算机与网络安全,转载请联系授权.对于单台服务器网络故障的排查,iftop工具可以轻松实现,但是在监控一个庞大的服务器网络,并且要分析每台主机以及端口的网络状态时,iftop ...

  4. kibana可视化统计_用户访问统计PV-IP-UV数据

    kibana可视化统计_用户访问统计PV-IP-UV数据 准备 点击可视化->点击添加 新建一个可视化New Visualization->选择Data Table 选择索引如图: 默认有 ...

  5. CNZZ 移动统计_移动数据统计_移动应用分析_ APP统计

    CNZZ 移动统计_移动数据统计_移动应用分析_ APP统计 http://mobile.cnzz.com/help.php?h=Android_SDK_Download_and_Usage_Manu ...

  6. java 网络抓包_基于java的网络抓包方法

    本实验是用java实现的网络抓包程序,在windows环境下安装winpcap4.0和jpcap6.0后,下载eclipse和jigloo插件(一种在eclipse底下作图形化开发的工具),将其安装好 ...

  7. linux 查看网络流量来源_详解Linux查看实时网卡流量的几种方式

    在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查看Linux服务器的实时网卡流量. 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众 ...

  8. java 基础面试 英文_[Java面试] 面试java基础总结大全

    原标题:[Java面试] 面试java基础总结大全 基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. ...

  9. java privatekey输出字符串_[Java教程]根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象_星空网...

    根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象 2012-05-29 0 1.字符串生成公钥对象 PublicKey /** * 实例化公钥 * * @re ...

最新文章

  1. 使用JavaMail发送邮件,465端口开启ssl加密传输
  2. Spring Cloud 爆高危漏洞!!!
  3. Leetcode-136. 只出现一次的数字(python3)
  4. 分享Java面试中的几个重要基础问题
  5. 初探Golang(4)-map和流程控制语句
  6. nacos服务配置中心演示
  7. 康宁玻璃ct值计算公式_【钦州】CT室铅板生产厂家
  8. c语言中字符串 x,使用c语言解析字符串176x144中的数字
  9. 测试面试题集-Python编程题(1)
  10. 自学python需要安装什么-初学 Python 需要安装哪些软件?
  11. easyUI-combotree的本地数据导入
  12. 方案展示 | 基于全志A40i的激光喷码机解决方案
  13. 使用spring data JPA进行类目增删改查测试
  14. 51单片机之实时秒表
  15. nssa和stub_ospf中stub区域和nssa区域的主要区别是什么?
  16. 洛阳九县八取名字_洛阳市地图(洛阳市九县六区地图)
  17. kodi linux版本,Linux下安装多媒体中心 Kodi 18.8 新版本并设置中文界面
  18. hdu 4500 小Q系列故事——屌丝的逆袭
  19. 阿里云部署Java开发环境
  20. VOT 2015 Benchmark 使用教程

热门文章

  1. Halcon3D学习笔记
  2. Java,导出Excel表格文件
  3. anki 中使用 u,m 键上下滑动页面
  4. 分享10个站内优化技巧 - 孔宇SEO
  5. 回归,不忘初心,再出发!
  6. 亡羊补牢——出现系统丢失MSVCR120d.dll、MSVCP120d.dll丢失的问题
  7. 游戏本天梯_实况足球手游国服5月天梯胜率榜+极品补丁一枚
  8. 日语能力考试流程及时间安排的说明
  9. threejs案例水天一色小岛(跟着b站老陈写的)
  10. 思科和华为常见命令对比