编程环境
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);
}
}