介绍
这款工业相机支持软件控制镜头变焦,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;elsefocusState = 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网络工业相机,支持软硬件定制开发,还提供贴心技术支持服务。