【opencv源码解析】 二、 cvtColor
这里以CV_BGR2YUV_I420来讲
1. opencv244
core.cpp
- void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
- {
- ...
- case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12:
- case COLOR_RGB2YUV_IYUV: case COLOR_BGR2YUV_IYUV: case COLOR_RGBA2YUV_IYUV: case COLOR_BGRA2YUV_IYUV:
- if (dcn <= ) dcn = ;
- uidx = (code == COLOR_BGR2YUV_IYUV || code == COLOR_BGRA2YUV_IYUV || code == COLOR_RGB2YUV_IYUV || code == COLOR_RGBA2YUV_IYUV) ? : ;
- CV_Assert( (scn == || scn == ) && depth == CV_8U );
- CV_Assert( dcn == );
- CV_Assert( sz.width % == && sz.height % == );
- _dst.create(Size(sz.width, sz.height / * ), CV_MAKETYPE(depth, dcn));
- dst = _dst.getMat();
- hal::cvtBGRtoThreePlaneYUV(src.data, src.step, dst.data, dst.step, src.cols, src.rows,
- scn, swapBlue(code), uidx);
- break;
- ...
- }
color.cpp
- void cvtBGRtoThreePlaneYUV(const uchar * src_data, size_t src_step,
- uchar * dst_data, size_t dst_step,
- int width, int height,
- int scn, bool swapBlue, int uIdx)
- {
- CV_INSTRUMENT_REGION()
- CALL_HAL(cvtBGRtoThreePlaneYUV, cv_hal_cvtBGRtoThreePlaneYUV, src_data, src_step, dst_data, dst_step, width, height, scn, swapBlue, uIdx);
- uchar * uv_data = dst_data + dst_step * height;
- RGB888toYUV420pInvoker(src_data, src_step, dst_data, uv_data, dst_step, width, height, scn, swapBlue, uIdx == , false).convert();
- }
color.cpp
- struct RGB888toYUV420pInvoker: public ParallelLoopBody
- {
- RGB888toYUV420pInvoker(const uchar * _src_data, size_t _src_step,
- uchar * _y_data, uchar * _uv_data, size_t _dst_step,
- int _src_width, int _src_height, int _scn, bool swapBlue_, bool swapUV_, bool interleaved_)
- : src_data(_src_data), src_step(_src_step),
- y_data(_y_data), uv_data(_uv_data), dst_step(_dst_step),
- src_width(_src_width), src_height(_src_height),
- scn(_scn), swapBlue(swapBlue_), swapUV(swapUV_), interleaved(interleaved_) { }
- void operator()(const Range& rowRange) const
- {
- const int w = src_width;
- const int h = src_height;
- const int cn = scn;
- for( int i = rowRange.start; i < rowRange.end; i++ )
- {
- const uchar* brow0 = src_data + src_step * ( * i);
- const uchar* grow0 = brow0 + ;
- const uchar* rrow0 = brow0 + ;
- const uchar* brow1 = src_data + src_step * ( * i + );
- const uchar* grow1 = brow1 + ;
- const uchar* rrow1 = brow1 + ;
- if (swapBlue)
- {
- std::swap(brow0, rrow0);
- std::swap(brow1, rrow1);
- }
- uchar* y = y_data + dst_step * (*i);
- uchar* u;
- uchar* v;
- if (interleaved)
- {
- u = uv_data + dst_step * i;
- v = uv_data + dst_step * i + ;
- }
- else
- {
- u = uv_data + dst_step * (i/) + (i % ) * (w/);
- v = uv_data + dst_step * ((i + h/)/) + ((i + h/) % ) * (w/);
- }
- if (swapUV)
- {
- std::swap(u, v);
- }
- for( int j = , k = ; j < w * cn; j += * cn, k++ )
- {
- int r00 = rrow0[j]; int g00 = grow0[j]; int b00 = brow0[j];
- int r01 = rrow0[cn + j]; int g01 = grow0[cn + j]; int b01 = brow0[cn + j];
- int r10 = rrow1[j]; int g10 = grow1[j]; int b10 = brow1[j];
- int r11 = rrow1[cn + j]; int g11 = grow1[cn + j]; int b11 = brow1[cn + j];
- const int shifted16 = ( << ITUR_BT_601_SHIFT);
- const int halfShift = ( << (ITUR_BT_601_SHIFT - ));
- int y00 = ITUR_BT_601_CRY * r00 + ITUR_BT_601_CGY * g00 + ITUR_BT_601_CBY * b00 + halfShift + shifted16;
- int y01 = ITUR_BT_601_CRY * r01 + ITUR_BT_601_CGY * g01 + ITUR_BT_601_CBY * b01 + halfShift + shifted16;
- int y10 = ITUR_BT_601_CRY * r10 + ITUR_BT_601_CGY * g10 + ITUR_BT_601_CBY * b10 + halfShift + shifted16;
- int y11 = ITUR_BT_601_CRY * r11 + ITUR_BT_601_CGY * g11 + ITUR_BT_601_CBY * b11 + halfShift + shifted16;
- y[*k + ] = saturate_cast<uchar>(y00 >> ITUR_BT_601_SHIFT);
- y[*k + ] = saturate_cast<uchar>(y01 >> ITUR_BT_601_SHIFT);
- y[*k + dst_step + ] = saturate_cast<uchar>(y10 >> ITUR_BT_601_SHIFT);
- y[*k + dst_step + ] = saturate_cast<uchar>(y11 >> ITUR_BT_601_SHIFT);
- const int shifted128 = ( << ITUR_BT_601_SHIFT);
- int u00 = ITUR_BT_601_CRU * r00 + ITUR_BT_601_CGU * g00 + ITUR_BT_601_CBU * b00 + halfShift + shifted128;
- int v00 = ITUR_BT_601_CBU * r00 + ITUR_BT_601_CGV * g00 + ITUR_BT_601_CBV * b00 + halfShift + shifted128;
- if (interleaved)
- {
- u[k*] = saturate_cast<uchar>(u00 >> ITUR_BT_601_SHIFT);
- v[k*] = saturate_cast<uchar>(v00 >> ITUR_BT_601_SHIFT);
- }
- else
- {
- u[k] = saturate_cast<uchar>(u00 >> ITUR_BT_601_SHIFT);
- v[k] = saturate_cast<uchar>(v00 >> ITUR_BT_601_SHIFT);
- }
- }
- }
- }
- void convert() const
- {
- if( src_width * src_height >= * )
- parallel_for_(Range(, src_height/), *this);
- else
- operator()(Range(, src_height/));
- }
- private:
- RGB888toYUV420pInvoker& operator=(const RGB888toYUV420pInvoker&);
- const uchar * src_data;
- size_t src_step;
- uchar *y_data, *uv_data;
- size_t dst_step;
- int src_width;
- int src_height;
- const int scn;
- bool swapBlue;
- bool swapUV;
- bool interleaved;
- };
2. opencv347 使用opencl
- bool oclCvtColorTwoPlaneYUV2BGR( InputArray _src, OutputArray _dst, int dcn, int bidx, int uidx )
- {
- OclHelper< Set<>, Set<, >, Set<CV_8U>, FROM_YUV > h(_src, _dst, dcn);
- if(!h.createKernel("YUV2RGB_NVx", ocl::imgproc::color_yuv_oclsrc,
- format("-D dcn=%d -D bidx=%d -D uidx=%d", dcn, bidx, uidx)))
- {
- return false;
- }
- return h.run();
- }
【opencv源码解析】 二、 cvtColor的更多相关文章
- Mybatis源码解析(二) —— 加载 Configuration
Mybatis源码解析(二) -- 加载 Configuration 正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...
- RxJava2源码解析(二)
title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...
- Sentinel源码解析二(Slot总览)
写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...
- OpenCV源码解析
OpenCV K-means源码解析 OpenCV 图片读取源码解析 OpenCV 视频播放源码解析 OpenCV 追踪算法源码解析 OpenCV SIFT算法源码解析 OpenCV 滤波源码分析:b ...
- iOS即时通讯之CocoaAsyncSocket源码解析二
原文 前言 本文承接上文:iOS即时通讯之CocoaAsyncSocket源码解析一 上文我们提到了GCDAsyncSocket的初始化,以及最终connect之前的准备工作,包括一些错误检查:本机地 ...
- jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究
终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...
- Common.Logging源码解析二
Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...
- erlang下lists模块sort(排序)方法源码解析(二)
上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...
- element-ui 源码解析 二
Carousel 走马灯源码解析 1. 基本原理:页面切换 页面切换使用的是 transform 2D 转换和 transition 过渡 可以看出是采用内联样式来实现的 举个栗子 <div : ...
- ArrayList源码解析(二)
欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 自己学习ArrayList源码的一些心得记录. 继续上一篇,Arra ...
随机推荐
- 【Java】给整数加上千分位分隔符
package com.testEmp; import java.text.DecimalFormat; public class NumberFormat { public static void ...
- 解决Sublime Text3中文显示乱码问题
一.安装包管理器 使用Ctrl+~快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码 import urllib.request,os; pf = 'Package ...
- 如何配置git send-email相关的邮箱信息?
关键是配置smtpserver,请参考此处
- vsftpd 配置用户及根目录及其参数详解
vsftpd 常用功能参数配置及参数详解 Table of Contents 1. 配置超级服务 2. 配置匿名用户 3. 配置本地用户登录 4. 配置虚拟用户登录 5. 使用SSL登入 6. 日志文 ...
- 安装nodejs 后运行 npm 命令无响应
安装和卸载过nodejs, 也编辑过 C:\Users\{账户}\下的.npmrc文件. 再全新安装nodejs ,运行npm 命令,无响应. 处理方法,删除C:\Users\{账户}\下的.npmr ...
- .SpringIOC容器
创建对象 SpringIOC容器,是spring核心内容. 作用: 创建对象 & 处理对象的依赖关系 IOC容器创建对象: 创建对象, 有几种方式: 1) 调用无参数构造器 2) 带参数构造器 ...
- hibernate关联总结
在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率! 配置一对多与多对一,这种叫“双向关联” 只配置一对多, ...
- maven项目无法导入Oracle的jdbc连接jar包【我】
导入一个maven项目,启动一直报错 找不到Oracle的jdbc连接驱动Class, 用Eclipse导入 ojdbc14.jar 连接包,各种方法都无效,无法引入到部署后的lib目录中,可以直接放 ...
- selenium webdriver常用函数
from selenium import webdriver driver = webdriver.Ie(executable_path = "e:\\IEDriverServer" ...
- Linux 查看 MySQL的版本信息
Linux 查看 MySQL的版本信息 如何查看某台 Linux 主机上的 安装的 MySQL版本信息? 使用如下命令,查看 MySQL的版本信息: mysql -V 或者 mysql --versi ...