一.前言

最近准备做一个图形检测项目练手,奈何选用的UVC摄像头支持YUYV或MJPG格式不能直接使用,对网上大部分关于yuyv转rgb888转化算法都如下原代码所示(我自己也搞不清这代码是从那抄的,所以未贴引用网址)。虽然有现成代码现成可抄来用,奈何选用平台主控NUC977(主频300M,不支持浮点运算和硬件解码)实在太差,直接怼上去比放PPT还慢。随其改其代码,主要针对浮点运算修改,以及重复计算修改,改完之后可以明显感觉到性能提升。

大家可以进行查阅,比较学习,敝人也是参考各位大佬代码,希望可以共同学习,如有意见可以共同讨论。

二.原代码


int video_device::yuyv_2_rgb888(const void *p, int size, unsigned char *frame_buffer)
{int i,j;unsigned char y1,y2,u,v;int r1,g1,b1,r2,g2,b2;const char *pointer;size++;pointer = (const char *)p;for(i=0;i<480;i++){for(j=0;j<320;j++){y1 = *( pointer + (i*320+j)*4);u  = *( pointer + (i*320+j)*4 + 1);y2 = *( pointer + (i*320+j)*4 + 2);v  = *( pointer + (i*320+j)*4 + 3);r1 = y1 + 1.042*(v-128);g1 = y1 - 0.34414*(u-128) - 0.71414*(v-128);b1 = y1 + 1.772*(u-128);r2 = y2 + 1.042*(v-128);g2 = y2 - 0.34414*(u-128) - 0.71414*(v-128);b2 = y2 + 1.772*(u-128);if(r1>255)                r1 = 255;else if(r1<0)             r1 = 0;if(b1>255)                b1 = 255;else if(b1<0)             b1 = 0;if(g1>255)                g1 = 255;else if(g1<0)             g1 = 0;if(r2>255)                r2 = 255;else if(r2<0)             r2 = 0;if(b2>255)                b2 = 255;else if(b2<0)             b2 = 0;if(g2>255)                g2 = 255;else if(g2<0)             g2 = 0;*(frame_buffer + ((480-1-i)*320+j)*6    ) = (unsigned char)b1;*(frame_buffer + ((480-1-i)*320+j)*6 + 1) = (unsigned char)g1;*(frame_buffer + ((480-1-i)*320+j)*6 + 2) = (unsigned char)r1;*(frame_buffer + ((480-1-i)*320+j)*6 + 3) = (unsigned char)b2;*(frame_buffer + ((480-1-i)*320+j)*6 + 4) = (unsigned char)g2;*(frame_buffer + ((480-1-i)*320+j)*6 + 5) = (unsigned char)r2;}}// pr_debug("\tchange to RGB OK \n");return 0;
}

三.优化代码


int video_device::yuyv_2_rgb888(const void *p, int size, unsigned char *frame_buffer)
{int i,j;unsigned char y1,y2;int r1,g1,b1,r2,g2,b2,u,v;unsigned char *pointer;for(i=0; i<size; i++){pointer = (unsigned char *)p + i*4;y1 = *  pointer++;u  = *( pointer++) - 128;y2 = *( pointer++);v  = *( pointer  ) - 128;r1 = (266*v) >> 8;g1 = (88*u) + ((183*v)) >> 8;b1 = (454*u) >> 8;r2 = y2 + r1;g2 = y2 - g1;b2 = y2 + b1;r1 = y1 + r1;g1 = y1 - g1;b1 = y1 + b1;if(r1>255)                r1 = 255;else if(r1<0)             r1 = 0;if(b1>255)                b1 = 255;else if(b1<0)             b1 = 0;if(g1>255)                g1 = 255;else if(g1<0)             g1 = 0;if(r2>255)                r2 = 255;else if(r2<0)             r2 = 0;if(b2>255)                b2 = 255;else if(b2<0)             b2 = 0;if(g2>255)                g2 = 255;else if(g2<0)             g2 = 0;pointer = frame_buffer + i*6;*(pointer++) = (unsigned char)b1;*(pointer++) = (unsigned char)g1;*(pointer++) = (unsigned char)r1;*(pointer++) = (unsigned char)b2;*(pointer++) = (unsigned char)g2;*(pointer  ) = (unsigned char)r2;}// pr_debug("\tchange to RGB OK \n");return 0;
}

02.yuyv转rgb888代码优化相关推荐

  1. 数仓建模 项目_音乐数据项目火力全开,技能双倍提升!

    ↑ 点击上方"尚学堂"关注我们 音乐数据中心数仓综合项目 1项目介绍 音乐数据中心项目是大型企业级综合数仓项目,此项目针对音乐数据进行分析,构建数据仓库,建立用户.机器.内容等主题 ...

  2. Linux下V4L2框架基于SDL库本地USB摄像头监控

    Linux下V4L2框架基于SDL库本地USB摄像头监控 1.摄像头框架编程步骤 (1)打开摄像头设备(/dev/video0 ./dev/video1 ) (2)设置图像格式:VIDIOC_S_FM ...

  3. python的执行效率没有c语言高,Python代码优化

    摘自https://www.cnblogs.com/duaimili/p/10275728.html 众所周知,程序的性能好坏影响着用户体验.所以性能是留住用户很重要的一环.Python 语言虽然能做 ...

  4. python基础===Python 代码优化常见技巧

    Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 8 ...

  5. 02使用常规步骤编译NanoPiM1Plus的Android4.4.2

    02使用常规步骤编译NanoPiM1Plus的Android4.4.2 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/5 17:51 版本 ...

  6. Python 代码优化常见技巧

    代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方 ...

  7. seo代码优化工具_企业seo该怎么优化

    同学们大家好,今天分享一下企业官网如何做seo优化,又有哪些Seo的优化流程.在我们刚接手的网站时候,不能盲目的着急去操作,首先要做的是:全面地去分析整个企业网站的各种历史数据.着重检查有没有robo ...

  8. Java 中代码优化的 30 个小技巧(下)

    21 防止死循环 有些小伙伴看到这个标题,可能会感到有点意外,代码中不是应该避免死循环吗?为啥还是会产生死循环? 殊不知有些死循环是我们自己写的,例如下面这段代码: while(true) {if(c ...

  9. 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇——02

    本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...

最新文章

  1. function收集
  2. windows组件中没有IIS解决方法
  3. 使用Socket模拟聊天室
  4. WebApi接口 - 响应输出xml和json 转
  5. 宝塔php的opcache模块未载入,宝塔面板CPU负载过高使用opcache扩展的解决方法
  6. 清除java_如何在Java地毯下有效地清除问题
  7. 稀疏矩阵建立十字链表c语言,实验6-稀疏矩阵十字链表的存储.doc
  8. 微软算法面试题(4)
  9. maya如何导出ue4_ue4 maya max导入导出问题
  10. angular 设置接口调用地址_[译] 关于 Angular 的变化检测,你需要知道的一切
  11. 使用加密签名时遇到的一个问题
  12. VS2011最新版本 新功能 新增特性 简介Visual Studio 2011
  13. 学习记录:xmind2testcase测试用例模板
  14. 【二】[详细]针孔相机模型、相机镜头畸变模型、相机标定与OpenCV实现
  15. 蚁群算法求最值c语言实现,蚁群算法代码(求函数最值)
  16. HDUOJ 4513 吉哥系列故事——完美队形II
  17. 六张图片形成立方体并旋转
  18. docker 离线安装字体库
  19. 通过复制粘贴输入网址
  20. Google map获取手机屏幕当前显示地图的范围

热门文章

  1. PHP爆绝对路径方法总结帖
  2. 用计算机打字教案,教学设计-有趣的打字练习游戏
  3. python计算纪念日相关
  4. JAVA有percentile函数吗_Python numpy.percentile函数方法的使用
  5. 指数基金投资指南读书笔记
  6. 从校园人到职业人的转变
  7. 迷途emlog模板全站好看的变色模板源码
  8. Android 仿微信小程序开屏页加载loading
  9. python怎么设置随机数种子_Pytorch在dataloader类中设置shuffle的随机数种子方式
  10. Ubuntu18.04下 LOAM_Velodyne 的编译安装(PCL为1.8.1)