二、开发步骤¶

因不同浏览器对摄像头处理的方式不尽相同,本文档示例使用 webrtc/adapter 类库,简化兼容问题处理。

本文档示例,以最简化方式说明开发WebAR的步骤,未详尽考虑Android、iOS等平台的兼容。

列出设备上所有的摄像头

navigator.mediaDevices.enumerateDevices()

.then((devices) => {

devices.find((device) => {

if (device.kind === 'videoinput') {

const option = document.createElement('option');

option.text = device.label || 'camera '+ (videoDeviceElement.length + 1).toString();

option.value = device.deviceId;

// 将摄像头id存储在select元素中,方便切换前、后置摄像头

videoDeviceElement.appendChild(option);

}

});

if (videoDeviceElement.length === 0) {

reject('没有摄像头');

} else {

resolve(true);

}

})

.catch((err) => {

reject(err);

});

打开摄像头

// 摄像头参数

// 更多参数请查看 https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints

// deviceId是select元素中储存的摄像头id

const constraints = {

audio: false,

video: {deviceId: {exact: deviceId}}

};

navigator.mediaDevices.getUserMedia(constraints)

.then((stream) => {

// videoElement为video元素,将摄像头视频流绑定到video上实时预览

videoElement.srcObject = stream;

videoElement.style.display = 'block';

videoElement.play();

resolve(true);

})

.catch((err) => {

reject(err);

});

截取摄像头图像

// canvasElement为canvas元素

// canvasContext为canvas的context 2d对象

// videoSetting为video元素的宽、高

canvasContext.drawImage(videoElement, 0, 0, videoSetting.width, videoSetting.height);

const image = canvasElement.toDataURL('image/jpeg', 0.5).split('base64,')[1];

将图像发送到服务器识别

图像识别有两种方式,区别如下图所示:

1). 方式一: 使用Token直接访问云识别服务器。

请在EasyAR官网获取,如下图所示:

Token会过期,支持动态刷新,获取刷新token接口参见 POST /token/

Token是写在JavaScript文件中的,适用于安全要求较低的环境中使用,完整示例,请查看 Token使用示例。

// 云图库的Client-end URL

const url = '您云图库的Client-end URL/search';

// 云图库的Cloud Token

const token = '';

const http = new XMLHttpRequest();

http.onload = () => {

try {

const msg = JSON.parse(http.responseText);

if (http.status === 200) {

if (msg.statusCode === 0) {

resolve(msg.result);

} else {

reject(msg);

}

} else {

reject(msg);

}

} catch (err) {

reject(err);

}

};

http.onerror = (err) => {

reject(err);

};

// 发送到云图库服务器

http.open('POST', url);

http.setRequestHeader('Content-Type', 'application/json;Charset=UTF-8');

// 将Cloud Token写在请求头中

http.setRequestHeader('Authorization', token);

// image为截取的摄像头图片数据,如:{image: '/9j/4AAQSkZJRgA...'}

http.send(JSON.stringify(image));

2). 方式二,使用Cloud Key与Cloud Secret,将图像数据发送到你的服务器,并在服务器上将图像及云识别相关参数签名后,再发送到云识别服务器。

请在EasyAR官网获取,如下图所示:

可以使用jQuery等类库,将上一步的image发送到服务器端识别。

服务器端处理,本文档以PHP示例,Java、C#等示例,请查看这里 。

// 云图库配置信息

define('CLOUDKEY', '');

define('CLOUDSECRET', '');

define('CLOUDURL', 'http:///search');

// 获取浏览器发送的图片信息

$image = '';

$data = @file_get_contents('php://input');

if ($data) {

$obj = json_decode($data);

$image = $obj->image;

}

// 将图片信息与云图库信息签名

$params = [

// Unix时间戳(毫秒)

'timestamp' => time() * 1000,

'appKey' => CLOUDKEY,

'image' => $image,

];

// 使用字典顺序将key排序后,将所有的key与value拼接,最后拼接上CLOUDSECRET,然后使用sha256加密

// 参数签名方法,请参考“EasyAR CRS文档”。

$params['signature'] = getSign($params, CLOUDSECRET);

// 发送到云识别服务器

$str = httpPost(CLOUDURL, json_encode($params));

// 检测返回结果

// 如果statusCode为0,则表示识别成功

$obj = json_decode($str);

if ($obj->statusCode != 0) {

// 识别失败或未识别到目标

} else {

// 识别成功

// 识别的结果为$obj->result->target

}

检测识别结果

如果未识别到内容,则继续识别,否则停止识别,可将识别的结果,如targetId, meta等信息取出处理。

完整示例

Easyar php cloud,EasyAR WebAR 快速入门相关推荐

  1. eclipse theia_如何在Ubuntu 18.04上设置Eclipse Theia Cloud IDE平台[快速入门]

    eclipse theia 介绍 (Introduction) Eclipse Theia is an extensible cloud IDE running on a remote server ...

  2. spring cloud入门_Spring Boot 2.x基础教程:快速入门

    简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot ...

  3. ibm cloud怎么使用_使用VueJS,FeathersJS和GraphQL快速入门IBM Cloud

    ibm cloud怎么使用 by Thomas Reinecke 由托马斯·雷内克(Thomas Reinecke) 使用VueJS,FeathersJS和GraphQL快速入门IBM Cloud ( ...

  4. 使用Cloud DB构建APP 快速入门 - Android篇

    概述 此示例应用演示了如何快速的使用Cloud DB构建简单的图书管理服务.通过快速入门和示例应用,您将会了解到如下信息: 如何使用Cloud DB进行应用开发. 应用数据如何写入到Cloud DB. ...

  5. dataflow_Java中的Cloud Dataflow快速入门

    dataflow 在你开始之前 选择或创建一个Cloud Platform Console项目. 转到项目页面 为您的项目启用结算. 启用帐单 启用Cloud Dataflow,Compute Eng ...

  6. Spring Cloud Spring Boot mybatis分布式微服务云架构(一)快速入门

    2019独角兽企业重金招聘Python工程师标准>>> 快速入门 本章主要目标完成Spring Boot基础项目的构建,并且实现一个简单的Http请求处理,通过这个例子对Spring ...

  7. Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

    2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...

  8. springcloud项目打包_SpringCloud 快速入门

    前言 最近入职了新公司,主要负责Java后端开发工作.目前正在开展一个全新的业务,技术选型为SpringCloud全家桶,项目的骨架由我负责搭建.由于前几家公司的微服务框架都是使用Dubbo + Sp ...

  9. SpringBoot系列: RestTemplate 快速入门

    ==================================== 相关的文章 ==================================== SpringBoot系列: 与Sprin ...

  10. Spring Boot 2.x基础教程:快速入门

    点击蓝色"程序猿DD"关注我哟 来源:http://t./ <Star最多的Spring Boot教程继续更新了> 牛皮吹过了! Git仓库和博客专题页也改版完成! 是 ...

最新文章

  1. Spring Boot Web 开发相关总结
  2. 漫谈时序设计(3)走进时序约束的大门!
  3. Hibernate 集合映射
  4. SAP 既是供应商,又是客户-互清(清账 F110中使用)
  5. 纯java生成excel
  6. 计算机配置里 无 管理模板,组策略里打开后没有管理模板
  7. python 正则表达式判断字符串是否为回文_JS使用栈判断给定字符串是否是回文算法示例...
  8. Spring Boot笔记-get请求发送json数据(方便前端vue解析)
  9. GitHub 上最受欢迎的 5 大 Java 项目
  10. 破解StarUML4.1.6
  11. cocos2dx-lua 骨骼动画spine使用心得(cocos2dx版本 3.17 spine版本3.6.53)
  12. 破解版的ABBYY FineReader OCR文字识别软件,真的好用吗?
  13. [已解决]关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no enc
  14. oracle 执行计划中出现 merge join cartesian
  15. 会议记录管理系统(4) - 会议记录添加模块
  16. 【opencv】动态背景下运动目标检测 SURF配准差分
  17. NoSQL从小白到码神 火推08
  18. 编译原理 最新版 (龙书) 简介and sources
  19. 教育培训python
  20. PHP+Mysql制作一个学生成绩查询模块

热门文章

  1. kali扫描内网ip_kali 局域网嗅探
  2. 第五章、 Linux 常用网络指令
  3. 堪称神器的办公工具,国产精品福昕PDF编辑器上榜
  4. 微pe添加网络组件_(已解决)干掉peset后如何启动PE的网络组件?
  5. flash 加载外部flash怎么卸载干净
  6. 身份证扫描件用手机怎么弄?手把手教你生成电子身份证
  7. HTML背景图片的设置
  8. 淘宝店铺层级作用 店铺层级低有哪些影响
  9. 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-手写数学公式输入
  10. python标准库math中用来计算平方根的函数_Python程序设计试题(卷)库