开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术
AR与VR
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
信息服务
智能园区

车流统计(邀测)

车流统计不再提供公有云邀测服务,若您仍需要使用车流统计,您可以选择私有化部署,提交合作咨询联系我们。

接口描述

根据传入的连续视频图片序列,进行车辆检测和追踪,返回每个车辆的坐标位置、车辆类型(包括小汽车、卡车、巴士、摩托车、三轮车5类)。在原图中指定区域,根据车辆轨迹判断驶入/驶出区域的行为,统计各类车辆的区域进出车流量,可返回含统计值和跟踪框的渲染图。

(注:抽祯频率需>2fps,否则无法有效跟踪,建议5fps。)

当前主要适用于普通监控场景,如道路、停车场等,无人机高空拍摄的图片,因车辆目标较小,识别效果可能欠佳,后续会扩展支持超高空拍摄场景,如有该场景的需求,请通过QQ群或提交工单,详细沟通测试情况。

渲染图示例:

请求说明

请求示例

HTTP 方法:POST

请求URL:https://aip.baidubce.com/rest/2.0/image-classify/v1/traffic_flow

URL参数:

参数
access_token 通过API Key和Secret Key获取的access_token,参考“Access Token获取

Header如下:

参数
Content-Type application/x-www-form-urlencoded

Body中放置请求参数,参数详情如下:

请求参数

参数 是否必选 类型 取值范围 说明
image 和url二选一 string 0-255彩色图像(base64编码) 图像数据,Base64编码字符串,不超过4M。最短边至少50px,最长边最多4096px。支持图片格式:jpg,bmp,png。 注意:图片的base64编码是不包含图片头的,如(data:image/jpg;base64,)
url 和image二选一 string 0-255彩色图像(base64编码) 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少50px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效。
case_id int32 - 任务ID(通过case_id区分不同视频流,自拟,不同序列间不可重复)
case_init string true/false 每个case的初始化信号,为true时对该case下的跟踪算法进行初始化,为false时重载该case的跟踪状态。当为false且读取不到相应case的信息时,直接重新初始化
show string true/false 是否返回结果图(含统计值和跟踪框)。选true时返回渲染后的图片(base64),其它无效值或为空则默认false。
area string 小于原图像素范围 只统计进出该区域的车辆。
逗号分隔,如‘x1,y1,x2,y2,x3,y3...xn,yn',按顺序依次给出每个顶点的x、y坐标(默认尾点和首点相连),形成闭合多边形区域。
服务会做范围(顶点左边需在图像范围内)及个数校验(数组长度必须为偶数,且大于3个顶点)。只支持单个多边形区域,建议设置矩形框,即4个顶点。坐标取值不能超过图像宽度和高度,比如1280的宽度,坐标值最大到1279

area参数设置说明

进出区域方向:从区域外走到区域内就是in,相反就是out。

如下图:绿色框为区域框,左边红色箭头的方向为in,右边蓝色箭头的方向为out。

请求代码示例

提示一:使用示例代码前,请记得替换其中的示例Token、图片地址或Base64信息。

提示二:部分语言依赖的类或库,请在代码注释中查看下载地址。

curl -i -k 'https://aip.baidubce.com/rest/2.0/image-classify/v1/traffic_flow?access_token=【调用鉴权接口获取的token】' --data 'area=1,1,719,1,719,719,1,719&case_id=1&case_init=false&image=【图片Base64编码,需UrlEncode】' -H 'Content-Type:application/x-www-form-urlencoded'
<?php
/**
 * 发起http post请求(REST API), 并获取REST请求的结果
 * @param string $url
 * @param string $param
 * @return - http response body if succeeds, else false.
 */
function request_post($url = '', $param = '')
{
    if (empty($url) || empty($param)) {
        return false;
    }

    $postUrl = $url;
    $curlPost = $param;
    // 初始化curl
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $postUrl);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 要求结果为字符串且输出到屏幕上
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    // post提交方式
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
    // 运行curl
    $data = curl_exec($curl);
    curl_close($curl);

    return $data;
}

$token = '[调用鉴权接口获取的token]';
$url = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/traffic_flow?access_token=' . $token;
$img = file_get_contents('[本地文件路径]');
$img = base64_encode($img);
$bodys = array(
    'area' => "1,1,719,1,719,719,1,719",
    'case_id' => 1,
    'case_init' => "false",
    'image' => $img
);
$res = request_post($url, $bodys);

var_dump($res);
package com.baidu.ai.aip;

import com.baidu.ai.aip.utils.Base64Util;
import com.baidu.ai.aip.utils.FileUtil;
import com.baidu.ai.aip.utils.HttpUtil;

import java.net.URLEncoder;

/**
* 车流统计
*/
public class TrafficFlow {

    /**
    * 重要提示代码中所需工具类
    * FileUtil,Base64Util,HttpUtil,GsonUtils请从
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下载
    */
    public static String traffic_flow() {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/traffic_flow";
        try {
            // 本地文件路径
            String filePath = "[本地文件路径]";
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "area=" + "1,1,719,1,719,719,1,719" + "&case_id=" + 1 + "&case_init=" + "false" + "&image=" + imgParam;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = "[调用鉴权接口获取的token]";

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        TrafficFlow.traffic_flow();
    }
}
# encoding:utf-8

import requests
import base64

'''
车流统计
'''

request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/traffic_flow"
# 二进制方式打开图片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())

params = {"area":"1,1,719,1,719,719,1,719","case_id":1,"case_init":"false","image":img}
access_token = '[调用鉴权接口获取的token]'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
    print (response.json())
#include <iostream>
#include <curl/curl.h>

// libcurl库下载链接:https://curl.haxx.se/download.html
// jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
const static std::string request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/traffic_flow";
static std::string traffic_flow_result;
/**
 * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
 * @param 参数定义见libcurl文档
 * @return 返回值定义见libcurl文档
 */
static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    // 获取到的body存放在ptr中,先将其转换为string格式
    traffic_flow_result = std::string((char *) ptr, size * nmemb);
    return size * nmemb;
}
/**
 * 车流统计
 * @return 调用成功返回0,发生错误返回其他错误码
 */
int traffic_flow(std::string &json_result, const std::string &access_token) {
    std::string url = request_url + "?access_token=" + access_token;
    CURL *curl = NULL;
    CURLcode result_code;
    int is_success;
    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url.data());
        curl_easy_setopt(curl, CURLOPT_POST, 1);
        curl_httppost *post = NULL;
        curl_httppost *last = NULL;
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "area", CURLFORM_COPYCONTENTS, "1,1,719,1,719,719,1,719", CURLFORM_END);
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "case_id", CURLFORM_COPYCONTENTS, "1", CURLFORM_END);
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "case_init", CURLFORM_COPYCONTENTS, "false", CURLFORM_END);
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS, "【base64_img】", CURLFORM_END);

        curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
        result_code = curl_easy_perform(curl);
        if (result_code != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                    curl_easy_strerror(result_code));
            is_success = 1;
            return is_success;
        }
        json_result = traffic_flow_result;
        curl_easy_cleanup(curl);
        is_success = 0;
    } else {
        fprintf(stderr, "curl_easy_init() failed.");
        is_success = 1;
    }
    return is_success;
}
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

namespace com.baidu.ai
{
    public class TrafficFlow
    {
        // 车流统计
        public static string traffic_flow()
        {
            string token = "[调用鉴权接口获取的token]";
            string host = "https://aip.baidubce.com/rest/2.0/image-classify/v1/traffic_flow?access_token=" + token;
            Encoding encoding = Encoding.Default;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            // 图片的base64编码
            string base64 = getFileBase64("[本地图片文件]");
            String str = "area=" + "1,1,719,1,719,719,1,719" + "&case_id=" + 1 + "&case_init=" + "false" + "&image=" + HttpUtility.UrlEncode(base64);
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string result = reader.ReadToEnd();
            Console.WriteLine("车流统计:");
            Console.WriteLine(result);
            return result;
        }

        public static String getFileBase64(String fileName) {
            FileStream filestream = new FileStream(fileName, FileMode.Open);
            byte[] arr = new byte[filestream.Length];
            filestream.Read(arr, 0, (int)filestream.Length);
            string baser64 = Convert.ToBase64String(arr);
            filestream.Close();
            return baser64;
        }
    }
}

返回说明

返回参数

字段 是否必选 类型 说明
vehicle_num object 检测到的车辆数目
+car int 小汽车数量
+truck int 卡车数量
+bus int 巴士数量
+motorbike int 摩托车数量
+tricycle int 三轮车数量
vehicle_info object[] 每个框的具体信息
+location object 跟踪到的车辆检测框位置
++left int 车辆检测框左坐标
++top int 车辆检测框顶坐标
++width int 车辆检测框宽度
++height int 车辆检测框高度
+ID int 车辆的ID编号
+type string 车辆类型
vehicle_count object[] 进出区域的车流统计
+car object 小汽车
++in int 当前帧相应车辆驶入区域的瞬时数量,如要计算某一段时间内进入区域的累计车辆数,可基于连续帧图片的返回结果计算得到
++out int 当前帧相应车辆驶出区域的瞬时数量,如要计算某一段时间内离开区域的累计车辆数,可基于连续帧图片的返回结果计算得到
+truck object 卡车
++in int
++out int
+bus object 巴士
++in int
++out int
+motorbike object 摩托车
++in int
++out int
+tricycle object 三轮车
++in int
++out int
image string 结果图,含跟踪框和统计值(渲染jpg图片byte内容的base64编码,得到后先做base64解码再以字节流形式imdecode)

渲染结果图说明

画面里刚出现的车辆检测框都是红色,被跟踪锁定之后会变成其他颜色(颜色随机,不同颜色没有特定规律),模型根据同颜色框的运动轨迹来判断进出移动方向;车辆被跟踪锁定后,检测框上方会出现车辆的ID编号,ID的取值逻辑为:每个case从1开始,不同车辆向上递增但不一定连续。

返回示例

未检测到任何车:

{
    "vehicle_num":
    {
        "car":0,
        "truck":0,
        ...
        "tricycle":0
    },
    "vehicle_info":[],
    “vehicle_count”:
    {
        "car":
        {
            "in":0,
            "out":0
        },
        "truck":
        {
            "in":0
            "out":0
        },
        ...
    }
}

检测到1辆小汽车、1辆卡车,无轨迹,无车进出区域:

{
    "vehicle_num":
    {
        "car":1,
        "truck":1,
 
        ...
 
        "tricycle":0
 
    },
 
    "vehicle_info":[],
    “vehicle_count”:
    {
        "car":
        {
            "in":0,
            "out":0
        },
        "truck":
        {
            "in":0
            "out":0
        },
 
        ...
 
    }
}

检测到2辆小汽车、1辆卡车,3条轨迹,1辆卡车离开区域:

{
    "vehicle_num":
    {
        "car":2,
        "truck":1,
 
        ...
 
        "tricycle":0
 
    },
 
    "vehicle_info":
    [
        {
            "ID":3
            "location":
            {
                "left": 100,
                "top": 200,
                "width": 200,
                "height": 400,
             }
            "type": "car"
        },
        {
            "ID": 5
            "location":
            {
                "left": 400,
                "top": 200,
                "width": 200,
                "height": 400,
             }
            "type": "car"
         },
         {
            "ID": 6
            "location":
            {
                "left": 600,
                "top": 200,
                "width": 300,
                "height": 400,
             }
            "type": "truck"
         }
    ],
    “vehicle_count”:
    {
        "car":
        {
            "in":0,
            "out":0
        },
        "truck":
        {
            "in":0
            "out":1
        },
 
        ...
 
    }
}
上一篇
车辆检测-高空版(邀测)