支持可变焦和自动变焦工业相机

介绍

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

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值