接手的项目又用到了IDS的网口相机,需要进行双相机的出图,以及后续的视觉算法开发。以下将介绍利用IDS网口相机,在VS2013 win32控制台模式下进行相机的出图和测试(依旧使用OpenCV+ImageWatch测试效果)。
首先,需要安装IDS的软件包(开发者模式),可以在官网下载对应的开发包(https://en.ids-imaging.com/download-ueye-win32.html),特别注意软件版本要与电脑匹配!
然后,利用软件自带的IDS Camera Manager进行网口相机IP配置,电脑的IP与相机的IP的前三个字段要相同。设置成功后效果如下:
其次,需要在VS中配置IDS环境,进行二次开发。在VS中配置IDS的运行环境非常简单,主要是以下几步:
1.在新建好的工程的 “C/C++” 附件包含目录中添加 ...\IDS\uEye\Develop\include;(注意,省略号前为安装IDS软件的绝对路径地址,我的全称为 D:\Program Files\IDS\uEye\Develop\include);
2.在 “链接器” 附加库目录中添加 ...\IDS\uEye\Develop\Lib; (省略号内容同上);
3.在 “链接器” 附加依赖项中添加 uEye_api.lib;
4.在工程头文件中包含 #include <uye.h> 即可。
以下是利用单相机进行简单出图测试的简洁代码:
----------------------------------
#include <iostream>
#include <opencv2/opencv.hpp>
#include <ueye.h>
struct Camera
{
HIDS hCam;
char* pImageMem;
int nImageID;
int RenderMode;
SENSORINFO SensorInfo;
CAMINFO CamInfo;
int nBitsPerPixel;
bool bLive;
bool bOpened;
};
/*
借鉴IDS自带的SDK开发包进行相机出图
时间:2018/07/18
*/
int main()
{
HIDS hCam = 0;
SENSORINFO stSensorInfo;
CAMINFO stCamInfo;
int flag = 0,memId=0;
flag = is_InitCamera(&hCam, NULL);
if (flag == 0)
{
is_GetSensorInfo(hCam, &stSensorInfo);
is_GetCameraInfo(hCam, &stCamInfo);
is_SetColorMode(hCam, IS_CM_SENSOR_RAW8);
char *imgMem;
imgMem = (char*)malloc(stSensorInfo.nMaxHeight*stSensorInfo.nMaxWidth*sizeof(char));
memset(imgMem, 0, stSensorInfo.nMaxHeight*stSensorInfo.nMaxWidth*sizeof(char));
is_AllocImageMem(hCam, stSensorInfo.nMaxWidth, stSensorInfo.nMaxHeight, 8, &imgMem, &memId);
is_SetImageMem(hCam, imgMem, memId);
is_CaptureVideo(hCam, IS_WAIT);
is_StopLiveVideo(hCam,IS_WAIT);//2018/08/07 添加内容
#if 1 //测试buffer
cv::Mat img = cv::Mat((int)stSensorInfo.nMaxHeight, (int)stSensorInfo.nMaxWidth, CV_8UC1);
for (int i = 0; i < (int)stSensorInfo.nMaxHeight; i++)
{
for (int j = 0; j < (int)stSensorInfo.nMaxWidth; j++)
{
img.at<uchar>(i, j) = imgMem[i*(int)stSensorInfo.nMaxWidth + j];
}
}
#endif
is_FreeImageMem ( hCam, imgMem, memId );
is_ExitCamera(hCam);
}
else
{
std::cout << "相机初始化失败!" << std::endl;
std::cin.get();
return 0;
}
std::cin.get();
return 0;
}
----------------------------------
后续再进行相机属性控制,以及双相机的二次开发。
----------------------------------
2018/08/07 更新说明:
在代码中添加了停止视频帧函数,便于在进行连续抓图时,不会出现丢帧的情况!
连续抓图的代码如下:
---------------------------------
#include <iostream>
#include <opencv2/opencv.hpp>
#include <ueye.h>
struct Camera
{
HIDS hCam;
char* pImageMem;
int nImageID;
int RenderMode;
SENSORINFO SensorInfo;
CAMINFO CamInfo;
int nBitsPerPixel;
bool bLive;
bool bOpened;
};
/*
借鉴IDS自带的SDK开发包进行相机出图
2018/08/06 增加循环测试
时间:2018/08/06
*/
int main()
{
HIDS hCam = 0;
SENSORINFO stSensorInfo;
CAMINFO stCamInfo;
int flag = 0,memId=0;
flag = is_InitCamera(&hCam, NULL);
int n = 80;//连续抓80帧
while (n-- > 0)
{
if (flag == 0)
{
is_GetSensorInfo(hCam, &stSensorInfo);
is_GetCameraInfo(hCam, &stCamInfo);
is_SetColorMode(hCam, IS_CM_SENSOR_RAW8);
char *imgMem;
imgMem = (char*)malloc(stSensorInfo.nMaxHeight*stSensorInfo.nMaxWidth*sizeof(char));
memset(imgMem, 0, stSensorInfo.nMaxHeight*stSensorInfo.nMaxWidth*sizeof(char));
is_AllocImageMem(hCam, stSensorInfo.nMaxWidth, stSensorInfo.nMaxHeight, 8, &imgMem, &memId);
is_SetImageMem(hCam, imgMem, memId);
is_CaptureVideo(hCam, IS_WAIT);
is_StopLiveVideo(hCam, IS_WAIT);
#if 1 //测试buffer
//Sleep(800);
cv::Mat img = cv::Mat((int)stSensorInfo.nMaxHeight, (int)stSensorInfo.nMaxWidth, CV_8UC1);
for (int i = 0; i < (int)stSensorInfo.nMaxHeight; i++)
{
for (int j = 0; j < (int)stSensorInfo.nMaxWidth; j++)
{
img.at<uchar>(i, j) = imgMem[i*(int)stSensorInfo.nMaxWidth + j];
}
}
#endif
cv::imwrite("F:\\1.bmp", img);
is_FreeImageMem ( hCam, imgMem, memId );//释放内存 20180820添加
}
else
{
std::cout << "相机初始化失败!" << std::endl;
std::cin.get();
return 0;
}
}
is_ExitCamera(hCam);
std::cin.get();
return 0;
}
---------------------------------