一般来说,如果是遍历数据的话用指针ptr比用at要快。特别是在debug版本下。因为debug中,OpenCV会对at中的坐标检查是否有溢出,这是非常耗时的。

代码如下

  1. #include <opencv2\core\core.hpp>
  2. #include <opencv2\highgui\highgui.hpp>
  3. #include <iostream>
  4.  
  5. int main()
  6. {
  7. char *srcName="e://vedio//001.jpg";
  8. char *dstName="e://vedio//001dst.jpg";
  9.  
  10. cv::Mat src=cv::imread(srcName,cv::IMREAD_COLOR);
  11. cv::Mat dst=src.clone();
  12.  
  13. int nChannels=src.channels();
  14. int nTimes=;
  15.  
  16. double t=cv::getTickCount();
  17. for(int i=;i<nTimes;i++)
  18. {
  19. for(int r=;r<src.rows;r++)
  20. {
  21. for(int c=;c<src.cols;c++)
  22. {
  23. dst.at<cv::Vec3b>(r,c)=cv::Vec3b(src.at<cv::Vec3b>(r,c)[]/,src.at<cv::Vec3b>(r,c)[]/,src.at<cv::Vec3b>(r,c)[]/);;
  24. }
  25. }
  26. }
  27. t=(cv::getTickCount()-t)/cv::getTickFrequency();
  28. std::cout<<"第1种方法消耗的时间为"<<t<<"秒"<<std::endl;
  29.  
  30. uchar *input,*output;
  31. t=cv::getTickCount();
  32. for(int i=;i<nTimes;i++)
  33. {
  34. for(int r=;r<src.rows;r++)
  35. {
  36. input=src.ptr<uchar>(r);
  37. output=src.ptr<uchar>(r);
  38. for(int c=;c<src.cols*nChannels;c++)
  39. {
  40. output[c]=input[c]/;
  41. }
  42. }
  43. }
  44. t=(cv::getTickCount()-t)/cv::getTickFrequency();
  45. std::cout<<"第2种方法消耗的时间为"<<t<<"秒"<<std::endl;
  46.  
  47. t=cv::getTickCount();
  48. for(int i=;i<nTimes;i++)
  49. {
  50. for(int r=;r<src.rows;r++)
  51. {
  52. input=src.ptr<uchar>(r);
  53. output=src.ptr<uchar>(r);
  54. for(int c=;c<src.cols*nChannels;c++)
  55. {
  56. *output++=*input++/;
  57. }
  58. }
  59. }
  60. t=(cv::getTickCount()-t)/cv::getTickFrequency();
  61. std::cout<<"第3种方法消耗的时间为"<<t<<"秒"<<std::endl;
  62.  
  63. int nRows=src.rows;
  64. int nCols=src.cols;
  65. if(src.isContinuous())
  66. {
  67. nCols*=nRows;
  68. nRows=;
  69. }
  70. t=cv::getTickCount();
  71. for(int i=;i<nTimes;i++)
  72. {
  73. for(int r=;r<nRows;r++)
  74. {
  75. input=src.ptr<uchar>(r);
  76. output=src.ptr<uchar>(r);
  77. for(int c=;c<nCols*nChannels;c++)
  78. {
  79. *output++=*input++/;
  80. }
  81. }
  82. }
  83. t=(cv::getTickCount()-t)/cv::getTickFrequency();
  84. std::cout<<"第4种方法消耗的时间为"<<t<<"秒"<<std::endl;
  85.  
  86. return ;
  87.  
  88. }

OpenCV几种访问cv::Mat数据的方法的更多相关文章

  1. WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )

    WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...

  2. 访问cv::Mat中的数据时遇到的指针类型问题

    在用Opencv的时候由于下图原本的图像尺寸是1111*1111,要进行resize,代码如下: cv::Mat img = cv::imread("//Users//apple//td3/ ...

  3. 除了GPS外的4种获得用户地理位置数据的方法

    纯粹的GPS解决方案以及它所生成的经纬度标签是地理位置数据的公认标准.但是至少还有4种方法可以获得地理位置数据: 1.手机信号塔数据:当移动设备的GPS芯片不能接收到GPS信号时,移动设备就需要与它所 ...

  4. Django—Form两种保留用户提交数据的方法

    用户在网页上进行表单填写时,有可能出现某项填写错误.一般情况下,用户在未发觉错误的情况下点击提交,则此表单的内容会清空,用户不得不再重新填写,这样的用户体验是及其糟糕的. 在此,我们有2种方法将用户的 ...

  5. 一种动态写入apk数据的方法(用于用户关系绑定、添加渠道号等)

    背景: 正在开发的APP需要记录业务员与客户的绑定关系.具体应用场景如下: 由流程图可知,并没有用户填写业务人员信息这一步,因此在用户下载的APP中就已经携带了业务人员的信息. 由于业务人员众多,不可 ...

  6. cv.Mat 与 .txt 文件数据的读写操作

    1.按OpenCV格式实现的 .txt 文件读写 可以用 cvSave 和 cvLoad 实现,格式和 .xml/.yml 的差不多,不过如果专用与 OpenCV 的数据读写,还是用  .xml/.y ...

  7. 【记录一个问题】android下的ucontext协程,因为使用栈上的对象,导致cv::Mat被莫名析构

    工作的流程是这样:某个协程在栈上创建task对象,在task对象内有需要返回的cv::Mat. 然后把task放到另一个线程上去执行,然后切换到别的协程,等到工作线程执行完task后,再唤醒协程. 这 ...

  8. 两分钟解决Python读取matlab的.mat数据

    Matlab是学术界非常受欢迎的科学计算平台,matlab提供强大的数据计算以及仿真功能.在Matlab中数据集通常保存为.mat格式.那么如果我们想要在Python中加载.mat数据应该怎么办呢?所 ...

  9. C#中在WebClient中使用post发送数据实现方法

    很多时候,我们需要使用C#中的WebClient 来收发数据,WebClient 类提供向 URI 标识的任何本地.Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法 ...

随机推荐

  1. LeetCode子集问题

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(子集当中不包括重复的元素) 代码如下: def subsets(nums): target=[[]] for num in nums ...

  2. VOOKI:一款免费的Web应用漏洞扫描工具

    Vooki是一款免费且用户界面友好的Web应用漏扫工具,它可以轻松地为你扫描任何Web应用并查找漏洞.Vooki主要包括三个部分,Web应用扫描器,Rest API扫描器以及报告.Web应用扫描器​V ...

  3. php ,session 详解.

    session是根据php.ini中的配置, 存储在 服务器端 ; 生成的sessionId ,也是根据 php.ini 的配置 存储在 客户端cookie中. session的设置: 存储方式:se ...

  4. ES6 class的继承-学习笔记

    1.简介 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多. 子类必须在constructor方法中调用super方法,否则新建实例时会报错. ...

  5. NEO VM原理及其实现(转载)

    NEO Vm原理及其实现 简介及与evm主要区别 neo vm和evm类似.底层都实现了一套opcode以及对应的执行器,opcode设计差距蛮大的,总体上来说evm的更加简洁,neo vm的功能更加 ...

  6. 2.24 js处理内嵌div滚动条

    2.24 js处理内嵌div滚动条 前言    前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦.一.内嵌滚动条    1.下面这张图 ...

  7. ubuntu sublime text key

    使用方法 打开 Sublime Text 3 的 “Help”–“Enter Licence”,然后根据版本选择输入下面的注册码. 注册码 所有这些注册码都经过测试(2016-05-12),适用于所有 ...

  8. linux下数学函数

    linux 下如果用数学函数比如sin,需要加上“-lm”参数编译,如:gcc test.c -lglut -lGLU -lGL -lm && ./a.out

  9. memoization

    memoization 是指通过缓存函数返回结果来加速函数调用的一种技术.仅当函数是纯函数 时结果才可以被缓存,也就是说,函数不能有任何副作用或输出,也不能依赖任何全局状态 import math _ ...

  10. django BBS project login登录功能实现

    1.models from django.db import models # Create your models here. from django.contrib.auth.models imp ...