康标达工业镜头开发笔记(一):康标达(Computar)工业镜头介绍、搭建SDK基础环境
前言
康标达(Computar)工业镜头SDK二次开发笔记,本篇介绍基基本信息和搭建基础sdk二次开发环境模板。
相较于传统手动调焦工业镜头,这款自带步进电机、支持上位机软件实时控制对焦、光圈、变焦,非常适合自动化在线视觉检测、多工况切换成像、精密视觉标定场景。
大多文章只讲工业相机调用、OpenCV 图像处理,极少有完整的康标达镜头SDK二次开发实操内容,因此打算整理系列开发笔记,从硬件认知、环境搭建、指令调用、代码封装一步步记录,方便后续复用,也给做机器视觉电控镜头开发的同行参考。
康标达(Computar)隶属于日本 CBC 集团,是专注机器视觉赛道的专业工业镜头品牌,核心面向自动化工业检测场景,不生产民用消费级摄影镜头,是国内智能制造、视觉检测项目主流选用的日系工业镜头品牌。
Computar 电控变焦镜头(电动镜头),内置步进马达驱动 Focus(对焦)、Zoom(变焦)、Iris(光圈)三组执行机构,高端型号扩展 Filter 滤镜切换模组;通讯接口主流为SMBus/I2C、RS485 两种方案,采购选型时务必确认接口类型,二者 SDK 与硬件接线互不兼容。
- Zoom:变焦控制,调整镜头焦距,改变视场大小
- Focus:对焦控制,调节成像清晰度
- Iris:光圈控制,调整通光量、景深
- Filter:滤镜模组切换(选配型号支持)
- 位置读取:实时读取当前焦段、对焦位置、光圈绝对坐标
- 参数记忆:支持上位机保存多组位置预设值,一键切换工况
镜头上电后,部分型号会执行自动初始化回零动作:马达自动移动至机械原点。
多镜头并行控制场景:系统运行中新增镜头连接、反复重连设备时,不希望每次通讯建立就执行初始化回零。镜头移位会导致现场标定失效、成像视野跳变。但是可以通过软件跳过初始化,仅握手通讯。
镜头不存在全局统一初始化标志位。Zoom 缩放、Focus 对焦、Iris 光圈、Filter 滤镜,四路执行机构相互独立,各自拥有独立【初始化完成标志位】。
各路电机初始化状态、运动状态互不耦合,可以单独判断单路模组工作状态。
I2C 版本:依靠设备地址区分多镜头,可修改镜头从机地址实现多路挂载;
RS485 版本:总线式组网,依靠设备 ID 区分;
需要做好地址管理,避免多镜头总线冲突。
获取sdk后,基本信息如下:
- 操作系统:Windows 10 / Windows 11(优先)
- 开发框架:C++ / Qt(推荐,便于搭建可视化调试上位机)
- 编译器:MSVC2019 / MSVC2022
- 辅助工具:官方 Demo 调试软件、串口 / I2C 总线抓包工具
- 图像处理配套:OpenCV(可选,用于实时成像观测镜头调节效果)
sdk demo给一个简单的无界面demo的工程,经过笔者二次阅读理解之后,分理出可用的最小接口sdk部分,并进行模块化处理之后:
由于本人追求精益求精,构架设计,有部分是.c代码,发现提供的sdk中,代码同类相似功能有几种编码和设计小思路区别,导致的差异,进行了少量的代码分层处理和思路修正,尽可能的统一。存在的几个问题:
- extern变量飞,main函数中的定义全局变量飞到底层api控制中,导致api接口无法与main分割;
- 同类功能类似变量获取上下限值,一种是机械上下限,一种是功能是软件上下限
- 部分变量在控制底层封装中就赋值,部分是业务中赋值。
花了不少时间研究其定义和设计思路,并尽可能不动sdk的前提下,进行了少量新增修正,总体代码还是可以的,而且有代码参考运行看结果远比没有好,还是感谢的,不然需要去看文档寄存器了熟悉研究了其工作量比预估翻倍,参考单片机寄存器通讯的I2C通讯一样。
这里直接是用进行二次整理的sdk,起步。

建立工程:

然后新建相机模块:

工程展示如下:


在pri中:

# 镜头sdk
LENS_SDK_DIR = $$PWD/lensSdkX64
INCLUDEPATH += $$LENS_SDK_DIR/include
LIBS += -L$$LENS_SDK_DIR/lib
LIBS += -lSLABHIDtoSMBus
HEADERS += \
$$PWD/lensSdkX64/include/SLABCP2112.h \
$$PWD/lensSdkX64/include/Types.h \
$$PWD/lensSdkX64/include/configVal.h \
$$PWD/lensSdkX64/include/devAddr.h \
$$PWD/lensSdkX64/include/silabs_defs.h \
$$PWD/lensSdkX64/include/silabs_sal.h
SOURCES += \
$$PWD/lensSdkX64/src/LensCtrl.c \
$$PWD/lensSdkX64/src/UsbCtrl.c
因为有部分控制.c代码接口,需要一起编译,添加.了c文件以及所有头文件。
添加头文件:
#ifdef __cplusplus
extern "C" {
#endif
#include "configVal.h"
#include "SLABCP2112.h"
#include "devAddr.h"
#include "LensCtrl.h"
#ifdef __cplusplus
}
#endif

测试可以搜索到:


头文件包含:
#ifdef __cplusplus
extern "C" {
#endif
#include "configVal.h"
#include "SLABCP2112.h"
#include "devAddr.h"
#include "LensCtrl.h"
#ifdef __cplusplus
}
#endif
源码:
void LensManager::testEnv()
{
/*
typedef unsigned long DWORD;
*/
// 步骤一: 搜索usb镜头
DWORD numDevis;
int ret = HidSmbus_GetNumDevices(&numDevis, VID, PID);
LOG << "搜索到镜头数量:" << ret;
}


浙公网安备 33010602011771号