13362
- 收藏
- 点赞
- 分享
- 举报
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. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
102015-12-14 11:35:36
-
2013-05-18 19:45:00
-
2021-06-20 21:46:35
-
2014-04-17 09:29:27
-
2021-06-20 21:45:10
-
2020-07-22 22:53:14
-
2016-01-20 14:43:29
-
2019-12-27 14:29:00
-
2018-06-15 16:29:14
-
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
-
2014-12-05 13:55:19
-
12016-06-14 18:01:37
-
2018-02-06 10:14:50
-
2020-11-26 16:56:05
-
2018-06-08 11:39:10
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认