opencv 四种图像遍历的时间度量

本文查看.at、pointers、reshape及iterators四种遍历图像方式所消耗时间。

    示例代码:

  1 //Test running time,edited by yunfung
  2 #include <opencv2/core/core.hpp>
  3 #include <opencv2/highgui/highgui.hpp>
  4 #include <opencv2/imgproc/imgproc.hpp>
  5 #include <iostream>
  6 using namespace cv;
  7 using namespace std;
  8
  9 void colorReduce1(Mat& image, int div = 64)
 10 {
 11     for (int i = 0; i < image.rows; i++)
 12     {
 13          for (int j = 0; j < image.cols; j++)
 14         {
 15             image.at<Vec3b>(i, j)[0] = image.at<Vec3b>(i, j)[0] / div*div + div / 2;
 16             image.at<Vec3b>(i, j)[1] = image.at<Vec3b>(i, j)[1] / div*div + div / 2;
 17             image.at<Vec3b>(i, j)[2] = image.at<Vec3b>(i, j)[2] / div*div + div / 2;
 18         }
 19     }
 20 }
 21
 22 void colorReduce2(cv::Mat image, int div = 64) {
 23     int nl = image.rows;
 24     int nc = image.cols * image.channels();
 25     for (int j = 0; j < nl; j++) {
 26         uchar* data = image.ptr<uchar>(j);
 27         for (int i = 0; i < nc; i++) {
 28             data[i] = data[i] / div*div + div / 2;
 29
 30         }
 31     }
 32 }
 33
 34 void colorReduce3(cv::Mat &image, int div = 64) {
 35     if (image.isContinuous()){
 36         image.reshape(1, 1);
 37     }
 38     int nl = image.rows;
 39     int nc = image.cols * image.channels();
 40     for (int j = 0; j < nl; j++) {
 41         uchar* data = image.ptr<uchar>(j);
 42         for (int i = 0; i < nc; i++) {
 43             data[i] = data[i] / div*div + div / 2;
 44         }
 45     }
 46 }
 47
 48 void colorReduce4(cv::Mat &image, int div = 64) {
 49     cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
 50     cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();
 51     for (; it != itend; ++it) {
 52         (*it)[0] = (*it)[0] / div * div + div / 2;
 53         (*it)[1] = (*it)[1] / div * div + div / 2;
 54         (*it)[2] = (*it)[2] / div * div + div / 2;
 55     }
 56 }
 57
 58 void calrunTime(int v, Mat&image)
 59 {
 60     double duration;
 61     duration = static_cast<double>(getTickCount());
 62     for (int i = 0; i < 10; i++)
 63     {
 64         switch (v)
 65         {
 66         case 1:
 67             colorReduce1(image);   //at                   35.16mS
 68             break;
 69         case 2:
 70             colorReduce2(image);   //pointers             1.59mS
 71             break;
 72         case 3:
 73             colorReduce3(image);   //reshape(continuous)  1.47mS
 74             break;
 75         case 4:
 76             colorReduce4(image);   //iterators            15.71mS
 77             break;
 78         default:
 79             break;
 80         }
 81     }
 82     duration = static_cast<double>(getTickCount()) - duration;
 83     duration /= getTickFrequency();
 84     duration *= (1000/10); //average
 85     cout << "duration" << v << " : " << duration << "mS"<< endl;
 86 }
 87
 88 int main()
 89 {
 90     Mat image = imread("test.jpg");
 91     Mat imageClone = image.clone();
 92     calrunTime(1, image);
 93
 94     image = imread("test.jpg");
 95     imageClone = image.clone();
 96     calrunTime(2, image);
 97     image = imread("test.jpg");
 98     imageClone = image.clone();
 99     calrunTime(3, image);
100     image = imread("test.jpg");
101     imageClone = image.clone();
102     calrunTime(4, image);
103
104     namedWindow("Image Result");
105     imshow("Image Result", imageClone);
106     waitKey();
107     return 0;
108 }

测试图片:

    

    运行结果(at效率最低,指针效率最高):

    

    

时间: 2024-08-29 03:29:12

opencv 四种图像遍历的时间度量的相关文章

js创建对象的四种方式以及消耗时间比较

// Property-less object console.time('zoop1'); var zoop = (function (numObjects) { var pooz = Object.create(null); for(var i = 0; i< numObjects; i++) { pooz[i] = Object.create(null); } return pooz; })(1000000); console.timeEnd('zoop1'); // Using Obje

(转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date类型的时间转成mysql数据库识别的java.sql.Date类型时间 注:java.util.Date是java.sql.Date的父类 Date time= new java.sql.Date(newjava.util.Date().getTime()); 第二种: java用PreparedS

java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date类型的时间转成mysql数据库识别的java.sql.Date类型时间 注:java.util.Date是java.sql.Date的父类 Date time= new java.sql.Date(newjava.util.Date().getTime()); 第二种: java用PreparedS

Map集合的四种常用遍历方式整理

1.Map集合简介:map集合是一个key-value型的数据结构,存储的数据具有查询速度快速的特点,但由于是无序的,所以没有顺序可言.在遍历时没有办法像简单的list或数组一样. 2.代码: 1 package com.cn.testmap; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import java.util.Map; 6 import java.util.Map.Entry; 7 8 /** 9 * ma

四种排序算法的时间比较

#include<iostream> #include<time.h> using namespace std; template<class T> inline void Swap(T& a, T& b); template<class T> void BubbleSort(T a[], int n); template<class T> void InsertionSort(T a[], int n); template<

Map集合遍历的四种方式理解和简单使用-----不能for循环遍历

~Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1:无非就是通过map.keySet()获取到值,然后根据键获取到值 for(String s:map.keySet()){            System.out.println("key : "+s+" value : "+map.get(s));     } 2:通过Map.Entry(String,String) 获取,然后使用entry.getKey(

OpenCV优化:图像的遍历4种方式

OpenCV优化:图像的遍历4种方式 分类: 算法学习2014-04-13 23:43 1312人阅读 评论(0) 收藏 举报 opencv 目录(?)[+] OpenCV优化:图像的遍历4种方式 我们在实际应用中对图像进行的操作,往往并不是将图像作为一个整体进行操作,而是对图像中的所有点或特殊点进行运算,所以遍历图像就显得很重要,如何高效的遍历图像是一个很值得探讨的问题. 一.遍历图像的4种方式:at<typename>(i,j) Mat类提供了一个at的方法用于取得图像上的点,它是一个模板

OpenCV2.4+遍历读写像素方法总结及时间度量

以下文本及代码基本基于<OpenCV 2.4.13.0 documentation>的How to scan images, lookup tables and time measurement with OpenCV一节,英文好的同学可以直接看原文. 1. 颜色压缩 颜色压缩(Color Reduction)最简单的理解就是减少表示图像的颜色数目,我们都知道,8位位深的3通道RGB真彩图像包括了1600多万(16777216)的颜色数目,其实在某些应用中用不到这么多数量(例如图像传输(tra

opencv图像遍历方法速度对比

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