opencv 一些函数的耗时计算
Release 模式
--------------------------------------------------
smooth gaussian : 2
cvtColor CV_BGR2Lab : 3
get_psnr : 16
convertTo CV_8U: 6
absdiff: 2
threshold: 0
dilate 20: 3
fill_hole : 3
bitwise_xor : 0
shape : 0
copyTo 3 channels : 0
select_color : 14
smooth median : 1
gen_bgra : 3
cal_color : 4
pic_mix : 22
110ms
--------------------------------------------------
smooth gaussian : 5
smooth median : 5
cvtColor CV_BGR2Lab : 3
accumulateWeighted : 11
convertTo CV_8U: 7
absdiff: 2
threshold: 0
dilate 20: 8
fill_hole : 1
bitwise_xor : 0
shape : 0
copyTo 3 channels : 0
select_color : 129
smooth median : 5
gen_bgra : 0
cal_color : 4
pic_mix : 23
gen_bgra : 3
all : 317ms
1.
float , int , char 的 加、乘、移位运算的耗时整理, 循环周期为 1000*1000*100
Debug模式:
int 加法:194
int 加两次:391
float 加法:1237
float 乘法:551
Release模式
int 加1次:35
int 加2次:37(分1个循环)
int 加2次:67 (2个循环)
float 加法:292
float 乘法:367
int型的加减乘除移位
右移8位 63ms -----最高效
除以256 97ms
除以256.0 368ms
除以255 144ms
除以255.0 1165ms
32位和8位整形的运算时间大致相等---------所以用32位处理图像数据会更快。
i*7 和(i<<2) + (i<<1) + i 的时间大致相等,所以不需要把整形的乘法改为移位,但是一定要把整形的除法改为移位。
unsigned char [1920*1080] 分配内存 100 000次, 总耗时313ms
int [1920*1080] 分配内存 100 000次, 总耗时413ms
2. opencv遍历Mat中的short数据
for for { short * param = (short*)(res_map.data + sizeof(short)*of3); } 耗时4ms (DEBUG模式)
short * param = &((short*)res_map.data)[of3]; 耗时4ms (DEBUG模式) 与上述相同
Vec3s& param = res_map.at<Vec3s>(__j,__i); 耗时75 ms (DEBUG模式)------大循环里千万不要用这种方式访问图像
short * param = &((short*)res_map.data)[of3];
short _index = param[0];
short _i = param[1];
short _j = param[2];
----耗时7ms
short * param = &((short*)res_map.data)[of3];
short& _index = param[0];
short& _i = param[1];
short& _j = param[2];
----short用引用耗时7ms
继续增加语句 int _of3 = (_j*wh+i)*3; 耗时8.4ms
继续增加语句 uchar* pixel = &mats[_index]->data[_of3]; ------31ms 麻痹的,大循环里千万不要对vector进行随机访问!!!
pixel 改成这种方法获取 uchar * pixel = &mats[_index].data[of3]; ---- 10ms
继续增加语句
res.data[of3] = pixel[0];
res.data[of3 + 1] = pixel[1];
res.data[of3 + 2] = pixel[2];
of3 += 3;
--------耗时20ms (DEBUG)
上述赋值方法改为
uchar * data = &res.data[of3];
data[0] = pixel[0];
data[1] = pixel[1];
data[2] = pixel[2];
--------耗时20ms (DEBUG) 耗时并未改变
改为
uchar * data = &res.data[of3];
memcpy( data,pixel,3 ); 18.1ms
改为
uchar * data = &res.data[of3];
memcpy( data,pixel,4 ); ------18.2ms 耗时减少, 可能是由于拷贝的是32位数据的原因?
使用一个循环 for (int j = 0; j != size; ++j) ----18.5ms 和上面一样, 并不能减少耗时
3. mix_pix 耗时:
3.1 耗时 36 ms
int _res_y = (fg_y*res_a + bg_y*_255_a)>>8;
int _res_cb = (fg_cb*res_a + bg_cb*_255_a) >> 8;
int _res_cr = (fg_cr*res_a + bg_cr*_255_a) >> 8;
3.2 耗时36 ms
int _res_y = (res_a*(fg_y - bg_y) >> 8) + bg_y;
int _res_cb = (res_a*(fg_cb - bg_cb) >> 8) + bg_cb;
int _res_cr = (res_a*(fg_cr - bg_cr) >> 8) + bg_cr;
3.3 注释mix_pix 代码 耗时 28ms
3.4 注释 mix_pix 函数里面的所有代码 29 ms
3.5 注释 int _res_y = (fg_y*res_a + bg_y*_255_a)>>8; 耗时 33ms
3.6 加CLAMP 比不加CLAMP 慢3-4 ms
4. convertT
src.convertTo(src_16s, CV_16SC3); 1080片: 3 ms
src.convertTo(src_16s, CV_32FC3); 6ms
src.convertTo(src_16s, CV_32SC3); 6ms
opencv 一些函数的耗时计算的更多相关文章
- opencv-6-图像绘制与opencv Line 函数剖析
opencv-6-图像绘制与opencv Line 函数剖析 opencvc++qt 开始之前 越到后面, 写的越慢, 之前还抽空去看了下 学堂在线那篇文章提供的方法, 博客第一个人评论的我, 想想还 ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列
11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...
- opencv 霍夫变换 实现图片旋转角度计算
在OCR实际开发中,证件照采集角度有很大的偏差,需要将图片进行旋转校正, 效果图: 在应用中发现应该加入高斯模糊,可以极大减少误差线条. 知道线条后 通过求斜率 得旋转角度 .(x1-x2)/(y1- ...
- C/C++多参数函数参数的计算顺序与压栈顺序
一.前言 今天在看Thinking in C++这本书时,书中的一个例子引起了我的注意,具体是使用了下面这句 单看这条语句的语义会发现仅仅是使用一个简单的string的substr函数将所得子串pus ...
- Numpy.frompyfunc()将计算单个值的函数转化为计算数组中每个元素的函数
Numpy.frompyfunc()将计算单个值的函数转化为计算数组中每个元素的函数 不再通过遍历,对数组中的元素进行运算,利用frompyfunc()将计算单个值的函数转化为计算数组中每个元素的函数 ...
- 【记录一个问题】macos下lldb调试opencv的一个程序,出现“failed to load objfile for”错误,并且无法调试进入opencv的函数
opencv编译使用了Debug版本,打开了BUILD_WITH_DEBUG_INFO=ON选项. 发现问题后,我又在CMAKE_CXX_FLAGS_DEBUG中设置为 -g -ggdb3,在CMAK ...
- Golang记录、计算函数执行耗时、运行时间的一个简单方法
// 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time.Time, timeLimit float64) { ...
- 【麦子学院】OpenCV教程函数总结
个自带样例. parter 1: No1. adaptiveskindetector.cpp 利用HSV空间的色调信息的皮肤检測,背景不能有太多与肤色相似的颜色.效果不是特别好. No2. bagof ...
- opencv ---getRotationMatrix2D函数
getRotationMatrix2D函数 主要用于获得图像绕着 某一点的旋转矩阵 Mat getRotationMatrix2D(Point2f center, double angle, dou ...
随机推荐
- Java-NIO 之 Selector 与 Pipe
关于阻塞与非阻塞:https://www.cnblogs.com/jhxxb/p/11272727.html 一.传统的 IO 流都是阻塞式的 当一个线程调用 read() 或 write() 时,该 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上
笔记 3.Feign结合Hystrix断路器开发实战<上> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖 注意:网上新旧版本问 ...
- ssm整合用到的依赖jar包(不充足)
<!--spring 的核心的jar包--><dependency> <groupId>org.springframework</groupId> &l ...
- leetcode 257. 二叉树的所有路径 包含(二叉树的先序遍历、中序遍历、后序遍历)
给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \2 3 \ 5 输出: ["1->2->5", & ...
- WMPageController设置menuView的左右视图
效果图如下: 绿色的是自定义的emenuView的rightView哟!!! 代码实现如下: // // CategoryVC.m // JSHui // // Created by Apple on ...
- Servlet(1):基础概念/最简实例
Servlet 生命周期(1) init()方法初始化Servlet对象 它在第一次创建Servlet时被调用,在后续每次不同用户请求时不再调用.(2) service()方法来处理客户端的请求 ...
- 视区相关单位vw, vh
vw:相对于视窗的宽度,视窗宽度是100vw vh:相对于视窗的高度,视窗高度是100vh 参考资料:[https://www.zhangxinxu.com/wordpress/2012/09/new ...
- .NET中的简单的并行
https://www.cnblogs.com/hdwgxz/p/6129419.html https://www.cnblogs.com/hueychan/p/10575907.html
- 20190526 - CentOS 7 中 安装 MySQL 8 并授权 root 远程访问
1. CentOS 7 中 安装 MySQL 8 CentOS 7 中内置 MariaDB 建议升级一下用,性能好很多.但如果一定要用 MySQL 8,就得自己装. 坦白的说,Oracle 升级 My ...
- Postman的安装和升级
安装postman Postman本地应用程序 Postman可以作为Mac,Windows和Linux操作系统的本地应用程序. 要安装Postman,请转到应用界面,并根据你的平台点击Mac/Win ...