Python RGB转NV21快速实现思路及部分代码

正常RGB 转 NV21思路:

1:RGB转YUV(与系数矩阵相乘,具体可百度)

2:YUV转NV21(此时YUV的行数是RGB的1.5倍,后1-1.5倍行的UV需要调整,NV21先V后U)

3:写NV21数据

存在问题:python的for循环挨个写入太慢了,一张4K*3K的JPG图转YUV需要10S以上;

 

快速实现RGB 转 NV21思路(4K*3K图仅需0.3S):

1:利用CV2自带的BGR转I420(I420的格式排列请咨询百度,与NV21很相似)

yuvData = cv2.cvtColor(rgbData, cv2.COLOR_BGR2YUV_I420)

2:I420转NV21,利用numpy矩阵加速运算

 height = rgbData.shape[0]
 width = rgbData.shape[1]

uData = yuvData[height: height + height // 4, :]
uData = uData.reshape((1, height // 4 * width))
vData = yuvData[height + height // 4: height + height // 2, :]
vData = vData.reshape((1, height // 4 * width))
uvData = np.zeros((1, height // 4 * width * 2))
uvData[:, 0::2] = vData
uvData[:, 1::2] = uData
uvData = uvData.reshape((height // 2, width))
nv21Data = np.zeros((height + height // 2, width))
nv21Data[0:height, :] = yuvData[0:height, :]
nv21Data[height::, :] = uvData

3:本地写入NV21数据

对于一张4656*3492分辨率的图,耗费时间由12秒左右提升至0.3秒,效率提升40倍。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值