tinycv
Version:
Camera tiny control library
525 lines (395 loc) • 15.7 kB
Markdown
# tinycv-node
tinycv node库
# 支持操作系统
- windows
- macOS
- macOS M1
# Install依赖
windows
- `visual studio 2017 or 2019` (建议使用`vs2019`)
- `CMake` (建议使用最新版本)
macOS
- 'xcode'
- 'gcc' 或者 'clang' (系统一般自带clang)
- ‘CMake'
# Install
```bash
npm install tinycv
```
# 功能概述
- 设备管理,可以获取到所有USB设备和对应的子设备,呈现一个树形结构
- 摄像头控制,支持缩放、全景、倾斜等
- 视频处理,支持调亮度、锐度等
- 摄像头捕获+渲染
- USB监视
- 固件升级 (暂时支持有限)
# tinycv addon-api 接口指南
# Classes
[DeviceManager](#DeviceManager)
[Device](#Device)
[UsbEndpoint](#UsbEndpoint)
[TinycvCamera](#TinycvCamera)
[VideoCapture](#VideoCapture)
[VideoCaptureAbility](#VideoCaptureAbility)
[VideoFrameARGB](#VideoFrameARGB)
[UsbMonitor](#UsbMonitor)
[Fireware](#Fireware)
# <span id="DeviceManager">DevcieManager</span>
DeviceManager是一个静态对象,里面的方法可以直接访问, 不需要构造对象
* [DeviceManager](#DeviceManager)
* __static__
* [.enumerateUsbEndpoint()](#DeviceManager+EnumerationUsbEndpoint)
## <span id="#DeviceManager+EnumerationUsbEndpoint">enumerateUsbEndpoint</span>
枚举所有的usb设备, 他可能与你平常接触的USB枚举不同,他将会分成usbendpoint和subdevices,subdevices是指在这个usb
设备下有多少个子设备
注意: 这里的usbendpoint GDUI等于 (0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED)
|Param|Type|
|-----|-----|
|callback| function(array<[UsbEndpoint](#UsbEndpoint)>)
**example**
```js
function onEnumerationUsbEndpointFinish(err, usbEndpoints) {
if (err != null) {
console.log(err);
}
console.log("usbEndpoint size : ", usbEndpoints.length);
usbEndpoints.forEach(function(usbEndpoint) {
console.log("uniqueId : ", usbEndpoints.GetUniqueId());
console.log("subDevices : ");
const devices = usbEndpoints.GetSubDevices();
devices.forEach(function(device) {
console.log("deviceName : ", device.deviceName);
console.log("unqiueId: ", device.uniqueId);
console.log("instanceId : ", device.instanceId);
console.log("type : " , device.type);
});
});
}
Devicemanager.enumerateUsbEndpoint(onEnumerationUsbEndpointFinish);
```
# <span id="UsbEndpoint">UsbEndpoint</span>
usb端点类,其中包含了此usb下的一堆子设备, 和一个uniqueId, 这个唯一ID可以用来唯一标识这个UsbEndpoint,他其实就是devicePath
* [UsbEndpoint](#UsbEndpoint)
* _instance_
* [.getSubDevices()](#UsbEndpoint+GetSubDevices)
* [.getUniqueId()](#UsbEndpoint+GetDisplayName)
* [.getPid()](#UsbEndpoint+GetPid)
* [.getVid()](#UsbEndpoint+GetVid)
* [.getHub()](#UsbEndpoint+GetHub)
* [.getPort()](#UsbEndpoint+GetPort)
<span id="UsbEndpoint+GetSubDevices">getSubDevices</span>
**注意:子设备只会包含HID、Camera、Microphone、Loudspeaker、storage几种类型,其余类型会被自动过滤**
**Param**: 无
**Retrun**: array<[Device](#Device)>
# <span id="Device">Devcie</span>
设备基础信息类,其中保存类设备名称、设备路径、设备实例ID、设备所属类型,这个类不需要你手动去构造,会通过函数UsbEndpoint.getSubDevices() 返回
* [Device](#Device)
* [new Device()](#new_Device_new)
* _property_
* [.deviceName](#Device+GetDeviceName)
* [.unqiueId](#Device+GetDevicePath)
* [.instanceId](#Device+GetInstanceId)
* [.type](#Device+GetDeviceType)
* [.chromiumUniqueId](#Device+ChromiumDevicePath)
* _method_
* [.convertToChromiumDeviceId](#Device+ConvertToChromiumDeviceId)
* _type_
* [DeviceType](#Device+DeviceType)
## <span id="new_Device_new">new Device()</span>
Device构造函数
| Param| Type|
| -------- | --------|
| deviceName| String|
| devicePath| String|
| instanceId| String|
| deviceType| [DeviceType](#Device+DeviceType)|
## <span id="Device+GetDeviceName">deviceName</span>
获取设备显示名称
**Return** : String
## <span id="Device+GetDevicePath">uniqueId</span>
获取设备路径
**Return** : String
## <span id="Device+GetInstanceId">instanceId</span>
获取设备实例ID
**Return**: String
## <span id="Device+GetDeviceType">deviceType</span>
获取设备类型
**Return**: [DeviceType](#Device+DeviceType)
## <span id="Device+GetDeviceType">type</span>
获取设备类
## <span id="Device+DeviceType">DeviceType</span>
- camera ( 0 )
- microphone (1)
- loudspeaker (2)
- hid (3)
- storage (4)
js定义
```js
const deviceType = {
camera: 0,
mircrophone: 1,
loudspeaker: 2,
hid: 3,
storage: 4,
none: 5
};
```
## <span id="Device+ChromiumDevicePath">chromiumUniqueId</span>
获取chromium的uniqueId,这个路径主要是给convertToChromiumDeviceId使用
## <span id="Device+ConvertToChromiumDeviceId">convertToChromiumDeviceId</span>
生成和chromium一样的device_id和group_id
| Param| Type|
| ------| -----------|
|chromiumUniqueId| String|
|salt| String|
|frameOrigin| String|
* 第一个参数chromiumUniqueId它可以通过device.chromiumUniqueId获取
* 第二个参数在electron程序中,可以通过读取%appdata%/YOU_APP_NAME/Preferences来获取,他是一个JSON文件,文件中有一个{"device_id_salt":"F60EF71327A385940BA58205AF50DCD7"}, 第二个参数就是要填写device_id_salt的值
* 第三个参数他是你的root域名
* 当地址栏为空时,frameOrigin为 "chrome://new-tab-page"
* 当导航栏地址为"file://xxx"时,frameOrigin为 "file://"
* 其他情况是你当前请求页面的root域名
**example**
```js
const device = new Device("deviceName", "uniqueId", "instanceId", 2);
console.log(device.uniqueId);
device.devicePath = "uniqueId2";
device.convertToChromiumDeviceId(device.chromiumUniqueId, "F60EF71327A385940BA58205AF50DCD7", "https://www.qq.com")
```
## <span id="TinycvCamera">TinycvCamera</span>
caemra管理类,包含了几个方法,Open和Close,Open用来打开一个Camera,使用Close来关闭一个Camera,其中Open方法是异步, Get提供给你方便获取已经Open过到capture
* [TinycvCamera](#TinycvCamera)
* __static__
* [.open](#TinycvCamera+Open)
* [.close](#TinycvCamera+Close)
* [.get](#TinycvCamera+Get)
```js
function onOpen(err, capture) {
if (err == null) {
console.log(err);
return;
}
// Dosomething
// Close
}
const uniqueId = "xxx"; // uniqueId可以从DeviceManger里面获取到,或者从UsbMonitor
TinycvCamera.open(uniqueId, onOpen);
```
## <span id="TinycvCamera+Open">open</span>
| Param| Type|
| ------| -----------|
|uniqueId| String|
|callback| function(err, [capture](#VideoCapture))|
## <span id="TinycvCamera+Close">close</a>
调用Open函数之后,记得使用close关闭
| Param| Type|
| ------| -----------|
|uniqueId| String|
## <span id="TinycvCamera+Get">get</span>
如果你调用了open函数成功了之后,在open callback之外还需要使用到capture对象,请使用这个函数获取capture对象, 如果对应的capture不存在,将会返回null
| Param| Type|
| ---------| -----------|
| uniqueId| String|
## <span id="VideoCapture">VideoCapture</span>
摄像头实际操作类,对象会通过Open创建
* [VideoCapture](#VideoCapture)
* __interface__
* [.startCapture](#VideoCapture+StartCapture)
* [.stopCapture](#VideoCapture+StopCapture)
* [.setCaptureHandler](#VideoCapture+SetCaptureHandler)
* [.zoom](#VideoCapture+Zoom)
* [.pan](#VideoCapture+Pan)
* [.tilt](#VideoCapture+Tilt)
* [.getZoomValueRange](#VideoCapture+GetZoomValueRange)
* [.getPanValueRange](#VideoCapture+GetZoomValueRange)
* [.getTiltValueRange](#VideoCapture+GetTiltValueRange)
* [.setBrightness](#VideoCapture+SetBrightness)
* [.setContrast](#VideoCapture+SetContrast)
* [.setSaturation](#VideoCapture+SetSaturation)
* [.setSharpness](#VideoCapture+SetSharpness)
* [.setHue](#VideoCapture+SetHue)
* [.setPowerLineFrequency](#VideoCapture+SetPowerLineFrequency)
* [.getBrightness](#VideoCapture+GetBrightness)
* [.getSaturation](#VideoCapture+GetSaturation)
* [.getContrast](#VideoCapture+GetContrast)
* [.getSharpness](#VideoCapture+GetSharpness)
* [.getGetHue](#VideoCapture+GetHue)
* [.getPowerLineFrequency](#VideoCapture+GetPowerLineFrequency)
* [.getCapabilitys](#VideoCapture+GetCapabilitys)
**注意注意:在没有拿到画面的时候,获取当前值和设置当前值都是无效的**
- startCapture 开始视频捕获,在调用这个函数之前必须先调用setCapturehandler函数
- stopCapture 停止视频捕获,一般情况下用不到,使用TinycvCamera.close代替
- setCaptureHandler 设置视频流处理函数,函数类型function(frame), frame类型是[VideoFrameARGB](#VideoFrameARGB)
- zoom 数码变焦,int32
- pan 全景
- Tilt 倾斜
- getZoomValueRange、getPanValueRange、getTiltValueRange获取对应value范围
- setBrightness 设置亮度
- setContrast 设置对比度
- setSaturation 设置饱和度
- setSharpness 设置锐度
- setHue 设置色彩
- setPowerLineFrequency 设置电力线频率,也就是防闪烁
- getBrightness 获取亮度
- getContrast 获取对比度
- getSaturation 获取饱和度
- getSharpness 获取锐度
- getHue 获取色彩
- getPowerLineFrequency 获取电力线频率,也就是防闪烁
- getCapabilitys 获取所有capabilitys,返回类型 array [VideoCaptureAbility](#VideoCaptureAbility)
Get* 返回值
```js
{
minValue: 0,
maxValue: 100,
value: 50,
step: 1, // 如果step是1,你就不能设置50.5, 只能以step为增值或者减值
defValue: 50, // 默认值
flag: 1 // 1自动,2手动
}
```
**example**
```js
const uniqueId = "xxx"; // uniqueId可以从DeviceManger里面获取到,或者从UsbMonitor
function onFrame(frame) {
console.log(frame.size);
console.log(frame.width);
console.log(frame.height);
}
function onStartCaptured(err) {
console.log(TinycvCamera.get().getSharpness());
}
function onOpen(err, capture) {
if (err == null) {
console.log(err);
return;
}
console.log(capture.getBrightness());
cpature.setBrightness(50);
capture.setCaptureHandler(onFrame);
capture.startCapture(onStartCaputred);
}
TinycvCamera.open(uniqueId, onOpen);
```
# <span id="VideoCaptureAbility">VideoCaptureAbility</span>
* [VideoCaptureAbility](#VideoCaptureAbility)
* __property__
* [.width](#VideoCaptureAbility+Width)
* [.height](#VideoCaptureAbility+Height)
* [.maxFps](#VideoCaptureAbility+MaxFps)
# <span id="VideoFrameARGB">VideoFrameARGB</span>
**只读**
* [VideoFrameARGB](#VideoFrameARGB)
* __property__
* [.width](#VideoFrameARGB+Width)
* [.height](#VideoFrameARGB+Height)
* [.bitCount](#VideoFrameARGB+BitCount)
* [.data](#VideoFrameARGB+Data)
# <span id="UsbMonitor">UsbMonitor</span>
* [UsbMonitor](#UsbMonitor)
* __static__
* [.start](#UsbMonitor+Start)
* [.stop](#UsbMonitor+Stop)
* [.setDeviceInsertedHandler](#UsbMonitor+SetDeviceInsertedHandler)
* [.setDeviceRemovedHandler](#UsbMonitor+SetDeviceRemovedHandler)
所有方法都是静态,可以直接调用, SetDeviceInsertedHandler,SetDeviceRemovedHandler必须在调用Start方法之前
**example**
```js
function onDeviceAdded(usbEndpoint) {
const uniqueId = usbEndpoint.getUniqueId();
const subdevices = usbEndpoint.getSubDevices();
}
function onDeviceRemoved(usbEndpoint) {
// Usb移除只有唯一id
const uniqueId = usbEndpoint.getUniqueId();
}
UsbMonitor.setDeviceInsertedHandler(onDeviceAdded);
UsbMonitor.setDeviceRemovedHandler(onDeviceRemoved);
UsbMonitor.start();
```
# <span id="Fireware">Fireware</span>
* [Fireware](#Fireware)
* [new Fireware()](#new_Fireware_new)
* __property__
* [.name](#Fireware+name)
* [.version](#Fireware+version)
* [.sn](#Fireware+sn)
* [.pn](#Fireware+pn)
* [.otakey](#Fireware+otakey)
* [.onupgradefinished](#Fireware+onupgradefinished)
* [.onupgradeprogressupdated](#Fireware+onupgradeprogressupdated)
* __interface__
* [.upgrade](#Fireware+Upgrade)
一个Fireware代表一个固件,其中分为两大模块,固件基础信息,和固件升级,固件基础信息包含固件名称、固件版本、固件SN、固件PN、固件OTAKEY等
## <span id="new_Fireware_new">new Fireware</span>
| Param| Type| Desc|
| -------- | --------| ----------- |
| UsbEndpoint| [UsbEndpoint](#UsbEndpoint)| 升级固件的Usb设备端点|
在创建Fireware对象时需要一个UsbEndpoint对象,这个对象可以通过DeviceManager.enumerateUsbEndpoint函数结合你当前open的Camera的Device来判断出该选择哪一个UsbEndpoint
**注意 new Fireware在失败情况下会抛异常,请注意处理**
## <span id="Fireware+onupgradefinished">onupgradefinished</span>
onupgradefinished类型是一个function, 在调用upgrade函数之后,所有的结果通知都通过这个函数告知使用者, 请在调用Upgrade之前设置这个属性
函数原型:
```js
onupgradefinished = function(firewareFilePath, code, msg) {
};
```
code 取值范围:
```js
// 除了0以外的都是失败
const upgradeState = {
succeed: 0,
updateAlreadyExists: 1,
invaildFirewareFile: 2,
alreadyNewestVersion: 3,
firewareFileOversize: 4,
switchUpgradeModeFailed: 5,
findScsiDeviceFailed: 6,
readFirewareFileContentFailed: 7,
scsiLoadFailed: 8,
writeUpgradeDataFailed: 9,
checkUpgradeResultFailed: 10,
versionCheckFailed: 11
notSupport: 12
};
```
## <span id="Fireware+onupgradeprogressupdated">onupgradeprogressupdated</span>
onupgradeprogressupdated类型时一个function,在调用Upgrade函数之后,后续的更新进度会通过这个函数告知使用者,请在调用Upgrade之前设置这个属性
函数原型:
```js
// value是进度值,取值范围 1 - 100
onupgradeprogressupdated = function(value) {
};
```
## <span id="#Fireware+Upgrade">upgrade</span>
固件升级接口,Upgrade是一个异步接口,所有反馈都通过onupgradefinished和onupgradeprogressupdated通知, 当收到onupgradefinished的通知时,代表更新已经完成,code表达了更新的结果,当code时succeed时,更新成功.
**警告:一个Fireware代表一个固件,不要试图同时多次对一个Fireware调用upgrade,这样你将会收到updateAlreadyExists错误**
| Param| Type| Desc |
| ---------| -----------| --------------|
| firewarePath| String| 固件升级文件路径, 必须是UTF-8格式 |
| force| Boolean| 是否采用强制升级,如填true,将不会进行版本检查|
## example
```js
// usbEndpoint 可以使用 DeviceManager.EnumerationUsbEndpoint函数获取
const fireware = new Fireware(usbEndpoint);
// 基础信息获取
console.log(fireware.name)
console.log(fireware.version)
console.log(fireware.sn)
console.log(fireware.pn)
console.log(fireware.otakey)
// 升级之前的初始化
fireware.onupgradeprogressupdated = function(value) {
console.log(value);
};
fireware.onupgradefinished = function(firewareFilePath, code, msg) {
console.log("code : " + code);
if (code != updateState.succeed) {
// 升级失败
console.log("msg: " + msg);
} else {
// 升级成功
}
};
fireware.upgrade(firewareFilePath, false);
```