ToupCam API 手册

 


1. 版本


21.10898.2018.0125


2. 简介


ToupCam系列相机(包含UCMOS, WCMOS, LCMOS, U3CMOS, L3CMOS, LECCD, E3CMOS, EP3CMOS, ICMOS, GCMOS, G3CMOS, G3CCD, GPCMOS, UHCCD, EXCCD, SCCCD, MTR3CCD, MTR3CMOS, ATR3CCD, ATR3CMOS, U3ISPM, E3ISPM, G3M, MG3CMOS, UA等型号系列)支持多种API,包括:Native C/C++,.NET/C#/VB.NET, DirectShow, Twain, LabView等等. Native C/C++ API作为底层(Low Level) API相比较其他API的特点是使用纯C/C++开发,不依赖其他的运行时库,接口简洁,控制灵活. 本SDK压缩包包含了所有需要用到的的资源和信息, 目录如下:

toupcam.h, C/C++ 头文件


3. 概念和术语


a. 获取图像数据的模式: “Pull Mode” vs “Push Mode” (“拉”模式 vs “推”模式)

Toupcam提供了两种模式来获取图像数据: Pull Mode 和 Push Mode. 以下所讲的几种方式中,从功能上说它们都是平等的,开发者可以任选一种使用. 推荐使用拉模式,因为它更简单,且在多线程情况下更加不容易出错, 尤其是使用windows消息机制的情况下.

在Pull Mode 情况下, toupcam不但可以通知应用程序图像数据或者静态图片到达,还可以通知其他事件类型,如下所示:

TOUPCAM_EVENT_EXPOSURE 曝光时间发生改变
TOUPCAM_EVENT_TEMPTINT 白平衡参数发生改变,Temp/Tint模式, 请参阅这里.
TOUPCAM_EVENT_WBGAIN 白平衡参数发生改变,RGB Gain模式, 请参阅这里.
TOUPCAM_EVENT_IMAGE 视频图像数据到达(视频).使用Toupcam_PullImage“拉”图像数据
TOUPCAM_EVENT_STILLIMAGE 静态图片数据到达(Toupcam_Snap引发).使用Toupcam_PullStillImage“拉”图像数据
TOUPCAM_EVENT_ERROR 一般性错误,数据采集不能继续
TOUPCAM_EVENT_DISCONNECTED 相机断开连接,如被拔出
TOUPCAM_EVENT_TIMEOUT 抓取视频帧超时错误,数据采集不能继续
TOUPCAM_EVENT_TRIGGERFAIL 触发失败(如帧数据错误或超时)
TOUPCAM_EVENT_BLACK 黑平衡参数发生改变
TOUPCAM_EVENT_FFC 平板校正(flat field correction)状态发生改变

b. 静态抓拍(静态图片, Still Image, Snap)

大部分的相机型号都支持所谓静态抓拍的能力,指相机在连续的视频预览过程中,临时切换到另外一个分辨率,抓取一帧静态图片之后,马上把分辨率切换回原始分辨率的过程.

举例来说,UCMOS05100KPA支持3种分辨率,假设当前视频预览分辨率为1280 * 960, 调用函数Toupcam_Snap(h, 0)静态抓拍分辨率2592 * 1944的静态图片,这时相机临时切换到2592 * 1944的分辨率,抓取一帧数据之后,又把分辨率切换成原来的1280 * 960.

a) 拉模式下,抓拍到静态图片之后,通知外层应用TOUPCAM_EVENT_STILLIMAGE事件, 然后外层应用调用Toupcam_PullStillImage获取静态图片的数据.
b) 推模式下,抓拍到静态图片之后,回调函数PTOUPCAM_DATA_CALLBACK, 参数bSnap设置为TRUE,图片的分辨率等信息在参数pHeader中.

可以通过函数Toupcam_get_StillResolutionNumber的返回值或者结构ToupcamModelV2的still值来查看是否支持静态抓拍能力.

c. 数据格式: RGB vs RAW

Toupcam支持两种数据格式: RGB格式(默认)和RAW格式. RAW模式可以通过调用函数Toupcam_put_Option设置参数TOUPCAM_OPTION_RAW为1开启.

用户可以通过TOUPCAM_OPTION_RAW调用函数Toupcam_put_Option来切换这两种模式.请注意切换模式必须在调用相机开启函数(Toupcam_StartPullModeWithWndMsg或Toupcam_StartPullModeWithCallback或Toupcam_StartPushMode)之前.

d. 白平衡和自动白平衡: Temp/Tint模式 vs RGB Gain模式

1. Toupcam支持互相独立的两种模式描述白平衡: a) Temp/Tint模式; b) RGB Gain模式

a) 默认是Temp/Tint模式,在本模式下,使用Temp, Tint这2个参数来控制白平衡. Toupcam_get_TempTint获取值,Toupcam_put_TempTint设置值. Toupcam_AwbOnePush执行自动白平衡. 当白平衡参数改变时,发送TOUPCAM_EVENT_TEMPTINT通知消息.

b) 在RGB Gain模式下,使用3个通道的Gain值来控制白平衡. Toupcam_get_WhiteBalanceGain获取值,Toupcam_put_WhiteBalanceGain设置值. Toupcam_AwbInit执行自动白平衡. 当白平衡参数改变时,发送TOUPCAM_EVENT_WBGAIN通知消息.

两种模式下使用的函数不能混淆:

a) Temp/Tint模式下,必须使用Toupcam_get_TempTint和Toupcam_put_TempTint和Toupcam_AwbOnePush. 而Toupcam_get_WhiteBalanceGain和Toupcam_put_WhiteBalanceGain和Toupcam_AwbInit不能使用,永远返回E_NOTIMPL.
b) RGB Gain模式下,必须使用Toupcam_get_WhiteBalanceGain和Toupcam_put_WhiteBalanceGain和Toupcam_AwbInit. 而Toupcam_get_TempTint和Toupcam_put_TempTint和Toupcam_AwbOnePush不能使用,永远返回E_NOTIMPL

Toupcam_Open的id参数之前加'@'字符表示使用RGB Gain模式的白平衡.如果想使用RGB Gain模式白平衡,假设id参数是"abcdef",则传入参数"@abcdef".

2. 自动白平衡功能, 业界有两种模式, 一种是连续自动白平衡,一种是触发式自动白平衡(one push). 连续自动白平衡功能会一直进行白平衡参数的计算, 触发模式只是在触发的时候才会计算白平衡参数. Toupcam使用触发式白平衡计算方法,因为这种方法在显微镜等领域更加合适和精确. 连续自动白平衡在某些场景情况下会出现错误.

3. 黑白相机不支持白平衡. 以上提到的函数一直返回E_NOTIMPL.

e. 触发模式

1. 什么是触发

ToupCam相机拥有2中工作模式: 视频模式和触发模式. 当处于触发模式时,只有触发条件满足的情况下才能获取图像. 根据触发源有3种类型的触发类型: 外部触发,软件触发.

2. 触发和Snap(静态图像抓拍)的区别

触发模式被设计用来精确控制相机当且仅当触发条件满足时才能获取图像.用户可以通过控制预设的触发条件获取图像.当进入触发模式时,直到触发条件被满足才能得到图像.图像的分辨率没有改变. Snap(静态图像抓拍)是用来在视频模式下抓取相同或者不同分辨率的图像.

3. 软件触发

相机可以被软件触发. 在软件触发模式下,通过软件来控制触发条件. 图像的张数也可以软件控制.

4. 外部触发

相机可以被外部信号触发. 当前仅支持上升沿触发模式.

5. 模拟触发

对于既不支持软件触发又不支持外部触发的相机,可以使用模拟触发.当处于模拟触发模式时,相机硬件的工作模式和视频模式下的工作模式没有区别,但是上层软件不发起抓取动作,软件内部的缓冲区保持为空,直到用户设置触发条件.

6. 怎样进入触发模式

枚举相机时,可以得到相机型号的能力标志位,查看相机对于触发模式的支持能力,定义如下:
#define TOUPCAM_FLAG_TRIGGER_SOFTWARE   0x00080000  /* 支持软触发 */
#define TOUPCAM_FLAG_TRIGGER_EXTERNAL   0x00100000  /* 支持外部触发 */
#define TOUPCAM_FLAG_TRIGGER_SINGLE     0x00200000  /* 仅支持单张触发: 一次触发得到一张图像 */
可以使用函数Toupcam_put_Option(HToupCam h, unsigned iOption, int iValue)设置相机的触发模式,其中iOption参数为TOUPCAM_OPTION_TRIGGER,iValue用于设置触发模式的类型.请参阅以下内容:
#define TOUPCAM_OPTION_TRIGGER   0x0b    /* 0 = 视频模式, 1 = 软件或模拟触发模式, 2 = 外部触发模式, 默认值 =  0 */
函数Toupcam_get_Option(HToupCam h, unsigned iOption, int* piValue)可以用来获取当前相机的触发模式类型.

7. 怎样触发相机

使用函数Toupcam_Trigger(HToupCam h, unsigned short nNumber). 不同的nNumber的含义:
nNumber = 0 取消触发.
nNumber = 0xFFFF 一直触发, 类似于视频模式;
nNumber = 其他合法值代表单次触发获取的图片张数.
如果TOUPCAM_FLAG_TRIGGER_SINGLE标志位是设置的,那么nNumber参数只能为1,意味着单次触发只能获取单张图片.在调用Toupcam_Trigger函数之前,相机必须已经处于触发模式.

4. 函数



5. .NET, C#和VB.NET


Toupcam支持.NET开发环境(C#和VB.NET).

inc目录下toupcam.cs使用P/Invoke调用至toupcam.dll. 把toupcam.cs拷贝到你的C#工程中使用,请参考例子代码samples\toupcamdemowinformcs1和toupcamdemowinformcs2.

ToupTek.ToupCam C#包装类的属性和方法等等,直接调用toupcam.dll中对应的原生C/C++ Toupcam_xxx函数. 所以,关于Toupcam_xxx的文档说明都适用于C#中对应的属性或方法,比如,C#中的Snap方法调用Toupcam_Snap函数,关于Toupcam_Snap函数的说明同样适用于C# ToupCam类的Snap方法:

[DllImport("toupcam.dll", ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern int Toupcam_Snap(SafeHToupCamHandle h, uint nResolutionIndex);

public bool Snap(uint nResolutionIndex)
{
    if (_handle == null || _handle.IsInvalid || _handle.IsClosed)
        return false;
    return (Toupcam_Snap(_handle, nResolutionIndex) >= 0);
}

VB.NET和C#是类似的,不另说明.


6. 其他


参数 范围 默认值 获取 设置 自动
AutoExpoTarget
(自动曝光目标亮度)
16~235 120 Toupcam_get_AutoExpoTarget Toupcam_put_AutoExpoTarget  
白平衡 Temp/Tint模式 Temp(色温) 2000~15000 6503 Toupcam_get_TempTint Toupcam_put_TempTint Toupcam_AwbOnePush
Tint 200~2500 1000
RGB Gain模式 Red Gain -127~127 0 Toupcam_get_WhiteBalanceGain Toupcam_put_WhiteBalanceGain Toupcam_AwbInit
Green Gain
Blue Gain
LevelRange 0~255 Low = 0
High = 255
Toupcam_get_LevelRange Toupcam_put_LevelRange Toupcam_LevelRangeAuto
Contrast(对比度) -100~100 0 Toupcam_get_Contrast Toupcam_put_Contrast  
Hue(色度) -180~180 0 Toupcam_get_Hue Toupcam_put_Hue  
Saturation(饱和度) 0~255 128 Toupcam_get_Saturation; Toupcam_put_Saturation  
Brightness(亮度) -64~64 0 Toupcam_get_Brightness Toupcam_put_Brightness  
Gamma 20~180 100 Toupcam_get_Gamma Toupcam_put_Gamma  
Black Level(暗电平) 0~31 (位深度=8)
0~31 * 4 (位深度=10)
0~31 * 16 (位深度=12)
0~31 * 64 (位深度=14)
0~31 * 256 (位深度=16)
  Toupcam_get_Option Toupcam_put_Option  

7. 更新历史


v21: 增加Toupcam_IoControl

v20: 增加Toupcam_EnumV2, ToupcamModelV2, ToupcamInstV2; (Toupcam_Enum, ToupcamModel和ToupcamInst过时)
       增加Pixel Format,见TOUPCAM_OPTION_PIXEL_FORMAT; (TOUPCAM_OPTION_BITDEPTH的超集)
       增加平场校正(Flat Field Correction)

v19: 增加黑平衡: 请参阅这里

v18: 增加Toupcam_get_Revision

v17: 增加TOUPCAM_OPTION_ROTATE

v16: 增加TOUPCAM_FLAG_DDR, 使用超大容量DDR(Double Data Rate SDRAM)作帧缓冲

v15: 增加TOUPCAM_OPTION_BINNING

v14: 增加对WinRT / UWP (Universal Windows Platform) / Windows Store App的支持

v13: 支持行间隔(Row Pitch, Stride), 请参阅Toupcam_PullImageWithRowPitchToupcam_PullStillImageWithRowPitch

v12: 支持RGB32, 8位灰度,16位灰度, 请参阅这里

v11: 暗电平(Black Level),请参阅这里

v10: Demosaic算法,请参阅这里

v9: 直方图数据类型从double改成float

v8: 支持模拟触发模式, 请参阅这里

v7: 位深度>8时支持RGB48输出, 请参阅这里

v6: 支持触发(Trigger)模式, 请参阅这里

v5: 白平衡的两种模式: Temp/Tint模式 vs RGB Gain模式, 请参阅这里

v4: 支持ROI (Region Of Interest), 请参阅这里

v3: 支持更多的位深度(bit depth): 10bits, 12bits, 14bits, 16bits

v2: 支持RAW模式,请参阅这里这里;增加对Linux和macOS的支持

v1: 初始发布


8. 联系信息


如果在使用ToupCam SDK的过程中,碰到任何问题,请与我们联系
网站:www.touptek.com www.toupcam.com
QQ:862347751
EMAIL:support@touptek.com