相关文章推荐
愉快的核桃  ·  批量大小不匹配·  6 月前    · 
宽容的自行车  ·  CRUDer ...·  1 年前    · 

在前文讲解了海康工业相机SDK与OpenCV的安装与环境配置,本文接着讲解SDK给的OpenCV的demo,主要实现RawDataFormatConvert的功能,即将海康连续采集的图像转化为OpenCV的Mat格式并显示于屏幕。

一、海康工业相机SDK详解

在海康SDK安装位置,找到D:\Softwares\MVS\Development\Samples\OpenCV\VC的Samples_OpenCV.sln并打开,下面会先对SDK的调用相机的各功能进行详解:

1.1 首先定义句柄和相机操作的返回值,当相机操作出现问题时,需要将nRet,可以根据对应的返回值查询可能出现的问题。

    int nRet = MV_OK;
    void* handle = NULL;

1.2 列出当前的设备管理目录,输入对应值,选择相应的相机设备。

        // Enum device
        MV_CC_DEVICE_INFO_LIST stDeviceList;
        memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));
        nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);
        if (MV_OK != nRet)
            printf("Enum Devices fail! nRet [0x%x]\n", nRet);
            break;
        if (stDeviceList.nDeviceNum > 0)
            for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++)
                printf("[device %d]:\n", i);
                MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];
                if (NULL == pDeviceInfo)
                    break;
                PrintDeviceInfo(pDeviceInfo);
            printf("Find No Devices!\n");
            break;
        // input the format to convert
        unsigned int nFormat = 0;
        // select device to connect
        printf("Please Input camera index(0-%d):", stDeviceList.nDeviceNum-1);
        unsigned int nIndex = 0;
        scanf("%d", &nIndex);
        if (nIndex >= stDeviceList.nDeviceNum)
            printf("Input error!\n");
            break;

1.3 创建句柄并打开相机设备

        // Select device and create handle
        nRet = MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);
        if (MV_OK != nRet)
            printf("Create Handle fail! nRet [0x%x]\n", nRet);
            break;
        // open device
        nRet = MV_CC_OpenDevice(handle);
        if (MV_OK != nRet)
            printf("Open Device fail! nRet [0x%x]\n", nRet);
            break;

1.4 设置相机参数,图片的宽度与高度、相机的曝光时间与增益;返回相机参数,图片的宽度与高度、相机的曝光时间与增益。

        nRet = SetParameters(handle, WidthValue, HeightValue, ExposureTimeValue, GainValue);
        if (MV_OK != nRet)
            printf("Set parameters fail! nRet [0x%x]\n", nRet);
            break;
        nRet = GetParameters(handle);
        if (MV_OK != nRet)
            printf("Get parameters fail! nRet [0x%x]\n", nRet);
            break;

1.5 设置网络最佳的包大小,设置相机的触发模式

        // Detection network optimal package size(It only works for the GigE camera)
        if (stDeviceList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE)
            int nPacketSize = MV_CC_GetOptimalPacketSize(handle);
            if (nPacketSize > 0)
                nRet = MV_CC_SetIntValue(handle,"GevSCPSPacketSize",nPacketSize);
                if(nRet != MV_OK)
                    printf("Warning: Set Packet Size fail nRet [0x%x]!", nRet);
                printf("Warning: Get Packet Size fail nRet [0x%x]!", nPacketSize);
        // Set trigger mode as off
        nRet = MV_CC_SetEnumValue(handle, "TriggerMode", 0);
        if (MV_OK != nRet)
            printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);
            break;
        // Get payload size
        MVCC_INTVALUE stParam;
        memset(&stParam, 0, sizeof(MVCC_INTVALUE));
        nRet = MV_CC_GetIntValue(handle, "PayloadSize", &stParam);
        if (MV_OK != nRet)
            printf("Get PayloadSize fail! nRet [0x%x]\n", nRet);
            break;
        g_nPayloadSize = stParam.nCurValue;

1.6 开启连续采集模式,并分配缓冲内存区

        // Start grab image
        nRet = MV_CC_StartGrabbing(handle);
        if (MV_OK != nRet)
            printf("Start Grabbing fail! nRet [0x%x]\n", nRet);
            break;
        MV_FRAME_OUT stImageInfo = {0};
        memset(&stImageInfo, 0, sizeof(MV_FRAME_OUT));
        unsigned char * pData = (unsigned char *)malloc(sizeof(unsigned char) * (g_nPayloadSize));
        if (pData == NULL)
            printf("Allocate memory failed.\n");
            break;

1.7 停止采集

        // Stop grab image
        nRet = MV_CC_StopGrabbing(handle);
        if (MV_OK != nRet)
            printf("Stop Grabbing fail! nRet [0x%x]\n", nRet);
            break;

1.8 关闭相机并摧毁句柄

        // Close device
        nRet = MV_CC_CloseDevice(handle);
        if (MV_OK != nRet)
            printf("ClosDevice fail! nRet [0x%x]\n", nRet);
            break;
        // Destroy handle
        nRet = MV_CC_DestroyHandle(handle);
        if (MV_OK != nRet)
            printf("Destroy Handle fail! nRet [0x%x]\n", nRet);
            break;

二、OpenCV相关操作

在RawDataFormatConvert中,最主要的功能是将连续采集的图片,从相机的缓冲区域转化OpenCV的Mat格式,并在屏幕上显示,因此我们可以利用Mat格式调用OpenCV的相关操作。

while (true)
            clock_t startTime, endTime;
            startTime = clock();
            nRet = MV_CC_GetImageBuffer(handle, &stImageInfo, 1000);
            if (nRet == MV_OK)
                printf("Get One Frame: Width[%d], Height[%d], nFrameNum[%d]\n",
                    stImageInfo.stFrameInfo.nWidth, stImageInfo.stFrameInfo.nHeight, stImageInfo.stFrameInfo.nFrameNum);
                printf("No data[0x%x]\n", nRet);
                free(pData);
                pData = NULL;
                break;
            cv::Mat srcImage;
            srcImage = cv::Mat(stImageInfo.stFrameInfo.nHeight, stImageInfo.stFrameInfo.nWidth, CV_8UC1, stImageInfo.pBufAddr);
            cv::namedWindow("srcImage", 0);
            cv::resizeWindow("srcImage", 918, 768);
            cv::imshow("srcImage", srcImage);
            cv::waitKey(1);
            srcImage.release();
            nRet = MV_CC_FreeImageBuffer(handle, &stImageInfo);
            endTime = clock();
            std::cout << "Run Time:" << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << std::endl;
            std::cout<< std::endl;

根据上述代码,我们将ImageBuffer区域的数据转化为Mat格式,并且根据CV_8UC1格式,可知图像应为灰度图,这要与相机图像格式对应。

三、运行结果

运行结果如图所示:
在这里插入图片描述
在这里插入图片描述

public MyCamera myCamera;//相机对象 MyCamera.MV_CC_DEVICE_INFO_LIST m_pDeviceList; IntPtr m_BufForDriver = IntPtr.Zero; private static O... 文章讲的是C#调用大华相机SDK,通过回调事件获取图片并转换成visionpro的Icogimage格式,文章底部会分享例程。在调用SDK之前,需要先安装大华的相机软件到C盘,不安装到C盘会显示依赖项的缺失,无法运行dll,有大哥有其他办法的加群交流。01—大华SDK帮助类介绍,这里做了个dll的帮助类,把相机基本功能都写进去了:枚举-实例化-相机连接-回调取图-触发设置-曝光调试等-关闭相机;其... 工控机主要应用与视觉检测!相机网线及工控机网口都是千兆的!设置完巨帧数和速度与双工(选择为全双工),显示速度低与1GB,不能够正常工作。C.LA-Properdes-Advanced-将RecerveBuffers更改为2048。E.LAN-属性-电源管理-取消选中允许计算机关闭此设备以保存电源。这种情况均为MVS设置不熟悉,可参照如下设置优化相应端口相机配置。D.局域网-属性-高级-将传输缓冲区更改为20484。B.LAN-属性-高级-将中断记录部分更改为执行。A.关闭采集控制帧速率控制。 1.不会转换格式先找demo 开发海康相机sdk联合opencv的时候,格式转换问题搞了整整一天,一开始不知道如何将抓图得到的数据转成opencv的Mat格式用于图像处理,于是开始找海康自带的demo和开发手册,在这里也建议最好看第一时间就看开发手册及自带demo。我一开始是在下载的sdk里找demo,后面发现下载mvs(海康的客户端)的安装... 针对视频播放的可以参见H264播放器编程指南。它里面用到如下方法获取 BOOL PlayM4_GetJPEG(LONG nPort,PBYTE pJpeg,DWORD nBufSize,DWORD* pJpegSize); SDK版本: CH-HCNetSDK(Linux)4.0.2.7 OpenCv:2.2.0 将控制台演示代码的 GetStream.cpp 覆盖为以下,就能转换成 IplImage 内存数据,IplImage *img 是YUV格式,IplImage *imgBgr 是BGR格式: 系列博客———————-海康威视摄像头+OpenCV+VS2017 图像处理小结(二)本系列博客记载博主用海康威视网络摄像头以及OpenCV库和VS2017开发环境搭建  视频处理工程  的过程,主要是海康威视摄像头与电脑的有线与无线连接,视频流数据的获取以及格式转换,开发环境以及三方库的的配置, 多线程处理转码后的图像帧的相关步骤,并且给出了一个简单的实时人脸检测例程。第一篇主要介绍海康摄像头的... 1、海康威视摄像头+OpenCV+VS2017 图像处理小结(一 详细描述了相机的型号、配置软件 2、海康威视摄像头+OpenCV+VS2017 图像处理小结(二) 讲述了工程目录构建和配置: