1.流程调用图

2.部分代码分析

//模板函数进行颜色空间的转换

template <typename Cvt>

void CvtColorLoop(const Mat& src, Mat& dst, const Cvt& cvt)

{

//封装Tbb的并行结构parallel_for,OpenCV导出为:parallel_for_

//Range:迭代范围类 CvtColorLoop_Invoker<Cvt>:模板类

parallel_for_(Range(0, src.rows), CvtColorLoop_Invoker<Cvt>(src, dst, cvt),

src.total()/(double)(1<<16) );

}

//OpenCV导出迭代范围类:Range

class CV_EXPORTS Range

{

public:

Range();

Range(int _start, int _end);

Range(const CvSlice& slice);

int size() const;

bool empty() const;

static Range all();

operator CvSlice() const;

int start, end;

};

//模板类继承纯虚基类ParallelLoopBody

template <typename Cvt>

class CvtColorLoop_Invoker : public ParallelLoopBody

{

//模板类的类型

typedef typename Cvt::channel_type _Tp;

public:

//模板类的构造函数变量传递,传入数据

CvtColorLoop_Invoker(const Mat& _src, Mat& _dst, const Cvt& _cvt) :

ParallelLoopBody(), src(_src), dst(_dst), cvt(_cvt){}

//子类化纯虚函数,遍历Mat的行数

virtual void operator()(const Range& range) const

{

const uchar* yS = src.ptr<uchar>(range.start);

uchar* yD = dst.ptr<uchar>(range.start);

for( int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step )

cvt((const _Tp*)yS, (_Tp*)yD, src.cols);

}

private:

const Mat& src;

Mat& dst;

const Cvt& cvt;

const CvtColorLoop_Invoker& operator= (const CvtColorLoop_Invoker&);

};

//模板类的具体实现

struct RGB2HLS_S_f

{

//明确具体的数据类型:float

typedef float channel_type;

//传入其他相关参数

RGB2HLS_S_f(int _srccn, int _blueIdx): srccn(_srccn), blueIdx(_blueIdx) {}

//在模板类中被调用,遍历Mat的列数,并进行具体的取值及其他运算:核心公式计算部分

void operator()(const float* src, float* dst, int n) const

{     int i, bidx = blueIdx, scn = srccn;

n *= 3;

for( i = 0; i < n; i += 3, src += scn )

{

float b = src[bidx], g = src[1], r = src[bidx^2];

float h = 0.f, s = 0.f, l;

float vmin, vmax, diff;

vmax = vmin = r;

     if( vmax < g ) vmax = g;

     if( vmax < b ) vmax = b;

     if( vmin > g ) vmin = g;

     if( vmin > b ) vmin = b;

     diff = vmax - vmin;

     l = (vmax + vmin)*0.5f;

    if( diff > FLT_EPSILON )

    {

      s = l < 0.5f ? diff/(vmax + vmin) : diff/(2 - vmax - vmin);

    }

    dst[i+2] = s;

    }

  }

  int srccn, blueIdx;

};

OpenCV源码分析:RGB到其他色彩空间的转换的更多相关文章

  1. opencv 源码分析 CUDA可分离滤波器设计 ( 发现OpenCV的cuda真TM慢 )

    1. 主函数 void SeparableLinearFilter::apply(InputArray _src, OutputArray _dst, Stream& _stream) { G ...

  2. ffplay源码分析5-图像格式转换

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10311376.html ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg ...

  3. 最新版ffmpeg源码分析

    最新版ffmpeg源码分析一:框架 (ffmpeg v0.9) 框架 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下 ...

  4. Linq转换操作之ToArray,ToList,ToDictionary源码分析

    Linq转换操作之ToArray,ToList,ToDictionary源码分析 一:linq中的转换运算符 1. ToArray 我们经常用在linq查询上吧. linq只能运用在IEnumerab ...

  5. Vue.js 源码分析(二十七) 高级应用 异步组件 详解

    当我们的项目足够大,使用的组件就会很多,此时如果一次性加载所有的组件是比较花费时间的.一开始就把所有的组件都加载是没必要的一笔开销,此时可以用异步组件来优化一下. 异步组件简单的说就是只有等到在页面里 ...

  6. Vue.js 源码分析(二十四) 高级应用 自定义指令详解

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令. 官网介绍的比较抽象,显得很高大上,我个人对自定义指令的理解是:当自定义指令作用在一些DOM元素或组件上 ...

  7. Vue.js 源码分析(二十三) 指令篇 v-show指令详解

    v-show的作用是将表达式值转换为布尔值,根据该布尔值的真假来显示/隐藏切换元素,它是通过切换元素的display这个css属性值来实现的,例如: <!DOCTYPE html> < ...

  8. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  9. 【OpenCV】SIFT原理与源码分析:DoG尺度空间构造

    原文地址:http://blog.csdn.net/xiaowei_cqu/article/details/8067881 尺度空间理论   自然界中的物体随着观测尺度不同有不同的表现形态.例如我们形 ...

随机推荐

  1. GIt的命令

    Git 命令 1,git init初始化当前文件夹为git仓库的根目录 2.git commit提交到本地仓库 3.git push origin master 提交到服务器 4.git log 查看 ...

  2. 关于ebox

         看了介绍,觉得挺不错的东西,希望能够一路走下去       老话题STM32编程,新思路,一样是编程,味道却大有不同.这就是STM32之eBox编程.让你提议不一样的编程,让开发快到你意想不 ...

  3. JavaScript原型理解

    这东西我还不是很理解,但是把自己实践的过程记录下来,希望积累到一定程度,能自然而而然的理解了.很多东西我是这样慢慢理解的,明白为啥是那样子,真的很神奇哦.少说废话,开始吧. 可以先阅读这篇文章 fun ...

  4. [attribute^=value] 匹配给定的属性是以某些值开始的元素

    描述: 查找所有 name 以 'news' 开始的 input 元素 HTML 代码: <input name="newsletter" /> <input n ...

  5. [课程设计]Scrum 1.3 多鱼点餐系统开发进度(系统主界面框架&美化)

    Scrum 1.3 多鱼点餐系统开发进度(系统主界面框架&美化) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅 ...

  6. js 多少天以后的时间

    /** * 多少天以后的时间 * @param date 时间 * @param num 多少天 * @param type 类型 年 月 天(默认天) */ exports.afterDate = ...

  7. Android官方数据绑定框架DataBinding

    数据绑定框架给我们带来了更大的方便性,以前我们可能需要在Activity里写很多的findViewById,烦人的代码也增加了我们代码的耦合性,现在我们马上就可以抛弃那么多的findViewById. ...

  8. GMF:如何让网格显示在background,而不是foreground

    前言 很久没写文章了,准备写一系列关于Eclipse RCP /Plugin的文章. 这些文章都是trouble shooting性质的,不准备写的很细,当你碰到这样的问题,google到时,能帮你把 ...

  9. 【Session】Tomcat中Session的外置

    > 参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化. ...

  10. Linux基本操作1 - 设备操作

    Linux开发的过程中,肯定会使用到很多设备,所以对设备的挂载卸载是一个很基本的操作. Linux对设备的默认定义如下: 一.Linux中的硬件设备号     设 备          设 备 号   ...