搜索
bottom↓
回复: 11

关于YUV422格式转灰度图像,算法优化问题

[复制链接]

出0入0汤圆

发表于 2017-10-19 14:05:37 | 显示全部楼层 |阅读模式
YUV422格式 ,Y分量占一个字节,UV合起来占一个字节,现在只提取Y分量,相当于只需要数组中的偶数字节,
图像大小是640×480,如果按单字节提取1帧,大概40ms,如果按4字节处理,大约20ms,请教坛里大侠,有没有更好的方法。



#define   IMAGE_SIZE  (640×480)

//按4字节处理,大概20ms
void copy_image_data(uint32_t* src, uint32_t* dst)
{
  uint32_t s1, s2, d1;
  for (int i = 0; i < IMAGE_SIZE*2; i += 16) {
    s1 = *src++;
    s2 = *src++;
    d1 = s1 & 0x000000ff;
    d1 |= (s1 >> 8) & 0x0000ff00;
    d1 |= (s2 << 16) & 0x00ff0000;
    d1 |= (s2 << 8) & 0xff000000;

    *dst++ = d1;
  }
}

//按单字节处理,大概40ms
void copy_image_data(uint8_t* src, uint8_t* dst)
{
      for (int i = 0, j = 0; j < IMAGE_SIZE; i += 2, j += 1) {
       dst[j] = src[i];
     }
}

希望抛砖引玉

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-10-19 14:42:10 | 显示全部楼层
用数组方式操作指针可能会降低效率,直接指针自加要好些吧

出0入8汤圆

发表于 2017-10-19 15:35:08 | 显示全部楼层
#define   IMAGE_SIZE  (640×480)
这个是啥意思?    x   是啥玩意儿?   *  么?

for (int i = 0; i < IMAGE_SIZE*2; i += 16)
for (int i = 0, j = 0; j < IMAGE_SIZE; i += 2, j += 1)
这两个,没个循环都做一次乘法么?  这开销可真是不小啊。不知道啥CPU 。

出0入0汤圆

发表于 2017-10-19 15:54:59 | 显示全部楼层
本帖最后由 shiva_shiva 于 2017-10-19 16:01 编辑

嵌入式优化和硬件关系比较大:
1、c语言编译局部优化开到最大;
2、改成汇编实现
3、关键代码特殊照顾(比如有些小arm是在flash执行,改到ram会提高速度,有些芯片放到内部sram比外部扩展的DRAM要快等)
4、...

出0入0汤圆

 楼主| 发表于 2017-10-19 16:18:43 | 显示全部楼层
tongdayusu 发表于 2017-10-19 15:35
#define   IMAGE_SIZE  (640×480)
这个是啥意思?    x   是啥玩意儿?   *  么?

应该是 #define   IMAGE_SIZE  (640*480)  输入法问题,不会每个循环都乘法的,这个是常数,编译器自动会算的

CPU 是 君正 X1000,LIUNX 系统,频率1G

出0入0汤圆

发表于 2017-10-19 19:17:25 | 显示全部楼层
直接移位操作已经是最快的了

出0入0汤圆

发表于 2017-10-19 20:15:17 | 显示全部楼层
不知DMA能否实现,楼主可以研究一下。
比如把外设地址设为16位,内存地址设为8位。
如果不行,还有硬件的办法:
我在使用OV7670的时候,数据时钟接到TIM4_CH1,将它的捕获分频设置为2分频去触发DMA即可只采集Y信号。

出0入0汤圆

发表于 2017-10-19 20:52:11 | 显示全部楼层
void copy_image_data(uint16_t* src, uint8_t* dst)
{
      for (int i = 0;i < IMAGE_SIZE) {
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
       dst[i] = (uint8_t)(src[i++]);
     }
}

   测试下这个代码要多久呢?

出0入8汤圆

发表于 2017-10-20 00:51:50 来自手机 | 显示全部楼层
wx85105157 发表于 2017-10-19 20:52
void copy_image_data(uint16_t* src, uint8_t* dst)
{
      for (int i = 0;i < IMAGE_SIZE) {

直接*dst++=*src++;
复制image size遍,无分枝,不会打断流水线

出0入0汤圆

 楼主| 发表于 2017-10-20 11:42:25 | 显示全部楼层
wx85105157 发表于 2017-10-19 20:52
void copy_image_data(uint16_t* src, uint8_t* dst)
{
      for (int i = 0;i < IMAGE_SIZE) {

这个 40ms




*dst++=*src++; 的方式 22ms

出0入0汤圆

发表于 2017-10-20 23:43:31 来自手机 | 显示全部楼层
请自行搜索 让你的程序飞起来 这篇文章,就是讲类似档主的应用的。rgb转灰度,查表处理,速度极快。

出0入0汤圆

发表于 2018-4-22 08:39:44 | 显示全部楼层
如果还不行,只能汇编优化了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 13:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表