13724
- 收藏
- 点赞
- 分享
- 举报
yuv转RGB,生成图片仍然为黑白。
本帖最后由 zhuifengsn 于 2015-5-16 15:04 编辑
我的开发板是HI3520D,我通过getframe函数获取一帧,然后从网上找了YUV转RGB的公式进行转换成RGB24,通过opencv的函数将图片保存下来。发现保存的图片仍然为黑白色。我尝试过修改YUV2RGB转换的公式系数,但始终没有获得彩色图片。想问下有没有朋友有过类似的经历,如果有测试代码共享下就更好了!
我的思路:
1,获取一帧YUV图像数据;
2,通过HI_MPI_SYS_Mmap函数将物理地址映射到内存;
3,根据semiplanar420存储YUV的特点(Y连续,UV交叉存储),依次取出YUV数据;
4,通过公式来进行像素值转换;
5,将数据存入iplimage中;
6,保存RGB图像到本地。
以下为我的部分代码:
[code]/* get video frame from vi chn */
s32ret = HI_MPI_VI_GetFrame(ViChn, &stFrame) ;
if (HI_SUCCESS != s32ret)
{
printf("get vi frame err:0x%x\n", s32ret);
return s32ret;
}
/* deal with video frame ... */
int height=stFrame.stVFrame.u32Height;
int width=stFrame.stVFrame.u32Width;
unsigned char *Ybuf= (unsigned char *) malloc(sizeof(unsigned char)*height*width);
unsigned char *UVbuf=(unsigned char *) malloc(sizeof(unsigned char)*height*width/2);
int R,G,B,Y,U,V;
Ybuf = (unsigned char *) HI_MPI_SYS_Mmap(stFrame.stVFrame.u32PhyAddr[0], height*width);
UVbuf = (unsigned char *) HI_MPI_SYS_Mmap(stFrame.stVFrame.u32PhyAddr[1], height*width/2);
/* yuv转RGB单通道 */
for(i=0;i
{
for(j=0;j
{
(gryimg->imageData+i*IMG_WIDTH)[j*gryimg->nChannels]=
*(Ybuf+i*IMG_WIDTH+j);
//灰度图片为单通道,故nchannels=1
}
}
/* yuv转RGB */
for(i=0;i
{
for(j=0;j
{//存储顺序为:BGR
Y=max(Ybuf[i*IMG_WIDTH+j],0);
U=max(UVbuf[((i*IMG_WIDTH+j)/4)*2]-128,0);
V=max(UVbuf[((i*IMG_WIDTH+j)/4)*2+1]-128,0);
//cout<<"u="< B = Y + 1.779 *U;
G = Y-0.3455 *U-0.7169 *V;
R = Y + 1.0475 *V;
B = min(255, max(0, B));
G = min(255, max(0, G));
R = min(255, max(0, R));
img->imageData[i*IMG_WIDTH*3+3*j]= B;//B' = Y' + 2.032*U'
img->imageData[i*IMG_WIDTH*3+3*j+1]= G;//G' = Y' - 0.394*U' - 0.581*V'
img->imageData[i*IMG_WIDTH*3+3*j+2]= R;//R' = Y' + 1.140*V'
}
} [/code]
实际处理得到的图片如下:
(1)直接保存灰度图

(2)RGB24图

我的开发板是HI3520D,我通过getframe函数获取一帧,然后从网上找了YUV转RGB的公式进行转换成RGB24,通过opencv的函数将图片保存下来。发现保存的图片仍然为黑白色。我尝试过修改YUV2RGB转换的公式系数,但始终没有获得彩色图片。想问下有没有朋友有过类似的经历,如果有测试代码共享下就更好了!
我的思路:
1,获取一帧YUV图像数据;
2,通过HI_MPI_SYS_Mmap函数将物理地址映射到内存;
3,根据semiplanar420存储YUV的特点(Y连续,UV交叉存储),依次取出YUV数据;
4,通过公式来进行像素值转换;
5,将数据存入iplimage中;
6,保存RGB图像到本地。
以下为我的部分代码:
[code]/* get video frame from vi chn */
s32ret = HI_MPI_VI_GetFrame(ViChn, &stFrame) ;
if (HI_SUCCESS != s32ret)
{
printf("get vi frame err:0x%x\n", s32ret);
return s32ret;
}
/* deal with video frame ... */
int height=stFrame.stVFrame.u32Height;
int width=stFrame.stVFrame.u32Width;
unsigned char *Ybuf= (unsigned char *) malloc(sizeof(unsigned char)*height*width);
unsigned char *UVbuf=(unsigned char *) malloc(sizeof(unsigned char)*height*width/2);
int R,G,B,Y,U,V;
Ybuf = (unsigned char *) HI_MPI_SYS_Mmap(stFrame.stVFrame.u32PhyAddr[0], height*width);
UVbuf = (unsigned char *) HI_MPI_SYS_Mmap(stFrame.stVFrame.u32PhyAddr[1], height*width/2);
/* yuv转RGB单通道 */
for(i=0;i
for(j=0;j
(gryimg->imageData+i*IMG_WIDTH)[j*gryimg->nChannels]=
*(Ybuf+i*IMG_WIDTH+j);
//灰度图片为单通道,故nchannels=1
}
}
/* yuv转RGB */
for(i=0;i
for(j=0;j
Y=max(Ybuf[i*IMG_WIDTH+j],0);
U=max(UVbuf[((i*IMG_WIDTH+j)/4)*2]-128,0);
V=max(UVbuf[((i*IMG_WIDTH+j)/4)*2+1]-128,0);
//cout<<"u="< B = Y + 1.779 *U;
G = Y-0.3455 *U-0.7169 *V;
R = Y + 1.0475 *V;
B = min(255, max(0, B));
G = min(255, max(0, G));
R = min(255, max(0, R));
img->imageData[i*IMG_WIDTH*3+3*j]= B;//B' = Y' + 2.032*U'
img->imageData[i*IMG_WIDTH*3+3*j+1]= G;//G' = Y' - 0.394*U' - 0.581*V'
img->imageData[i*IMG_WIDTH*3+3*j+2]= R;//R' = Y' + 1.140*V'
}
} [/code]
实际处理得到的图片如下:
(1)直接保存灰度图

(2)RGB24图

我来回答
回答20个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片
相关问答
-
102015-12-14 11:35:36
-
2021-06-20 21:46:35
-
2013-05-18 19:45:00
-
2014-04-17 09:29:27
-
2021-06-20 21:45:10
-
2020-07-22 22:53:14
-
2016-01-20 14:43:29
-
2018-06-15 16:29:14
-
2019-12-27 14:29:00
-
2025-04-15 16:49:25
-
2015-01-05 20:12:58
-
2018-01-10 15:58:53
-
32019-04-16 14:47:01
-
2016-11-08 10:14:09
-
2016-11-08 10:02:25
-
2018-02-06 10:14:50
-
12016-06-14 18:01:37
-
2014-12-05 13:55:19
-
2020-11-26 16:56:05
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5hisi3516cv610 + gc4336p 夜晚很模糊
-
5AIISP(功能演示,SC4336P为BGGR,强制转RGGB,会导致颜色异常)
-
5rv1106使用luckfox的SDK,设备树和驱动都写好了,结果设备文件没有生成
-
5海思3516cv610中如何进行SD卡升级,根据官方文档操作,烧录进板子时,走的默认uboot,没有执行uboot升级。
-
5G610Q-IPC-38E 夜晚很暗 有什么办法解决吗 已经补光了
-
10转换模型时,SoC版本里没显示hi3516cv610芯片
-
5hisi3516cv610 使用 yolov8n 模型训练 要如何提高 这里识别的是人
-
10有人在海思平台接过SC035HGS吗
-
5关于hi3519dv500,以SD卡虚拟 U 盘操作
-
5ss928 sample_venc代码移植到openEuler24.03上执行报错 [sample_comm_vi_start_dev]-1068: vi set dev attr failed wi
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认

微信扫码分享
QQ好友