作者小头像 Lv.1
0 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
TA还没获得勋章~
成长雷达
0
0
0
0
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

发布时间 2024/03/05 09:32:25 最后回复 郝蕾 2024/03/15 21:15:24 版块 MDC智能驾驶计算平台
55 5 0
他的回复:
问题已解决,感谢各位!我说一下解决思路,我使用的相机是通过网线传输的数据,从相机获取到的是YUV422Planner格式的图像,首先把YUV422Planner格式转换为RGB: char * YCbYCrPlannar2Rgb(const unsigned char* src, char* dest, int width, int height){ const unsigned char *CbBase = src + width * height; const unsigned char *CrBase = CbBase + width * height / 2; for(int i=0; i RGB tmp = Yuv2Rgb(src[i], CbBase[i/2], CrBase[i/2]); dest[i*3+R] = tmp.r; dest[i*3+G] = tmp.g; dest[i*3+B] = tmp.b; tmp = Yuv2Rgb(src[i+1], CbBase[i/2], CrBase[i/2]); dest[(i+1)*3+R] = tmp.r; dest[(i+1)*3+G] = tmp.g; dest[(i+1)*3+B] = tmp.b; } return dest;}然后用opencv的cvtcolor函数将RGB格式转换为YUV_I420cv::cvtColor(yuv422PlannarMat, yuvI420, CV_RGB2YUV_I420); 再将YUV_I420转为YUV420 N12格式(VENC输入要求的格式)void YUV_I4202NV12(unsigned char* i420bytes, unsigned char* nv12bytes, int width, int height){ int nLenY = width * height; int nLenU = nLenY / 4; memcpy(nv12bytes, i420bytes, width * height); for (int i = 0; i nLenU; i++) { nv12bytes[nLenY + 2 * i] = i420bytes[nLenY + i]; // U nv12bytes[nLenY + 2 * i + 1] = i420bytes[nLenY + nLenU + i]; // V }}至此就可以拿到VENC转换所需要的图像,但是相机是一帧一帧发送的图像,当使用VENC将每张图像转换为H.265格式并通过MViz发送时,发现发给MViz的图像格式还是不正确,然后在文档中发现了问题。DVPP(VENC模块)处理每一路图片数据的编码时,对于首帧图片数据,会调用两次回调函数,第一次调用回调函数处理文件头信息,第二次调用回调函数处理本帧的图片数据意思就是转换成的H.265数据除了图像数据帧外还需要头信息,而头信息只在第一次调用VENC回调的时候才会生成,所以在第一次调用VENC回调的时候需要将头信息保存下来,之后处理的每帧图像中将保存的头信息附加在数据帧之前,这样发送给MViz才能正常显示图像。