这里以CV_BGR2YUV_I420来讲

1. opencv244

core.cpp

  1. void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
  2. {
  3. ...
  4. case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12:
  5. case COLOR_RGB2YUV_IYUV: case COLOR_BGR2YUV_IYUV: case COLOR_RGBA2YUV_IYUV: case COLOR_BGRA2YUV_IYUV:
  6. if (dcn <= ) dcn = ;
  7. uidx = (code == COLOR_BGR2YUV_IYUV || code == COLOR_BGRA2YUV_IYUV || code == COLOR_RGB2YUV_IYUV || code == COLOR_RGBA2YUV_IYUV) ? : ;
  8. CV_Assert( (scn == || scn == ) && depth == CV_8U );
  9. CV_Assert( dcn == );
  10. CV_Assert( sz.width % == && sz.height % == );
  11. _dst.create(Size(sz.width, sz.height / * ), CV_MAKETYPE(depth, dcn));
  12. dst = _dst.getMat();
  13. hal::cvtBGRtoThreePlaneYUV(src.data, src.step, dst.data, dst.step, src.cols, src.rows,
  14. scn, swapBlue(code), uidx);
  15. break;
  16.  
  17. ...
  18. }

  

color.cpp

  1. void cvtBGRtoThreePlaneYUV(const uchar * src_data, size_t src_step,
  2. uchar * dst_data, size_t dst_step,
  3. int width, int height,
  4. int scn, bool swapBlue, int uIdx)
  5. {
  6. CV_INSTRUMENT_REGION()
  7.  
  8. CALL_HAL(cvtBGRtoThreePlaneYUV, cv_hal_cvtBGRtoThreePlaneYUV, src_data, src_step, dst_data, dst_step, width, height, scn, swapBlue, uIdx);
  9. uchar * uv_data = dst_data + dst_step * height;
  10. RGB888toYUV420pInvoker(src_data, src_step, dst_data, uv_data, dst_step, width, height, scn, swapBlue, uIdx == , false).convert();
  11. }
  12.  
  13.   

color.cpp

  1. struct RGB888toYUV420pInvoker: public ParallelLoopBody
  2. {
  3. RGB888toYUV420pInvoker(const uchar * _src_data, size_t _src_step,
  4. uchar * _y_data, uchar * _uv_data, size_t _dst_step,
  5. int _src_width, int _src_height, int _scn, bool swapBlue_, bool swapUV_, bool interleaved_)
  6. : src_data(_src_data), src_step(_src_step),
  7. y_data(_y_data), uv_data(_uv_data), dst_step(_dst_step),
  8. src_width(_src_width), src_height(_src_height),
  9. scn(_scn), swapBlue(swapBlue_), swapUV(swapUV_), interleaved(interleaved_) { }
  10.  
  11. void operator()(const Range& rowRange) const
  12. {
  13. const int w = src_width;
  14. const int h = src_height;
  15. const int cn = scn;
  16. for( int i = rowRange.start; i < rowRange.end; i++ )
  17. {
  18. const uchar* brow0 = src_data + src_step * ( * i);
  19. const uchar* grow0 = brow0 + ;
  20. const uchar* rrow0 = brow0 + ;
  21. const uchar* brow1 = src_data + src_step * ( * i + );
  22. const uchar* grow1 = brow1 + ;
  23. const uchar* rrow1 = brow1 + ;
  24. if (swapBlue)
  25. {
  26. std::swap(brow0, rrow0);
  27. std::swap(brow1, rrow1);
  28. }
  29.  
  30. uchar* y = y_data + dst_step * (*i);
  31. uchar* u;
  32. uchar* v;
  33. if (interleaved)
  34. {
  35. u = uv_data + dst_step * i;
  36. v = uv_data + dst_step * i + ;
  37. }
  38. else
  39. {
  40. u = uv_data + dst_step * (i/) + (i % ) * (w/);
  41. v = uv_data + dst_step * ((i + h/)/) + ((i + h/) % ) * (w/);
  42. }
  43.  
  44. if (swapUV)
  45. {
  46. std::swap(u, v);
  47. }
  48.  
  49. for( int j = , k = ; j < w * cn; j += * cn, k++ )
  50. {
  51. int r00 = rrow0[j]; int g00 = grow0[j]; int b00 = brow0[j];
  52. int r01 = rrow0[cn + j]; int g01 = grow0[cn + j]; int b01 = brow0[cn + j];
  53. int r10 = rrow1[j]; int g10 = grow1[j]; int b10 = brow1[j];
  54. int r11 = rrow1[cn + j]; int g11 = grow1[cn + j]; int b11 = brow1[cn + j];
  55.  
  56. const int shifted16 = ( << ITUR_BT_601_SHIFT);
  57. const int halfShift = ( << (ITUR_BT_601_SHIFT - ));
  58. int y00 = ITUR_BT_601_CRY * r00 + ITUR_BT_601_CGY * g00 + ITUR_BT_601_CBY * b00 + halfShift + shifted16;
  59. int y01 = ITUR_BT_601_CRY * r01 + ITUR_BT_601_CGY * g01 + ITUR_BT_601_CBY * b01 + halfShift + shifted16;
  60. int y10 = ITUR_BT_601_CRY * r10 + ITUR_BT_601_CGY * g10 + ITUR_BT_601_CBY * b10 + halfShift + shifted16;
  61. int y11 = ITUR_BT_601_CRY * r11 + ITUR_BT_601_CGY * g11 + ITUR_BT_601_CBY * b11 + halfShift + shifted16;
  62.  
  63. y[*k + ] = saturate_cast<uchar>(y00 >> ITUR_BT_601_SHIFT);
  64. y[*k + ] = saturate_cast<uchar>(y01 >> ITUR_BT_601_SHIFT);
  65. y[*k + dst_step + ] = saturate_cast<uchar>(y10 >> ITUR_BT_601_SHIFT);
  66. y[*k + dst_step + ] = saturate_cast<uchar>(y11 >> ITUR_BT_601_SHIFT);
  67.  
  68. const int shifted128 = ( << ITUR_BT_601_SHIFT);
  69. int u00 = ITUR_BT_601_CRU * r00 + ITUR_BT_601_CGU * g00 + ITUR_BT_601_CBU * b00 + halfShift + shifted128;
  70. int v00 = ITUR_BT_601_CBU * r00 + ITUR_BT_601_CGV * g00 + ITUR_BT_601_CBV * b00 + halfShift + shifted128;
  71.  
  72. if (interleaved)
  73. {
  74. u[k*] = saturate_cast<uchar>(u00 >> ITUR_BT_601_SHIFT);
  75. v[k*] = saturate_cast<uchar>(v00 >> ITUR_BT_601_SHIFT);
  76. }
  77. else
  78. {
  79. u[k] = saturate_cast<uchar>(u00 >> ITUR_BT_601_SHIFT);
  80. v[k] = saturate_cast<uchar>(v00 >> ITUR_BT_601_SHIFT);
  81. }
  82. }
  83. }
  84. }
  85.  
  86. void convert() const
  87. {
  88. if( src_width * src_height >= * )
  89. parallel_for_(Range(, src_height/), *this);
  90. else
  91. operator()(Range(, src_height/));
  92. }
  93.  
  94. private:
  95. RGB888toYUV420pInvoker& operator=(const RGB888toYUV420pInvoker&);
  96.  
  97. const uchar * src_data;
  98. size_t src_step;
  99. uchar *y_data, *uv_data;
  100. size_t dst_step;
  101. int src_width;
  102. int src_height;
  103. const int scn;
  104. bool swapBlue;
  105. bool swapUV;
  106. bool interleaved;
  107. };
  108.  
  109.   

2.   opencv347   使用opencl

  1. bool oclCvtColorTwoPlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int uidx )
  2. {
  3. OclHelper< Set<>, Set<, >, Set<CV_8U>, FROM_YUV > h(_src, _dst, dcn);
  4.  
  5. if(!h.createKernel("YUV2RGB_NVx", ocl::imgproc::color_yuv_oclsrc,
  6. format("-D dcn=%d -D bidx=%d -D uidx=%d", dcn, bidx, uidx)))
  7. {
  8. return false;
  9. }
  10.  
  11. return h.run();
  12. }

【opencv源码解析】 二、 cvtColor的更多相关文章

  1. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  2. RxJava2源码解析(二)

    title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...

  3. Sentinel源码解析二(Slot总览)

    写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...

  4. OpenCV源码解析

    OpenCV K-means源码解析 OpenCV 图片读取源码解析 OpenCV 视频播放源码解析 OpenCV 追踪算法源码解析 OpenCV SIFT算法源码解析 OpenCV 滤波源码分析:b ...

  5. iOS即时通讯之CocoaAsyncSocket源码解析二

    原文 前言 本文承接上文:iOS即时通讯之CocoaAsyncSocket源码解析一 上文我们提到了GCDAsyncSocket的初始化,以及最终connect之前的准备工作,包括一些错误检查:本机地 ...

  6. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  7. Common.Logging源码解析二

    Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...

  8. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

  9. element-ui 源码解析 二

    Carousel 走马灯源码解析 1. 基本原理:页面切换 页面切换使用的是 transform 2D 转换和 transition 过渡 可以看出是采用内联样式来实现的 举个栗子 <div : ...

  10. ArrayList源码解析(二)

    欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 自己学习ArrayList源码的一些心得记录. 继续上一篇,Arra ...

随机推荐

  1. 【Java】给整数加上千分位分隔符

    package com.testEmp; import java.text.DecimalFormat; public class NumberFormat { public static void ...

  2. 解决Sublime Text3中文显示乱码问题

    一.安装包管理器 使用Ctrl+~快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码 import urllib.request,os; pf = 'Package ...

  3. 如何配置git send-email相关的邮箱信息?

    关键是配置smtpserver,请参考此处

  4. vsftpd 配置用户及根目录及其参数详解

    vsftpd 常用功能参数配置及参数详解 Table of Contents 1. 配置超级服务 2. 配置匿名用户 3. 配置本地用户登录 4. 配置虚拟用户登录 5. 使用SSL登入 6. 日志文 ...

  5. 安装nodejs 后运行 npm 命令无响应

    安装和卸载过nodejs, 也编辑过 C:\Users\{账户}\下的.npmrc文件. 再全新安装nodejs ,运行npm 命令,无响应. 处理方法,删除C:\Users\{账户}\下的.npmr ...

  6. .SpringIOC容器

    创建对象 SpringIOC容器,是spring核心内容. 作用: 创建对象 & 处理对象的依赖关系 IOC容器创建对象: 创建对象, 有几种方式: 1) 调用无参数构造器 2) 带参数构造器 ...

  7. hibernate关联总结

    在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率! 配置一对多与多对一,这种叫“双向关联” 只配置一对多,  ...

  8. maven项目无法导入Oracle的jdbc连接jar包【我】

    导入一个maven项目,启动一直报错 找不到Oracle的jdbc连接驱动Class, 用Eclipse导入 ojdbc14.jar 连接包,各种方法都无效,无法引入到部署后的lib目录中,可以直接放 ...

  9. selenium webdriver常用函数

    from selenium import webdriver driver = webdriver.Ie(executable_path = "e:\\IEDriverServer" ...

  10. Linux 查看 MySQL的版本信息

    Linux 查看 MySQL的版本信息 如何查看某台 Linux 主机上的 安装的 MySQL版本信息? 使用如下命令,查看 MySQL的版本信息: mysql -V 或者 mysql --versi ...