在机器视觉开发过程中,经常使用工业相机采集图像,以下采用海康机器人提供的SDK开发demo,使用语言C++,界面显示使用的Qt。SDK来自MVS 3.1版本中附属的Development文件夹。完整的项目链接地址为:
海康工业相机SDK的Demo源代码C++版本
附录海康工业相机的命名方式:
海康工业相机的开发流程一般为:
1.搜索并选择相机。MV_CC_DEVICE_INFO_LIST是设备结构体 。海康的设备结构体与图像结构体是分开的。一个是硬件设备相关,一个是图像信息相关。
MV_CC_DEVICE_INFO_LIST stDeviceList;
memset(&stDeviceList,0,sizeof(MV_CC_DEVICE_INFO_LIST));
//----------------1.列举设备---------------------
iRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE ,&stDeviceList);
if(MV_OK != iRet)
{
return;
}
//相机个数
int iNumber = stDeviceList.nDeviceNum;
MV_CC_DEVICE_INFO *pDeviceInfo = new MV_CC_DEVICE_INFO;
if(stDeviceList.nDeviceNum>0)
{
for(unsigned int i =0;i<stDeviceList.nDeviceNum;i++)
{
pDeviceInfo = stDeviceList.pDeviceInfo[i];
if(NULL == pDeviceInfo)
{
break;
}
}
}
else
{
return;
}
'C' == pDeviceInfo->SpecialInfo.stUsb3VInfo.chModelName[12] ? isColor = true : isColor = false;
//---------------2.选择设备并创建句柄---------------
//选择第一个设备
iRet = MV_CC_CreateHandle(&cameraHandle,stDeviceList.pDeviceInfo[0]);
if(MV_OK != iRet)
{
return;
}
2.打开相机并创建句柄
//------------------3.打开相机----------------------
iRet = MV_CC_OpenDevice(cameraHandle);
//------------------4.获取图像宽和高----------------
MVCC_INTVALUE ptValue;
MV_CC_GetWidth(cameraHandle,&ptValue);
imageWidth = ptValue.nCurValue;
MV_CC_GetHeight(cameraHandle,&ptValue);
imageHeight = ptValue.nCurValue;
3.设置采集模式。在工业相机领域,触发模式分为内外触发。在默认情况下,是关闭触发模式,相机此时出的是视频流;软触发可以理解为拍照片,点击一下,采集一张照片;硬触发是外部触发,外部发触发信号,相机采集一张图像;
//------------------5.设置采集模式--------------
QString qsAcquisitionMode = ui.acquisitionModeCombo ->currentText();
if("连续采集模式"==qsAcquisitionMode)
{
//开启连续采集模式,即触发模式关闭,连续采集
iRet = MV_CC_SetEnumValue(cameraHandle,"TriggerMode",MV_TRIGGER_MODE_OFF);
}
else if("触发模式" == qsAcquisitionMode)
{
//开启触发模式,即触发模式开启
MV_CC_SetEnumValue(cameraHandle,"TriggerMode",MV_TRIGGER_MODE_OFF);
}
4.设置触发源
//---------------6.设置触发源-----------------
QString qsTriggerSource = ui.triggerSourceCombo->currentText();
if("软触发"==qsTriggerSource)
{
//开启软触发模式
iRet = MV_CC_SetEnumValue(cameraHandle,"TriggerSource",7);
}
else
{
//其余触发模式暂不处理
return;
}
5.修改相机参数(这里必须是相机打开后才能修改参数)
//------------7.设置相机曝光,增益等相关参数---------
int iExposureTime = ui.exposureEdit->text().toInt();
iRet = MV_CC_SetEnumValue(cameraHandle,"ExposureTime",iExposureTime);
int iGain = ui.gainEdit->text().toInt();
iRet = MV_CC_SetEnumValue(cameraHandle,"Gain",iExposureTime);
6.开始采集(可以自行设置图像显示的线程与显示像素的格式)
//开启采集
if(isGrabing)
{
isGrabing = true;
iRet = MV_CC_StartGrabbing(cameraHandle);
}
7.关闭采集,即关闭视频流
if(isGrabing)
{
iRet = MV_CC_StopGrabbing(cameraHandle);
}
isGrabing = false;
8.关闭相机,这里需要在关闭相机后释放相关内存
//---------------最后一步,关闭相机------------------
//关闭设备
iRet = MV_CC_CloseDevice(cameraHandle);
//释放句柄
iRet = MV_CC_DestroyHandle(cameraHandle);