使用大华摄像头SDK读取的网络流数据怎么转化为opencv的Mat

weixin_44875634 2020-12-02 11:21:06
我使用大华摄像头的SDK进行开发的时候,从SDK的回调函数接收到原始的图像信息,但是我想直接使用opencv读取内存中的数据,没有什么思路。各位大佬有没有什么好的方法。主要代码如下:

char fileName[30] = "originData";
void CALLBACK RealDataCallBackEx(LLONG lRealHandle, DWORD dwDataType, BYTE
* pBuffer, DWORD dwBufSize, LONG param, LDWORD dwUser)
{
//pBuffer指向的是数据缓冲区的头部,dwBufSize是数据的大小。
switch (dwDataType)
{
case 0:
//原始音视频混合数据
printf("receive real data, param: lRealHandle[%p], dwDataType[%d], pBuffer[%p], dwBufSize[%d]\n",
lRealHandle, dwDataType, pBuffer, dwBufSize);
CLIENT_SaveRealData(lRealHandle, fileName);
break;
。。。。。。。。



我如果直接将原始数据保存成文件,在PotPlayer可以直接打开,在PotPlayer上查看文件的编码属性如下:

[滤镜使用列表]
(1) Built-in DVR Source
(2) Built-in Video Codec/Transform
(3) Enhanced Video Renderer(Custom Present)

[视频信息]
视频编码: HEVC - Native D3D9 DXVA Decoder(VLD) - Intel(R) UHD Graphics 630
输入格式: HEVC(24 bits)
输入尺寸: 1280 × 960(1.33:1)
输出格式: dxva
输出尺寸: 1280 × 960(1.33:1)
帧率: 25
BitRate: 未知


根据终端打印的信息,每次接受的原始数据信息地址相同,但是大小每次会有差异。

receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4415]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4604]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[32768]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[1881]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[173]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4291]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4711]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4655]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[5007]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4577]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4609]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4656]
receive real data, param: lRealHandle[000002BED5B0E580], dwDataType[0], pBuffer[000000CA6F2F3070], dwBufSize[4533]


在这种情况下如何才能将原始的图像信息转换成opencv能处理的图片格式。各位大佬有没有什么思路。望指点一二。
...全文
5028 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
durui_12315 2023-05-31
  • 打赏
  • 举报
回复

我也遇到了同样的问题,请问解决了吗?怎么解决的?

yanyanyan165 2021-05-27
  • 打赏
  • 举报
回复
获取大华的rtsp,官网应该有 VideoCapture capture.open(rtsp字符串); mat frame; capture >> frame;
wyl2077 2021-05-08
  • 打赏
  • 举报
回复
如何设置DWORD dwDataType 呢
「已注销」 2021-02-08
  • 打赏
  • 举报
回复 1
这是原始码流,就是压缩后的H264数据,你可以设置DWORD dwDataType 来获取YUV数据,再将YUV数据转为cv::Mat即可, 使用如下几行代码进行转换即可 cv::Mat yuv(IMAGE_HEIGHT + IMAGE_HEIGHT / 2, IMAGE_WIDTH, CV_8UC1, pBuf); //图片的宽高要与视频分辨率对应 cv::Mat bgr; cv::cvtColor(yuv, bgr, CV_YUV2RGB_YV12);
aiyang2372 2020-12-09
  • 打赏
  • 举报
回复
也遇到同样的问题,希望共同探讨

19,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧