【学习OpenCV】高效遍历Mat_opencv 高效遍历mat-程序员宅基地

技术标签: opencv  

用指针来遍历图像

方法:取出图像中第i行数据的指针:image.ptr<uchar>(i),再访问各列元素。

unsigned char * pData = BmpStream+1078;
int nr=img1.rows;
int nc=img1.cols;

for(int i=nr-1;i>=0;i--)	//遍历mat
{
	const uchar* inData=img1.ptr<uchar>(i);
	for(int j=0;j<nc;j++)
	{
		*pData++= inData[j];			
	}
}

一般来说图像行与行之间往往存储是不连续的,但是有些图像可以是连续的,Mat提供了一个检测图像是否连续的函数isContinuous()。当图像连通时,我们就可以把图像完全展开,看成是一行。

unsigned char * pData = BmpStream+1078;
int nr=img1.rows;
int nc=img1.cols;
if(img1.isContinuous())
{
	nr=1;
        nc=nc*img1.rows*img1.channels();
}
for(int i=0;i<nr;i++)	//遍历mat
{
	const uchar* inData=img1.ptr<uchar>(i);
	for(int j=0;j<nc;j++)
	{
		*pData++= * inData ++;			
	}
}

注:若算法对行列敏感,不能采用第2种方法,因为已经转换为1维!


用指针除了用上面的方法外,还可以用指针来索引固定位置的像素:


image.step返回图像一行像素元素的个数(包括空白元素),image.elemSize()返回一个图像像素的大小。


&image.at<uchar>(i,j)=image.data+i*image.step+j*image.elemSize();


实验证明

虽然把遍历方式改为指针,但发现release下的速度与at方法差不多(快一点点);而debug下的确是快很多;这说明,在编译的时候,release会对at方法进行优化的!所以,在满足算法的实时性要求的条件下,为了代码的可读性,还是直接用at方法吧,而且用着还方便。


另一个比较at方法与指针方法的例子:

1000*1000矩阵的16位整型转换32位浮点,输入Mat src为1000*1000的CV_16U类型,输出Mat dst

	//方式一 : at方法
	for(int i=0;i<h;i++)	//遍历行
	{		
		for(int j=0;j<w;j++)	//遍历列
		{
			dst.at<float>(i,j) = (float)src.at<unsigned short>(i,j);
		}
	}
速度最慢

	//方式二 : converTo方法
	src.convertTo(dst,CV_32F);
比at方法快

	//方式三 : 指针
	unsigned short* psrc = (unsigned short*)src.data;
	//float *pdst = new float [src.total()];
	float *pdst = (float*)dst.data;
	for(int i=0;i<h;i++)	//遍历行
	{		
		const unsigned short* p0 = psrc + i*w;
		float* p1 = pdst + i*w;
		for(int j=0;j<w;j++)	//遍历列
		{	
				*p1++= (float)p0[j];		
		}
	}
速度与convertTo差不多


-------------------------END---------------------------------


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Kelvin_Yan/article/details/41595373

智能推荐

2004年10月9日-程序员宅基地

文章浏览阅读529次。开发心得: 工欲善其事,必先利其器,开发工具的熟练掌握非常重要,正如《程序员修炼之道里面》提到的一样。

疫情下智慧社区管理系统开发与实现_疫情下智慧社区系统-程序员宅基地

文章浏览阅读7.8k次,点赞3次,收藏2次。本课题是疫情下智慧社区管理系统,经过查阅大量的参考文献,参考同类的社区管理系统和疫情管理系统等,同时走访社区的基层组织和居民,进行了系统的功能性需求分析。经过分析确定疫情下智慧社区管理系统的用户主要分为住户和社区管理用户两类,社区住户的主要功能包含有:在线社区购物、社区公告通知、新闻资讯、在线交流、购物车、订单信息、在线报修、个人中心等功能。_疫情下智慧社区系统

程序包管理器控制台在哪_rider的程序包管理控制器在哪-程序员宅基地

文章浏览阅读6.9k次,点赞5次,收藏5次。在安装有NuGet插件的VS上打开NuGet命令窗口的过程如下:依次选择菜单Tools(工具)-&gt;Library Package Manager(库程序包管理器)-&gt;Pakcage Manager Console(程序包管理器控制台)..._rider的程序包管理控制器在哪

汇编语言 实验五 条件转移指令_用a命令在100h处键入程序怎么操作-程序员宅基地

文章浏览阅读4.1k次,点赞8次,收藏29次。汇编语言 实验五 条件转移指令一、实验目的:1.8088指令:JZ,JNZ,JC,JNC,CMP,SHR。2.程序:用字符搜索法确定字符串长度。3.程序:16进制数化为ASCII码的一般方法。二、实验准备1.(1) 编写实验任务要求的两个程序。(2) 写出调试以上程序,即修改程序参数,检查结果的操作方法。(3) 熟悉源程序汇编、连接命令的使用方法即要..._用a命令在100h处键入程序怎么操作

图像特征的描述方法_图像特征描述方式-程序员宅基地

文章浏览阅读4.4k次。学习CV已经快一年了,自己是属于那种能把要做的事发展成兴趣的那种人,其实也是找不到兴趣就做好手头事的。看了别人很多的博文,大部分都很好,于是有了学习他们,总结自己所学的冲动。希望能坚持,并且循序渐进。最快最有效率的做事方法就是不着急,慢慢做,一点点进步。 第一部分就从入门级开始,希望自己也能附上相关的经典论文,慢慢来,如果一次弄不全,就慢慢修改。 这篇文章是在http:/_图像特征描述方式

laravel php扩展,Laravel深入学习7 - 框架的扩展-程序员宅基地

文章浏览阅读230次。声明:本文并非博主原创,而是来自对《Laravel 4 From Apprentice to Artisan》阅读的翻译和理解,当然也不是原汁原味的翻译,能保证90%的原汁性,另外因为是理解翻译,肯定会有错误的地方,欢迎指正。欢迎转载,转载请注明出处,谢谢!框架的扩展介绍Laravel为我们提供了很多自定义系统组件的扩展点,你甚至可以完全的替换掉他们。比如,哈希结构是由HasherInterfac..._laravel读取php扩展类类

随便推点

origin中文版散点图拟合曲线_Origin使用自定义函数拟合曲线函数-程序员宅基地

文章浏览阅读5.5k次。(2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2016年10月28日)最近应该是六叔的物化理论作业要交了吧,很多人问我六叔的作业里面有两道题要怎么进行图像函数的拟合。综合起来的问题主要有两个:1. 知道图像的准确拟合方程,但是不知道怎么拟合。(这个是本文的重点)2. 不知道图像的准确拟合方程,也不知道怎么拟合,这个我可以稍微提供一个拟合的方向。先从不知道图像的准确拟合..._origin8.5如何通过散点拟合正弦函数

python关系运算符连续使用_python中比较运算逻辑训练,条件判断的进阶版本-程序员宅基地

文章浏览阅读168次。知识回顾1、if语句模块还是else语句模块2、elif语句模块,连用If语句3、elif与if语句的区别本节知识视频教程一 、补充 ascii码大写字母 A 对应ascii码是65大写字母 B 对应ascii码是66小写字母 a 对应ascii码是97小写字母 b 对应ascii码是98回车键 对应 13数字0 对应的是48二、比较运算符>大于 >=大于等于 > "laoliu"..._python能否用连续逻辑运算符

java8 lambda_-djdk.internal.lambda.dumpproxyclasses-程序员宅基地

文章浏览阅读429次。作者:RednaxelaFX链接:https://zhuanlan.zhihu.com/p/27159693来源:知乎首先我知道Oracle JDK 8 / OpenJDK 8对lambda表达式在运行时的实现方式是动态生成跟匿名内部类相似形式的类,而负责生成代码的类位于java.lang.invoke.InnerClassLambdaMetafactory。可以看到,这个类里有一个调试用..._-djdk.internal.lambda.dumpproxyclasses

【体育硕士论文】信阳地区少儿体育舞蹈培训探究_少儿体育舞蹈培训作用-程序员宅基地

文章浏览阅读809次。中文摘要体育舞蹈作为新兴文化于 80 年代传入中国,经过 30 多年的发展其规模不断壮大,据不完全统计习练人数达 3000 万,主要以少儿为主。体育舞蹈具有很好的健身效果,特别对少儿身体发育和心理健康有很好的促进作用,体育舞蹈不仅作为文化载体增加东西方文化的交流,还是体育与艺术的结合体,可以很好地响应国家《全民健身》的号召,促进少儿锻炼身体。信阳市少儿体育舞蹈起步较晚,发展较快,体育舞蹈技术水平..._少儿体育舞蹈培训作用

《Cocos Creator游戏实战》摘星星进阶版_cocos摘星星游戏改进跳转代码-程序员宅基地

文章浏览阅读5.8k次,点赞11次,收藏59次。摘星星进阶版添加开始按钮实现按钮功能显示"Game Over"限制主角移动范围让跳跃动作更加细腻加入星星收集动画编写动画脚本加入触屏控制添加游戏提示Cocos Creator官方所发布的新手教程——快速上手:制作第一个游戏写得详细且通俗易懂,笔者出于学习的目的编写了关于摘星星进阶版的教程,希望对大家有所帮助。自知不能达到官方那样的水平,所以写得比较简单,还请..._cocos摘星星游戏改进跳转代码

window对象方法之setTimeout(),setInterval()-程序员宅基地

文章浏览阅读109次。window中的这两个方法是比较重要的,在许多的设计中会使用到这两个方法。比如使用在倒计时抢购中。首先来说说这两个方法的用法吧!一:window.setTimeout();setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。//延迟几秒以后执行代码,并且只执行 一次语法:setTimeout(code,millisec);..._使用windows对象的settimeo

推荐文章

热门文章

相关标签