海康工业相机 显示帧转换为MAT

文章详细介绍了如何从海康相机的帧数据中提取信息,并将其转换为MAT格式。首先定义了显示帧信息结构体,然后在回调方法中保存帧数据,包括数据指针、长度、宽度、高度和像素类型。最后,使用这些信息创建了一个MAT图像,转换数据格式为MatType.CV_8UC1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义取帧 
MyCamera.MV_DISPLAY_FRAME_INFO[] stDisplayFrameInfo = new MyCamera.MV_DISPLAY_FRAME_INFO[4];

 2.改写回调方法
private void ImageCallBack(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser)
        {
            int nIndex = (int)pUser;

            // ch:抓取的帧数 | en:Aquired Frame Number
            ++m_nFrames[nIndex];

            lock (m_BufForSaveImageLock[nIndex])
            {
                if (m_pSaveImageBuf[nIndex] == IntPtr.Zero || pFrameInfo.nFrameLen > m_nSaveImageBufSize[nIndex])
                {
                    if (m_pSaveImageBuf[nIndex] != IntPtr.Zero)
                    {
                        Marshal.Release(m_pSaveImageBuf[nIndex]);
                        m_pSaveImageBuf[nIndex] = IntPtr.Zero;
                    }

                    m_pSaveImageBuf[nIndex] = Marshal.AllocHGlobal((Int32)pFrameInfo.nFrameLen);
                    if (m_pSaveImageBuf[nIndex] == IntPtr.Zero)
                    {
                        return;
                    }
                    m_nSaveImageBufSize[nIndex] = pFrameInfo.nFrameLen;
                }

                m_stFrameInfo[nIndex] = pFrameInfo;
                CopyMemory(m_pSaveImageBuf[nIndex], pData, pFrameInfo.nFrameLen);
            }

            MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();
            stDisplayInfo.hWnd = m_hDisplayHandle[nIndex];
            stDisplayInfo.pData = pData;
            stDisplayInfo.nDataLen = pFrameInfo.nFrameLen;
            stDisplayInfo.nWidth = pFrameInfo.nWidth;
            stDisplayInfo.nHeight = pFrameInfo.nHeight;
            stDisplayInfo.enPixelType = pFrameInfo.enPixelType;
            

            m_pMyCamera[nIndex].MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);

// 下面的代码是我加入的
            stDisplayFrameInfo[nIndex].pData = pData;
            stDisplayFrameInfo[nIndex].nDataLen = pFrameInfo.nFrameLen;
            stDisplayFrameInfo[nIndex].nWidth = pFrameInfo.nWidth;
            stDisplayFrameInfo[nIndex].nHeight = pFrameInfo.nHeight;
            stDisplayFrameInfo[nIndex].enPixelType = pFrameInfo.enPixelType;
        }

 把海康相机帧转换为MAT格式

把显示帧转换为Mat格式
 
Mat image = new Mat(stDisplayFrameInfo[0].nHeight, stDisplayFrameInfo[0].nWidth, MatType.CV_8UC1, stDisplayFrameInfo[0].pData);

海康官网 代码示例

在官方示例中加入的代码

1.定义显示帧信息 

MyCamera.MV_DISPLAY_FRAME_INFO[] stDisplayFrameInfo = new MyCamera.MV_DISPLAY_FRAME_INFO[4];

 2.把帧数据保存

            stDisplayFrameInfo[nIndex].pData = pData;
            stDisplayFrameInfo[nIndex].nDataLen = pFrameInfo.nFrameLen;
            stDisplayFrameInfo[nIndex].nWidth = pFrameInfo.nWidth;
            stDisplayFrameInfo[nIndex].nHeight = pFrameInfo.nHeight;
            stDisplayFrameInfo[nIndex].enPixelType = pFrameInfo.enPixelType;

3.转换数据格式

 Mat image = new Mat(stDisplayFrameInfo[0].nHeight, stDisplayFrameInfo[0].nWidth, MatType.CV_8UC1, stDisplayFrameInfo[0].pData);

### MFC 调用海康工业相机示例代码 在MFC项目中调用海康工业相机主要涉及初始化设备、设置回调函数以及处理图像数据等操作。以下是具体实现方法: #### 初始化设备 为了能够正常访问并控制海康工业相机,需先完成设备的初始化工作。这通常包括加载SDK库文件、注册网络芯片及创建实例对象等内容。 ```cpp // 加载 SDK 库 #pragma comment(lib, "HCNetSDK.lib") #include "windows.h" #include "HCNetSDK.h" BOOL InitCamera() { NET_DVR_Init(); // 初始化 HCNetSDK // 注册网络芯片 (如果需要) NET_DVR_SetConnectTime(2000, 1); // 创建登录句柄 LONG lUserID = NET_DVR_Login_V30("IP地址", 8000, "用户名", "密码"); if(lUserID < 0){ printf("Login failed\n"); return FALSE; } return TRUE; } ``` #### 设置实时预览回调函数 当成功连接到摄像头之后,可以配置其实时视频流参数,并指定用于接收每一画面的数据回调函数。此部分对于后续获取图像至关重要。 ```cpp void CALLBACK RealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser) { static int frameCount = 0; switch(dwDataType) { case NET_DVR_SYSHEAD: break; case NET_DVR_STREAMDATA: // 将接收到的数据保存起来供后面解码显示使用 SaveStreamData(pBuffer, dwBufSize); ++frameCount; if(frameCount % 30 == 0){ // 每隔一定数量更新一次UI UpdatePreviewWindow(); } break; } } LONG StartRealPlay(HWND hWnd, LONG lUserID) { NET_DVR_PREVIEWINFO previewInfo = { sizeof(NET_DVR_PREVIEWINFO) }; previewInfo.hPlayWnd = hWnd; previewInfo.lChannel = 1; previewInfo.dwStreamType = STREAM_TYPE_MAIN; previewInfo.bBlocked = 1; return NET_DVR_RealPlay_V40(lUserID, &previewInfo, RealDataCallBack, NULL); } ``` #### 图像数据转换为OpenCV Mat类型 一旦获得了来自摄像机的实际像素信息,则可以通过适当的方式将其转化为适合于进一步分析的形式——比如OpenCV中的`cv::Mat`结构体。这里展示了一个简单的例子来说明这一过程[^2]。 ```cpp IplImage* ConvertToIplImage(BYTE* pBuffer, DWORD dwBufSize) { IplImage* img = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, channels); memcpy(img->imageData, pBuffer, min((int)(img->widthStep * height), (int)dwBufSize)); return img; } cv::Mat GetFrameAsMat(HWND hwnd) { // 假设已经实现了从缓冲区读取最新一的功能... BYTE* buffer = ReadLatestFrameFromBuffer(); IplImage* iplImg = ConvertToIplImage(buffer, bufferSize); cv::Mat mat(iplImg,true); cvReleaseImage(&iplImg); return mat.clone(); } ``` 以上就是关于如何在MFC环境中利用海康提供的API接口来进行基本的操作介绍。需要注意的是实际应用场景可能会更加复杂一些,因此建议开发者仔细阅读官方文档以获得更详尽的帮助和支持[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值