opencv图像遍历方法速度对比

<pre name="code" class="cpp"><span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;font-size:18px;">     在图像处理领域,我们经常需要遍历一幅图像,opencv提供多种方法完成对图像的遍历,但是他们的效率是不同的。程序中我们常使用指针或者迭代器的方法遍历图像,下面的程序将对两种方法的效率做对比。</span>

条件:单线程,主频3.4GHz计算机运行,图像image.jpg尺寸为768×576。


// readImage.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat image = imread("image.jpg",0);
	Mat gray1 = Mat::zeros(image.rows,image.cols,image.type());
	Mat gray2 = Mat::zeros(image.rows,image.cols,image.type());
	long int count = 0;
	uchar num = 0;

	double t = (double)getTickCount();

	for (int i = 0; i < image.rows; i++)
	{
		uchar* ptr = image.ptr<uchar>(i);
		uchar* g_ptr = gray1.ptr<uchar>(i);
		for (int j = 0; j < image.cols; j++)
		{
			g_ptr[j] = ptr[j];
		}
	}

	t = ((double)getTickCount() - t)/getTickFrequency();

	double t1 = (double)getTickCount();

	for (int i=0;i<image.rows;i++)
	{
		for (int j=0;j<image.cols;j++)
		{
			gray1.at<uchar>(i,j) = image.at<uchar>(i,j);
		}
	}

	t1 = ((double)getTickCount() - t1)/getTickFrequency();

	double t2 = (double)getTickCount();

	for (int i = 0; i < image.rows; i++)
	{
		uchar* ptr = image.ptr<uchar>(i);
		for (int j = 0; j < image.cols; j++)
		{
			num = ptr[j];
		}
	}

	t2 = ((double)getTickCount() - t2)/getTickFrequency();

	double t3 = (double)getTickCount();

	for (int i=0;i<image.rows;i++)
	{
		for (int j=0;j<image.cols;j++)
		{
			num = image.at<uchar>(i,j);
		}
	}

	t3 = ((double)getTickCount() - t3)/getTickFrequency();

	cout << t <<endl;
	cout << t1 << endl;
	cout << t2 << endl;
	cout << t3 << endl;
	getchar();

	return 0;
}

从图中的时间可以看出,对于这个尺寸的图像遍历,使用指针的方法要比使用迭代器的方法快了30倍,使用迭代器只需要1毫秒,而是用迭代器则需要30ms左右。

时间: 2024-08-18 18:30:06

opencv图像遍历方法速度对比的相关文章

OpenCV快速遍历矩阵元素方法

OpenCV中Mat矩阵data数据的存储方式和二维数组不一致,二维数组按照行优先的顺序依次存储,而Mat中还有一个标示行步进的变量Step.使用Mat.ptr<DataTyte>(row) 行指针的方式定位到每一行,可快速遍历矩阵.例程如下: 1 std::cout << "The inverse matrix of K is:" << std::endl; 2 for(int i=0;i<3;i++) 3 { 4 float* data =

opencv学习 2.Mat类图像遍历

图像的遍历 原图 1.简单存取像素值 代码如下: // Mat类图像遍历.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "cv.h" #include "cxcore.h" #include "highgui.h" using namespace std; using namespace cv; int _tmain(int argc, _TCHAR* argv[])

opencv图像原地(不开辟新空间)顺时旋转90度

前一阵朋友碰到这么一道题:将图像原地顺时针旋转90度,不开辟新空间.此题看似平易(题目简短),仔细研究发现着实不容易.经过一番探索后,终于找到了正确的算法,但是当使用opencv实现时,有碰到了困难而且费了一番周折才找到问题所在. 首先,解决这个问题,先简化成原地90度旋转一M×N的矩阵A(注意不是N×N方阵).对于2×3的矩阵A = {1,2,3;4,5,6},其目标为矩阵B = {4,1;5,2;6,3}.因为是原地旋转,这里A和B应指向同一大小为6的内存空间. 这里有这样一个重要的导出公式

OpenCV &mdash;&mdash; 图像局部与部分分割(一)

背景减除 一旦背景模型建立,将背景模型和当前的图像进行比较,然后减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标了 缺点 -- 该方法基于一个不长成立的假设:所有像素点是独立的 场景建模 新的前景(物体移动的新位置) -- 旧的前景 (物体离开后留下的"空洞")-- 背景 cvInitLineIterator()  和  CV_NEXT_LINE_POINT() 对任意直线上的像素进行采样 // 从视频的一行中读出所有像素的RGB值,收集这些数值并将其分成三个文件 #inc

[转]OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

[OpenCV入门教程之十三]OpenCV图像金字塔:高斯金字塔.拉普拉斯金字塔与图片尺寸缩放 2014-05-18 18:58 36007人阅读 评论(54) 收藏 举报 本文章已收录于:  OpenCV知识库 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http

【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 这篇文章里,我们将一起探讨图像金字塔的一

Opencv 图像读取与保存问题

本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49737357 本文仅对 Opencv图像读取与保存进行阐述,重在探讨图像读取与保存过程中应注意的细节问题. 1 图像读取 首先看一下,imread函数的声明: // C++: Mat based Mat imread(const string& filename, int flags=1 ); // C: IplImage based

c++ opencv 图像模糊度检测

参考博客: 1.基于OpenCV的图像模糊与否检测 2.无参考图像的清晰度评价方法 3.无参考图像的清晰度评价方法及c++实现 4.OpenCV 图像清晰度评价(相机自动对焦) 5.图像清晰度评价 原文地址:https://www.cnblogs.com/exciting/p/11423181.html

谈谈vector容器的三种遍历方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector容器是最简单的顺序容器,其使用方法类似于数组,实际上vector的底层实现就是采用动态数组.在编写程序的过程中,常常会变量容器中的元素,那么如何遍历这些元素呢?本文给出三种遍历方法. 方法一:采用下标遍历 由于vector容器就是对一个动态数组的包装,所以在vector容器的内部,重载了[]运算符,函数原型为:reference operator [] (size_type n);所以我们可以采用类似于数组的方式来访问vector容