介绍
这款工业相机支持软件控制镜头变焦,500万黑白/彩色 、带缓存、使用M12镜头,输入IO触发、输出IO等功能,使用USB2.0传输,最大帧率7.5FPS(500万像素),38x38单板设计,可扩展USB2.0接口板安装外壳,也可以直接使用模组,满足不同的需求。使用公司的CKSDK二次开发软件包即可控制镜头变焦,满足需要变焦的应用场景。
图片
操作视频
鼠标控制变焦过程
代码编写
相机内部支持控制镜头变焦的功能,不支持自动变焦算法,需要通过上层软件实现自动变焦算法,下面通过C++写一个显示图像并可以控制变焦和手动触发自动变焦的demo程序。
/*下面是使用boost::unit_test框架结合opencv写的一个简单的自动聚焦的测试样例
在图像显示窗口按+键拉长焦距,按-键缩短焦距,按t键触发一次自动变焦
*/
BOOST_AUTO_TEST_CASE(camera_control_auto_focus)
{
BOOST_TEST_MESSAGE("test camera auto focus...");
HANDLE hCamera;
int status = CameraInit(&hCamera, 0);
BOOST_TEST_REQUIRE(status == 0);
tSdkCameraCapbility capa;
status = CameraGetCapability(hCamera, &capa);
BOOST_TEST_REQUIRE(status == 0);
UINT mediaType = capa.tDeviceCapbility.pBayerTypeDesc[0].iMediaType;
status = CameraSetTriggerMode(hCamera, 0);
BOOST_TEST_REQUIRE(status == 0);
status = CameraSetFrameSpeed(hCamera, 2);
BOOST_TEST_REQUIRE(status == 0);
status = CameraSetAeState(hCamera, FALSE);
BOOST_TEST_REQUIRE(status == 0);
status = CameraSetExposureTime(hCamera, 30'000);
BOOST_TEST_REQUIRE(status == 0);
status = CameraSetIspOutFormat(hCamera, CAMERA_MEDIA_TYPE_BGR8);
BOOST_TEST_REQUIRE(status == 0);
SetToMaxResolution(hCamera);
int min, max;
status = CameraGetIntValue(hCamera, CONTROL_FOCUS_MIN_VALUE, &min);
BOOST_TEST_REQUIRE(status == 0);
status = CameraGetIntValue(hCamera, CONTROL_FOCUS_MAX_VALUE, &max);
BOOST_TEST_REQUIRE(status == 0);
int focus = 0;
string cvWinName = "test camera focus";
cv::namedWindow(cvWinName);
double lastSobelValue = 0;
int lastFocusValue = 0;
int focusStep = 30;
double avgSobelValue = 0;
int recvCnt = 0;
enum {
AUTO_FOCUS_IDLE = 0,
AUTO_FOCUS_BEGIN,
AUTO_FOCUS_DETECT1,
AUTO_FOCUS_DETECT2,
AUTO_FOCUS_FINISH,
} focusState = AUTO_FOCUS_IDLE;
status = CameraGetIntValue(hCamera, CONTROL_FOCUS_VALUE, &lastFocusValue);
BOOST_TEST_REQUIRE(status == 0);
status = CameraPlay(hCamera);
BOOST_TEST_REQUIRE(status == 0);
while (true)
{
stImageInfo imgInfo;
BYTE *pImgData = CameraGetImageBufferEx(hCamera, &imgInfo, 1000);
if (pImgData == NULL)
continue;
cv::Mat srcMat(imgInfo.iHeight, imgInfo.iWidth, CV_8UC3, pImgData);
cv::Mat dstMat;
ResizeMat(srcMat, dstMat);
ShowTextInMat(dstMat, "y(yes)/n(no)/t(triger auto focus)");
cv::imshow(cvWinName, dstMat);
cv::Mat grayMat, sobelMat, sobelXMat, sobelYMat;
cv::cvtColor(dstMat, grayMat, cv::COLOR_BGR2GRAY);
cv::Sobel(grayMat, sobelXMat, CV_16S, 1, 0);
sobelXMat = sobelXMat.mul(sobelXMat);
cv::Sobel(grayMat, sobelYMat, CV_16S, 0, 1);
sobelYMat = sobelYMat.mul(sobelYMat);
cv::Scalar ss = cv::sum(sobelXMat + sobelYMat);
recvCnt++;
avgSobelValue = (avgSobelValue * (recvCnt - 1) + ss[0]) / recvCnt;
BOOST_TEST_MESSAGE(boost::format("avg %f, last %lf") % avgSobelValue % lastSobelValue);
if (focusState == AUTO_FOCUS_BEGIN)
{
focusState = AUTO_FOCUS_DETECT1;
lastSobelValue = avgSobelValue;
lastFocusValue += focusStep;
if (lastFocusValue >= max || lastFocusValue <= min)
{
focusStep = -focusStep;
lastFocusValue += focusStep;
}
CameraSetIntValue(hCamera, CONTROL_FOCUS_VALUE, lastFocusValue);
BOOST_TEST_MESSAGE(boost::format("auto set focus value %d") % lastFocusValue);
recvCnt = 0;
avgSobelValue = 0.0;
}
else if (focusState == AUTO_FOCUS_DETECT1 || focusState == AUTO_FOCUS_DETECT2)
{
if (recvCnt >= 5)
{
if (avgSobelValue < lastSobelValue)
{
focusStep = -focusStep;
lastFocusValue += focusStep;
if (lastFocusValue < min)
lastFocusValue = min;
else if (lastFocusValue > max)
lastFocusValue = max;
if (focusState == AUTO_FOCUS_DETECT1)
focusState = AUTO_FOCUS_DETECT2;
else
focusState = AUTO_FOCUS_FINISH;
}
else
{
lastFocusValue += focusStep;
if (lastFocusValue <= min)
{
lastFocusValue = min;
focusStep = -focusStep;
}
else if (lastFocusValue >= max)
{
lastFocusValue = max;
focusStep = -focusStep;
}
}
CameraSetIntValue(hCamera, CONTROL_FOCUS_VALUE, lastFocusValue);
BOOST_TEST_MESSAGE(boost::format("auto set focus value %d") % lastFocusValue);
lastSobelValue = avgSobelValue;
recvCnt = 0;
avgSobelValue = 0.0;
}
}
int key = cv::waitKey(1);
if (key > 0)
{
if (key == 'y')
break;
else if (key == 'n')
{
BOOST_ERROR("test manual exposure failed.");
break;
}
else if (key == '+' || key == '=')
{
focus += 100;
if (focus > max)
focus = max;
CameraSetIntValue(hCamera, CONTROL_FOCUS_VALUE, focus);
BOOST_TEST_MESSAGE(boost::format("set focus value %d") % focus);
}
else if (key == '-')
{
focus -= 100;
if (focus < min)
focus = min;
CameraSetIntValue(hCamera, CONTROL_FOCUS_VALUE, focus);
BOOST_TEST_MESSAGE(boost::format("set focus value %d") % focus);
}
else if (key == 't')
{
if (focusState == AUTO_FOCUS_IDLE || focusState == AUTO_FOCUS_FINISH)
{
focusState = AUTO_FOCUS_BEGIN;
recvCnt = 0;
avgSobelValue = 0.0;
}
}
}
}
status = CameraPause(hCamera);
BOOST_TEST_REQUIRE(status == 0);
cv::destroyAllWindows();
CameraUnInit(hCamera);
}
结语
欢迎大家使用云钥科技的工业相机,有USB2.0、USB3.0、GIGE网络工业相机,支持软硬件定制开发,还提供贴心技术支持服务。