QT 驱动大恒水星相机

编程环境

vs2019+QT5.12.10
大恒官方相机驱动库

下载驱动-》安装驱动

在这里插入图片描述

默认路径安装即可。参考编程mfc例子路径

在这里插入图片描述

搭建测试demo

首先相机初始化列表在构造过程中

在cam.cpp中

: QObject(parent)
	, m_bDevOpened(false)
	, m_bIsSnap(false)
	, m_bColorFilter(false)
	, m_bTriggerMode(false)
	, m_hDevice(NULL)
	, m_pGammaLut(NULL)
	, m_pContrastLut(NULL)
	, m_pBufferRGB(NULL)          // RGB图像数据,用于显示
	, m_pBufferRaw(NULL)
	CamFps= m_pstCam.fFps;
	m_DevOpened= m_bDevOpened;
	m_IsSnap = m_bIsSnap;
	sn  = ""; 
	m_btcpimg = false;
	GX_STATUS emStatus = GX_STATUS_SUCCESS;
	m_pBaseinfo = NULL;					
	m_npfpsCont = 0;					
	//初始化库
	emStatus = GXInitLib();
	if (emStatus != GX_STATUS_SUCCESS)
	{
		ShowErrorString(emStatus);
		exit(0);
	}

打开设备

void CamDaheng::on_OpenCam()
{
	GX_STATUS      emStatus = GX_STATUS_SUCCESS;
	uint32_t       nDevNum = 0;
	GX_OPEN_PARAM  stOpenParam;
	stOpenParam.accessMode = GX_ACCESS_EXCLUSIVE;
	stOpenParam.openMode = GX_OPEN_INDEX;
	stOpenParam.pszContent = "1";
	size_t     nSize = 0;
	// 枚举设备
	emStatus = GXUpdateDeviceList(&nDevNum, 1000);
	GX_VERIFY(emStatus);
	// 判断设备个数
	if (nDevNum <= 0)
	{
		ShowNewsR("没有发现设备!!!!!", "");
		return;
	}
	// 为获取设备信息准备资源
	m_pBaseinfo = new GX_DEVICE_BASE_INFO[nDevNum];
	if (m_pBaseinfo == NULL)
	{
		nDevNum = 0;
		return;
	}
	nSize = nDevNum * sizeof(GX_DEVICE_BASE_INFO);  //计算结构体大小
	emStatus = GXGetAllDeviceBaseInfo(m_pBaseinfo, &nSize);
	sn = m_pBaseinfo[0].szSN;
	if (emStatus != GX_STATUS_SUCCESS)
	{
		ShowErrorString(emStatus);
		delete[]m_pBaseinfo;
		m_pBaseinfo = NULL;
		// 将设备个数置为0
		nDevNum = 0;
		return;
	}
	// 如果设备已经打开则关闭,保证相机在初始化出错情况能再次打开
	if (m_hDevice != NULL)
	{
		emStatus = GXCloseDevice(m_hDevice);
		GX_VERIFY(emStatus);
		m_hDevice = NULL;
	}
	// 打开设备
	emStatus = GXOpenDevice(&stOpenParam, &m_hDevice);
	GX_VERIFY(emStatus);
	m_bDevOpened = TRUE;
	m_DevOpened = m_bDevOpened;

	// 建议用户在打开网络相机之后,根据当前网络环境设置相机的流通道包长值,
	// 以提高网络相机的采集性能,设置方法参考以下代码。
	{
		bool	 bImplementPacketSize = false;
		uint32_t unPacketSize = 0;

		// 判断设备是否支持流通道数据包功能
		emStatus = GXIsImplemented(m_hDevice, GX_INT_GEV_PACKETSIZE, &bImplementPacketSize);
		GX_VERIFY(emStatus);

		if (bImplementPacketSize)
		{
			// 获取当前网络环境的最优包长值
			//emStatus = GXGetOptimalPacketSize(m_hDevice, &unPacketSize);
			GX_VERIFY(emStatus);

			// 将最优包长值设置为当前设备的流通道包长值
			emStatus = GXSetInt(m_hDevice, GX_INT_GEV_PACKETSIZE, unPacketSize);
			GX_VERIFY(emStatus);
		}
	}

	// 设置相机的默认参数:采集模式:连续采集,数据格式:8-bit
	emStatus = InitDevice();
	GX_VERIFY(emStatus);

	// 获取设备的宽、高等属性信息
	emStatus = GetDeviceParam();
	GX_VERIFY(emStatus);


//	ui.m_txtEdit->setPlainText("打开相机成功!");

}

其实主要的参照vc的sdk,记录一下问题

问题记录

1.相机显示过程中读取图像的buffer,无图像显示
答:我用的是qlable作为图像显示,在应用qimage过程中很容易出现野指针的状况,所以应用过程中需要谨慎

if (pFrame->status == 0)
	{
		memcpy(pDlg->m_pRawBuffer, pFrame->pImgBuf, pFrame->nImgSize);

		if (pDlg->m_bIsColorFilter)
		{
			// 彩色图像需要将Raw8图像经过RGB转换后显示
			DxRaw8toRGB24(pDlg->m_pRawBuffer, pDlg->m_pImgBuffer, nImageWidth , nImageHeight, RAW2RGB_NEIGHBOUR,
				DX_PIXEL_COLOR_FILTER(pDlg->m_nPixelColorFilter), TRUE);
		}
		else
		{
			// 黑白相机需要翻转数据后显示
			for(VxUint32 i = 0; i < nImageHeight; i++)
			{
				memcpy(pDlg->m_pImgBuffer + i * nImageWidth, pDlg->m_pRawBuffer + (nImageHeight - i - 1) * nImageWidth, (size_t)nImageWidth);
			}
		}	

		// 显示图像
		pDlg->DrawImg(pDlg->m_pImgBuffer);
	}

在应用上面处理过程中,有问题在qtQimage中
在这里插入图片描述

void CamDaheng::DrawImg()
{
	m_npfpsCont++;
	GX_STATUS emStatus = GX_STATUS_SUCCESS;
	//显示帧率
	CamFps = m_pstCam.fFps;
	//显示图像
	m_qInputImg = QImage((const uchar*)m_pBufferRaw, m_nImageWidth, m_nImageHeight, QImage::Format_Indexed8);
	bool isNull = m_qInputImg.isNull();
	if (m_qInputImg.isNull())
	{
		return;
	}
	else
	{
		emit TransImage(m_qInputImg);
	}
	m_DevOpened = m_bDevOpened;
	m_IsSnap = m_bIsSnap;
	
	if (m_btcpimg == true)
	{
	QImage igScaled = m_qInputImg.scaled(800, 700, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
	//m_server->SendData(igScaled);
	emit StartThread(igScaled);
	
	}
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值