OpenCV:OpenCV图像旋转的代码
OpenCV图像旋转的代码
cv::transpose( bfM, bfM )
前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了。直接使用两个指针对拷贝才是王道。不知道和OpenCV比较效果如何。
贴出下面的代码: C++
//图像旋转
cv::Mat Transpose(cv::Mat &inMat)
{
cv::Mat outMat( inMat.cols, inMat.rows, inMat.type() );
const int L = inMat.cols;
std::vector<unsigned char*> headers(L); for ( int x=0; x< inMat.cols; ++x )
{
//
unsigned char* ptrB = ( unsigned char* )(outMat.data + x * outMat.step) ;
headers[x] = ptrB;
} for ( int y=0 ;y < inMat.rows; ++y )
{
unsigned char* ptrA = ( unsigned char* )( inMat.data + y * inMat.step );
for ( int x=0; x< inMat.cols; ++x )
{
*headers[x]= *ptrA; ++(headers[x]);
++ptrA;
}
} return outMat;
}//cv::Mat Transpose(cv::Mat &inMat)
效果图:
原始图像:爱德华.蒙克的《星夜》(Edvard Munch 《Starry Night 》. 1893. 135.6 × 140 cm.J. Paul Getty Museum.)
测试结果1:
很遗憾,图像336*400,速度是为使用OpenCV库的1/20,3.167s。怎么改进?0.166s。
改进一下:
void cvWish::transpose( unsigned char* data, size_t step, int col )
{
int i, j;
for( i = 0; i < col; i++ )
{
unsigned char* row = (unsigned char*)(data + step*i);
unsigned char* dataR = data + i*sizeof(unsigned char);
for( j = i+1; j < col; j++ )
std::swap( row[j], *( unsigned char* )( dataR + step*j ) );
}
} int Transpose( cv::Mat &inMat, cv::Mat &outMat )
{
outMat = inMat.clone();
size_t step = inMat.step;
int col = inMat.cols;
cvWish::transpose( outMat.data,step, col ); return 1;
}
测试结果2:
很遗憾,图像336*400,速度依然是为使用OpenCV库的1/6, 0.947s。怎么改进?
OpenCV:OpenCV图像旋转的代码的更多相关文章
- 吐嘈OpenCV的图像旋转功能 >_<7
實在出乎我的意料!OpenCV竟然連這么簡單的功能都沒有封裝!還要讓本大爺自己動手寫!強烈要求OpenCV下一個版本添加本功能! 函數功能和這個網頁一樣,只不過這個作者寫的太糟了,我把它變得簡潔了一點 ...
- OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...
- opencv 图像旋转
理论 http://www.cnblogs.com/wangguchangqing/p/4045150.html 翻开任意一本图像处理的书,都会讲到图像的几何变换,这里面包括:仿射变换(affine ...
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...
- OpenCL + OpenCV 图像旋转
▶ 使用 OpenCV 从文件读取彩色的 png 图像,旋转一定角度以后写回文件 ● 代码,核函数 // rotate.cl //__constant sampler_t sampler = CLK_ ...
- 基于c++和opencv底层的图像旋转
图像旋转:本质上是对旋转后的图片中的每个像素计算在原图的位置. 在opencv包里有自带的旋转函数,当你知道倾斜角度theta时: 用getRotationMatrix2D可得2X3的旋转变换矩阵 M ...
- OpenCV图像旋转
图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸.图像旋转后图像的水平对称轴.垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换. 如下图: 假 ...
- OpenCV文本图像的旋转矫正
用户在使用Android手机拍摄过程中难免会出现文本图像存在旋转角度.这里采用霍夫变换.边缘检测等数字图像处理算法检测图像的旋转角度,并根据计算结果对输入图像进行旋转矫正. 首先定义一个结构元素,再通 ...
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
话说,平凡之处显真格,这一点也没错! 比如,对旋转图像进行双线性插值,很简单吧? 可,对我,折腾了大半天,也没有达到预期效果! 尤其是三个误区让我抓瞎好久: 1,坐标旋转公式. 这东西,要用 ...
随机推荐
- hdu 5182 PM2.5
问题描述 目前,我们用PM2.5的含量来描述空气质量的好坏.一个城市的PM2.5含量越低,它的空气质量就越好.所以我们经常按照PM2.5的含量从小到大对城市排序.一些时候某个城市的排名可能上升,但是他 ...
- 请问spfa+stack 和spfa+queue 是什么原理
一个是bfs加迭代 一个是dfs加迭代 请问迭代是什么 就是不断地做,做到没有更优的解为止 或者是不断得做,做到逼近答案为止.. 栈比队列更快更节省空间
- hdu_1013_Digital Roots_201310121652
Digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 51nod——T1267 4个数和为0
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 题目描述 给出N个整数,你来判断一下是否能够选出4个数,他们的和 ...
- gap lock/next-key lock浅析Basic-Paxos协议日志同步应用
http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...
- 【Ubuntu QQ】记如何在Ubuntu上安装QQ(附下载)
什么困扰着一批批的ubuntu桌面用户?是麻花藤.哦不,是QQ,怎么在ubuntu上安装完美无瑕的QQ. 最佳解决方案在“三”部分,当然前两个也不失为解决方案 一.尝试的开始 配置: 双系统:Wind ...
- oc56--ARC多个对象的内存管理
// main.m // ARC中多个对象的内存管理:ARC的内存管理就是MRC的内存管理(一个对象释放的时候,必然会把它里面的对象释放),只不过一个是Xcode加的代码,一个是我们自己加的代码: / ...
- framebuffer的入门介绍-实现程序分析【转】
本文转载自:http://blog.csdn.net/liuzijiang1123/article/details/46972723 如想想对lcd屏进行操作(例如在lcd屏幕上画线,或者显示视频数据 ...
- 格伦布编码——rice编码无非是golomb编码M为2^x的特例
格伦布编码 格伦布编码是一种无失真资料压缩方法,由数学家所罗门·格伦布在1960年代提出. Rice编码 Robert F. Rice提出Rice 编码,是以哥伦布编码为基础做改良而更简易的前置码.R ...
- CodeForces - 789D Weird journey
D. Weird journey time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...