IDS相机SDK二次开发

接手的项目又用到了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;
}

---------------------------------

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值