视频分析

功能介绍

接口能力:基于视频流的AI能力,对视频进行多维度分析,目前已支持视频图像内容评审、车牌识别、火灾检测、人体检测;

业务应用:基于视频流的图像内容评审、车牌识别、火灾检测、人体检测。

API调用方式

请求方式 POST
url http://ai.heclouds.com:9090/v1/aiApi/video/comprehensive/check
http-header Login-Token: xxxxxxxxxxxxxxxxx(用户鉴权接口返回结果loginToken )
Content-Type: application/json
request-body {
    "checkTarget":"String", //检测目标:
      IDENTIFY_PORN——图像内容测评
      NUMBER_PLATE_RECOGNITION——车牌识别
      FIRE_DETECTION——火灾检测
      BODY_RECO——人体检测
    "sourceUrl":"String" //指定检测视频地址,如果需要手动推流(使用返回结果中的“pushUrl”进行推流),则此参数为空或不传
        //推流工具可以使用OBS或者FFmpeg或其它推流工具
}
成功返回结果 {
    "stateCode": "0x0000", //结果状态码,16进制。"0x0000":成功;
    "message": "success",
    "data": {
        "pushUrl":"String", //推流地址,通过此url推送视频流到服务器
        "taskId":"String" //根据此id调用结果查询接口对结果进行查询
    }
}
注意:
http错误码返回"401"时表示"未经授权",造成的原因有:未使用或使用的token不正确;使用的token已经超时失效。

请求示例

bash
Java
Python
C++
C#
Node

bash示例如下:

// 视频分析
curl --request POST \
  --url http://ai.heclouds.com:9090/v1/aiApi/video/comprehensive/check \
  --header 'cache-control: no-cache' \
  --header 'content-type: application/json' \
  --header 'login-token: 【Login-Token】' \
  --data '{\n    "checkTarget":"NUMBER_PLATE_RECOGNITION",\n    "sourceUrl":"【可访问的视频地址】"\n}'

Java示例如下:

package ocm.mobile.test;

import java.util.HashMap;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.mobile.analysis.HttpUtil;

public class VideoCheck {
    public static void main(String[] agrs){
        //视频分析检测
        videoCheck();
    }

    /**
     * 下载工具包
     * http://open.iot.10086.cn/ai/code/java.zip
     */
    private static void videoCheck() {
        String path = "http://ai.heclouds.com:9090/v1/aiApi/video/comprehensive/check";
        String loginToken = "【获取loginToken】";

        Map<String, Object> params = new HashMap<>();
        // IDENTIFY_PORN 图像内容评测
        // NUMBER_PLATE_RECOGNITION 车牌识别
        // FIRE_DETECTION 火灾检测
        // BODY_RECO 人体检测
        params.put("checkTarget", "NUMBER_PLATE_RECOGNITION");
        // 指定检测视频地址,如果需要手动推流,则此参数为空或不传
        params.put("sourceUrl", "【可访问视频的地址】");
        try {
            //调用
            String result = HttpUtil.post(path, loginToken, params);
            System.out.println("result:" + result);

            Gson gson = new GsonBuilder().create();
            Map map = gson.fromJson(result, Map.class);
            String data = map.get("data") == null ? "" : map.get("data").toString();
            // data中包含pushUrl和taskId
            System.out.println("data====:"+data);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Python示例如下:

import requests
import json

url = 'http://ai.heclouds.com:9090/v1/aiApi/video/comprehensive/check'
headers ={
    'Content-Type':'application/json',
    'Login-Token': '【获取loginToken】'
    }
data = {
    'checkTarget':'NUMBER_PLATE_RECOGNITION',
    'sourceUrl':'【可访问视频的地址】'
}
req = requests.post(url,headers=headers,data=json.dumps(data))

print(req.text)

C++示例如下:

/*注意:完整工程地址,请从这里下载:http://open.iot.10086.cn/ai/code/cpp/OneNETAiApi.zip*/
#include<iostream>
#include"APIData.hpp"
using namespace std;
/*
*使用完整工程时,请复制此页的main函数,填入到工程main.cpp文件中
*其它api请求用法示例  请参考官网帮助文档(c++版)
*官网帮助文档地址:https://open.iot.10086.cn/ai/helpCenter.html#/helpHome?categoryType=2
*/
int main(int argc, char* argv[])
{
    //api请求地址
    const string url = "http://ai.heclouds.com:9090";
    //初始化一个对象,并传入参数url(api请求地址)
    OneNETAiApiRequest aiApiRequest(url);
    //用户名
    string account = "【替换成自已的用户名】";
    //密码
    string password = "【替换成自已的用户密码】";

    //存储返回结果
    string result;
    //存储token鉴权数据
    string token;
    //算法类型
    string algotype;
    //http视频地址,置空则由用户自己推流
    string sourceUrl;
    //查询id
    string searchID;
    //推流地址
    string pushStreamURl;
    do
    {
#if defined (WIN32)
        algotype = getAlgoType(porn);
        //可以传入http视频的址,也可以置空
        sourceUrl = "";
#elif defined(__linux__)
        if (argc < 3) {
            cout << "param error!  run like this: " << endl << "./OneNETAiApi 1 \"\" " << endl;
            cout << "1:porn detect " << endl;
            cout << "2:car plate detect" << endl;
            cout << "3:fire detect" << endl;
            cout << "4:person detect" << endl;
            break;
        }
        algotype = getAlgoType(std::stoi(argv[1]));
        sourceUrl = argv[2];
#endif
        //登陆获取token
        if (!loginToken(result, &aiApiRequest, account, password)) {
            cout << "login failed,result is: " << result << endl;
            break;
        }
        IFEMPTYBRREAK(result.empty());
        token = result;
        cout << "login success,token is: " << token << endl;

        //执行视频分析 api请求
        if (!videoCheckFunc(result, &aiApiRequest, token, algotype, sourceUrl)) {
            cout << "videoCheck failed,result is: " << result << endl;
            break;
        }
        IFEMPTYBRREAK(result.empty());

        //从result中解析查询id和推流地址
        apiData<videoCheckData> videoCheckData;
        TRYBRREAK(videoCheckData.FromString(result));
        searchID = videoCheckData.data.taskId;
        pushStreamURl = videoCheckData.data.pushUrl;
        cout << "searchID:" << searchID << endl;
        //获取到该地址后,请向该地址推流,以便后续查询到结果
        cout << "pushStreamURL:" << pushStreamURl << endl;
    } while (false);
    return 0;
}

C#示例如下:

using System;
using System.IO;
using LitJson;
using RestSharp;

namespace ConsoleApplication1
{
    class Program
    {

        //视频分析功能
        //注意:需要引用外部LitJson和RestSharp库,

        static void Main(string[] args)
        {
            var token = "";//请用户通过用户鉴权接口获取token
            var client = new RestClient("http://ai.heclouds.com:9090/v1/aiApi/video/comprehensive/check");
            var request = new RestRequest(Method.POST);
            request.AddHeader("Login-Token", token);
            request.AddHeader("cache-control", "no-cache");
            request.AddHeader("content-type", "application/json");

            JsonData jd = new JsonData();
            jd["checkTarget"] = "IDENTIFY_PORN";//检测目标:IDENTIFY_PORN——图像内容测评;NUMBER_PLATE_RECOGNITION——车牌识别;FIRE_DETECTION——火灾检测;BODY_RECO——人体检测
            jd["sourceUrl"] = "https://ip:port/other_files/smart_city.mp4";//指定检测视频地址,如果需要手动推流,则此参数为空或不传
            request.AddParameter("application/json", jd.ToJson(), ParameterType.RequestBody);

            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.Content);
            Console.ReadKey();
        }

    }
}

Node示例如下:

/*
*desc:视频分析
*version:1.0
*time:2019-11-18
*/
const http = require('http');//引入http模块,用于使用HTTP服务器与客户端
let checkTarget = 'IDENTIFY_PORN';//检测目标:IDENTIFY_PORN——图像内容测评;NUMBER_PLATE_RECOGNITION——车牌识别;FIRE_DETECTION——火灾检测;BODY_RECO——人体检测
let sourceUrl = 'https://ip:port/other_files/smart_city.mp4';//指定检测视频地址,如果需要手动推流,则此参数为空或不传
const loginToken = 'KEFxABCxKUVzO0F1*Ua2OER4O0R0*EABCEFxfUBxKUVzO0F1*Ua2OER4O0R0*EJAU2LLS1W*Um_KQUF2K0F4KlV6K0FA*Ea1KEBAKUV0KUiyKlK0KU1yQUR0OERyKlB3QUF3KUR3';//用户鉴权接口返回结果loginToken,此处仅作为示例
//请求配置信息
const options = {
    host: 'ai.heclouds.com',//IP地址
    port: 9090,//端口号
    path: '/v1/aiApi/video/comprehensive/check',//请求路径
    method: 'POST',//请求类型
    headers:{//请求头信息
        'Content-Type': 'application/json',
        'Login-Token': loginToken
    }
};
//建立请求
const httpreq = http.request(options, (httpres) => {
    let size = 0;//计数请求响应结果的大小
    let chunks = [];//保存请求响应结果
    httpres.on('data', function (chunk) {
        let tempBuffer = Buffer.from(chunk);
        chunks.push(tempBuffer);
        size += tempBuffer.length;
    });
    httpres.on('end', function () {
        console.log('状态码:'+httpres.statusCode);
        let bufferData = Buffer.concat(chunks,size);
        let result = JSON.parse(bufferData.toString());
        console.log('响应长度:'+size);
        console.log('响应结果:');
        console.log(result);
    });
}).on('error', (e) => {
    console.log(e.stack);
});
let requestBody = {
    "checkTarget":checkTarget,
    "sourceUrl":sourceUrl
};
httpreq.write(JSON.stringify(requestBody));// 写入数据到请求主体
httpreq.end();//结束发送请求

视频分析结果查询

请求方式 GET
url http://ai.heclouds.com:9090/v1/aiApi/arithmetic/VIDEO_CHECK/results/{resultId}/current
http-header Login-Token: xxxxxxxxxxxxxxxxx(用户鉴权接口返回结果loginToken )
Content-Type:application/json
request-body
path-variable resultId //上一步骤中返回的查询id
成功返回结果 {
    "stateCode": "0x0000", //结果状态码,16进制。"0x0000":成功;
    "message": "success",
    "data": {
        "result": [
        {
        "ResultData":"xxxx", //base64 或存储地址
        "ResultValue": "string", //结构详见上一步配置的“检测目标”所对应的技术文档中API返回结果参数“data”的说明
        }
    ],
    "status":"processing" //检测状态:处理中-processing,处理完-finish
    }
}
注意:
http错误码返回"401"时表示"未经授权",造成的原因有:未使用或使用的token不正确;使用的token已经超时失效。

请求示例

bash
Java
Python
C++
C#
Node

bash示例如下:

// 视频分析结果查询
curl --request GET \
  --url http://ai.heclouds.com:9090/v1/aiApi/arithmetic/VIDEO_CHECK/results/【resultId】/current" \
  --header 'cache-control: no-cache' \
  --header 'login-token: 【Login-Token】'

Java示例如下:

package ocm.mobile.test;

import com.mobile.analysis.HttpUtil;

public class VideoCheckResult {
    public static void main(String[] agrs){
         //视频分析检测:先进行视频上传,获取返回的结果id
        String resultId = "【videoCheck()】";
        //视频分析检测结果查询
        videoCheckResult(resultId);
    }

    /**
     * 下载工具包
     * http://open.iot.10086.cn/ai/code/java.zip
     */
    private static void videoCheckResult(String resultId) {
        String path = "http://ai.heclouds.com:9090/v1/aiApi/arithmetic/VIDEO_CHECK/results/"+resultId+"/current";
        String loginToken = "【获取loginToken】";

        try {
            Thread.sleep(1000*2);
            String result = HttpUtil.get(path, loginToken);
            System.out.println("result:" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Python示例如下:

import requests

#先进行视频分析,获取返回的结果id
#视频检测结果查询
resultId = "获取的taskId"
url = 'http://ai.heclouds.com:9090/v1/aiApi/arithmetic/VIDEO_CHECK/results/' +resultId+"/current"
headers ={
    'Content-Type':'application/json',
    'Login-Token': '【获取loginToken】',
    }
req = requests.get(url,headers=headers)

print(req.text)

C++示例如下:

/*注意:完整工程地址,请从这里下载:http://open.iot.10086.cn/ai/code/cpp/OneNETAiApi.zip*/
#include<iostream>
#include"APIData.hpp"
using namespace std;
/*
*使用完整工程时,请复制此页的main函数,填入到工程main.cpp文件中
*其它api请求用法示例  请参考官网帮助文档(c++版)
*官网帮助文档地址:https://open.iot.10086.cn/ai/helpCenter.html#/helpHome?categoryType=2
*/
int main(int argc, char* argv[])
{
    //api请求地址
    const string url = "http://ai.heclouds.com:9090";
    //初始化一个对象,并传入参数url(api请求地址)
    OneNETAiApiRequest aiApiRequest(url);
    //用户名
    string account = "【替换成自已的用户名】";
    //密码
    string password = "【替换成自已的用户密码】";
    //存储返回结果
    string result;
    //存储token鉴权数据
    string token;
    //算法类型
    string algotype;
    //http视频地址,置空则由用户自己推流
    string sourceUrl;
    //查询id
    string searchID;
    //推流地址
    string pushStreamURl;
    //算法查询结束状态
    string finishStatus;
    do
    {
#if defined (WIN32)
        algotype = getAlgoType(porn);
        //可以传入http视频的址,亦可置空
        sourceUrl = "";
#elif defined(__linux__)
        if (argc < 3) {
            cout << "param error!  run like this: " << endl << "./OneNETAiApi 1 \"\" " << endl;
            cout << "1:porn detect " << endl;
            cout << "2:car plate detect" << endl;
            cout << "3:fire detect" << endl;
            cout << "4:person detect" << endl;
            break;
        }
        algotype = getAlgoType(std::stoi(argv[1]));
        sourceUrl = argv[2];
#endif
        //登陆获取token
        if (!loginToken(result, &aiApiRequest, account, password)) {
            cout << "login failed,result is: " << result << endl;
            break;
        }
        IFEMPTYBRREAK(result.empty());
        token = result;
        cout << "login success,token is: " << token << endl;

        //执行视频分析 api请求
        if (!videoCheckFunc(result, &aiApiRequest, token, algotype, sourceUrl)) {
            cout << "videoCheck failed,result is: " << result << endl;
            break;
        }
        IFEMPTYBRREAK(result.empty());

        //从result中解析查询id和推流地址
        apiData<videoCheckData> videoCheckData;
        TRYBRREAK(videoCheckData.FromString(result));
        searchID = videoCheckData.data.taskId;
        pushStreamURl = videoCheckData.data.pushUrl;
        //获取到该地址后,请向该地址推流,进行算法计算
        cout << "pushStreamURL:" << pushStreamURl << endl;

        apiData<videoCheckSearchData> videoCheckSearchData;
        //查询直到返回finish状态
        while (finishStatus.compare("finish"))
        {
            this_thread::sleep_for(chrono::milliseconds(1500));
            //执行视频分析查询 api请求
            if (!videoCheckSearchFunc(result, &aiApiRequest, token, searchID)) {
                cout << "videoCheckSearch failed,result is: " << result << endl;
                continue;
            }
            try
            {
                videoCheckSearchData.FromString(result);
                finishStatus = videoCheckSearchData.data.status;
            }
            catch (...)
            {}
      cout << "result: " << result << endl;
        }
    } while (false);
    return 0;
}

C#示例如下:

using System;
using System.IO;
using LitJson;
using RestSharp;

namespace ConsoleApplication1
{
    class Program
    {

        //视频分析结果查询功能
        //注意:需要引用外部LitJson和RestSharp库,

        static void Main(string[] args)
        {
            var token = "";//请用户通过用户鉴权接口获取token
            var client = new RestClient("http://ai.heclouds.com:9090/v1/aiApi/arithmetic/VIDEO_CHECK/results/123_b101033b6a484621963323ad508f627d/current");//123_b101033b6a484621963323ad508f627d为视频分析成功时返回的查询id“taskId”
            var request = new RestRequest(Method.GET);
            request.AddHeader("Login-Token", token);
            request.AddHeader("Cache-Control", "no-cache");
            request.AddHeader("Content-Type", "application/json");
            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.Content);
            Console.ReadKey();
        }

    }
}

Node示例如下:

/*
*desc:视频分析结果查询
*version:1.0
*time:2019-11-18
*/
const http = require('http');//引入http模块,用于使用HTTP服务器与客户端
const loginToken = 'KEFxfUBxABCzO0F1*Ua2OER4O0R0*EJABCFxfUBxKUVzO0F1*Ua2OER4O0R0*EJAU2LLS1W*Um_KQUF2K0F4KlV6K0FA*Ea1KEBAKUV0KUiyKlK0KU1yQUR0OERyKlB3QUF3KUR3';//用户鉴权接口返回结果中的“loginToken”,此处仅为示例
const resultId = '010u0015271496544774321_1741d8278a604c39a34ab73cfeeb9d0f';//用视频分析接口返回结果中的查询id“taskId”,此处仅为示例
//请求配置信息
const options = {
    host: 'ai.heclouds.com',//IP地址
    port: 9090,//端口号
    path: '/v1/aiApi/arithmetic/VIDEO_CHECK/results/'+resultId+'/current',//请求路径
    method: 'GET',//请求类型
    headers:{
        'Content-Type':'application/json',
        'Login-Token': loginToken
    }
};
console.log(options.path);
//建立请求
const httpreq = http.request(options, (httpres) => {
    let size = 0;//计数请求响应结果的大小
    let chunks = [];//保存请求响应结果
    httpres.on('data', function (chunk) {
        let tempBuffer = Buffer.from(chunk);
        chunks.push(tempBuffer);
        size += tempBuffer.length;
    });
    httpres.on('end', function () {
        console.log('状态码:'+httpres.statusCode);
        let bufferData = Buffer.concat(chunks,size);
        let result = JSON.parse(bufferData.toString());
        console.log('响应长度:'+size);
        console.log('响应结果:');
        console.log(result);
    });
}).on('error', (e) => {
    console.log(e.stack);
});
httpreq.end();

个搜索结果,搜索内容 “

    0 个搜索结果,搜索内容 “