opencv中三种像素访问方式的运行速度比较

2023-05-16

本文目的:

在opencv中有三种方式可以读写图像的像素,分别为:指针读写、迭代器读写、动态地址计算读写。虽然三种方式都可以完成同样的目的,但是运行速度却有快有慢,尤其是在实现一些复杂算法的时候,效率非常关键,下面就来比较一下这三种方式的运行速度。

实现代码:

代码工程下载地址:http://download.csdn.net/detail/u013752202/9230389 

下面代码实现的功能:分别使用三种方法实现图像像素的读写,并改变图像的亮度和对比度,然后对三种方法的运行速度进行比较。

#include <QtCore/QCoreApplication>
#include <opencv2/opencv.hpp>

using namespace cv;
/***********************************
*通过.ptr指针访问像素
************************************/
void lightAdjustPTR(Mat &image,int contrast,int bright)
{
    for(int i=0;i<image.rows;i++){
        for(int j=0;j<image.cols;j++){
            for(int ch=0;ch<image.channels();ch++){
                uchar curVal=image.ptr<Vec3b>(i)[j][ch];
                image.ptr<Vec3b>(i)[j][ch]=saturate_cast<uchar>(0.01*contrast*curVal+bright);
            }
        }
    }
}
/***********************************
*通过.at动态地址访问像素
************************************/
void lightAdjustAT(Mat &image,int contrast,int bright)
{
    for(int i=0;i<image.rows;i++){
        for(int j=0;j<image.cols;j++){
            for(int ch=0;ch<image.channels();ch++){
                uchar curVal=image.at<Vec3b>(i,j)[ch];
                image.at<Vec3b>(i,j)[ch]=saturate_cast<uchar>(0.01*contrast*curVal+bright);
            }
        }
    }
}
/***********************************
*通过it迭代器访问像素
************************************/
void lightAdjustIT(Mat &image,int contrast,int bright)
{
    MatIterator_<Vec3b> it=image.begin<Vec3b>();
    MatIterator_<Vec3b> itend=image.end<Vec3b>();
    while(it!=itend){
        for(int ch=0;ch<image.channels();ch++){
            uchar curVal=(*it)[ch];
            (*it)[ch]=saturate_cast<uchar>(0.01*contrast*curVal+bright);
        }
        it++;
    }
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Mat srcPTR=imread("1.jpg");
    Mat srcAT=srcPTR.clone();
    Mat srcIT=srcPTR.clone();
    imshow("ShuiTan",srcPTR);

    //通过.ptr指针访问
    double timePTRS=static_cast<double>(getTickCount());//获取当前心跳数
    lightAdjustPTR(srcPTR,130,100);
    double timePTRT=((double)getTickCount()-timePTRS)/getTickFrequency();//求运行时间
    cout<<".ptr spent: "<<timePTRT<<"s"<<endl;//打印时间

    //通过.at动态地址访问
    double timeATS=static_cast<double>(getTickCount());//获取当前心跳数
    lightAdjustAT(srcAT,130,100);
    double timeATT=((double)getTickCount()-timeATS)/getTickFrequency();//求运行时间
    cout<<".at  spent: "<<timeATT<<"s"<<endl;//打印时间

    //通过it迭代器访问
    double timeITS=static_cast<double>(getTickCount());//获取当前心跳数
    lightAdjustIT(srcIT,130,100);
    double timeITT=((double)getTickCount()-timeITS)/getTickFrequency();//求运行时间
    cout<<"*it  spent: "<<timeITT<<"s"<<endl;//打印时间

    imshow("ShuiTanPTR",srcPTR);
    imshow("ShuiTanAT",srcAT);
    imshow("ShuiTanIT",srcIT);
    waitKey(0);

    return a.exec();
}
运行结果:

从下面的运行结果可以看出,三种方法的运行速度从快到慢依次是:指针读写 < 迭代器读写 < 动态地址计算,指针读写的方式是最快的,所以在算法中尽量使用指针读写的方式来访问图像像素或矩阵元素。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv中三种像素访问方式的运行速度比较 的相关文章

  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 查找具有不同强度/亮度的相似图像

    假设我有如下图像 我可以选择什么来比较两个图像之间的相似度 显然它们是相同的图像 只是亮度不同 我找不到任何可行的方法 目前我最好的选择是训练 cnn 或自动编码器并比较输出的特征向量 但这似乎有点矫枉过正 任何提示将不胜感激 相当强大的工
  • 如何使用 AdaBoost 进行特征选择?

    我想使用 AdaBoost 从大量 100k 中选择一组好的特征 AdaBoost 的工作原理是迭代功能集并根据功能的执行情况添加功能 它选择对现有特征集错误分类的样本表现良好的特征 我目前正在 Open CV 中使用CvBoost 我得到
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • 旋转矩阵openCV

    我想知道如何找到框架中一组特征的旋转矩阵 我会更具体 我有 2 个具有 20 个特征的帧 假设第 1 帧和第 2 帧 我可以估计两个帧中特征的位置 例如 假设位置 x y 处的某个第 1 帧特征 并且我确切地知道它在哪里 所以假设为 x y
  • 相机校准:如何正确进行

    我正在尝试使用棋盘格通过众所周知的张氏方法进行校准 然后进行捆绑调整 该方法在 Matlab 和 OpenCV 中都可用 有很多经验指南 但从我个人的经验来看 准确性是相当随机的 它有时可能非常好 但有时也可能非常糟糕 实际上 只需将棋盘放
  • C++ OpenCV 3.4 / FFMPEG 3.4.1 VideoWriter 和 MP4 输出文件格式

    我正在运行 Linux 内核 4 9 35 ti r44 的 ARM BeagleBone X 15 Debian 机器 在我的 C Qt 5 应用程序中 我想将 cv Mat 帧保存为 MP4 格式视频 我安装了 libx264 并从头开
  • 如何选择图像插值方法? (Emgu/OpenCV)

    Emgu OpenCV的 net包装器 提供的图像调整大小功能可以使用四种插值方法中的任意一种 http www emgu com wiki files 1 4 0 0 html 596dd03d 301e d3c6 4c53 c42855
  • Alpha 混合可消除图像中的接缝

    我缝合了两张图像 但在最终图像中存在可见的接缝 我正在尝试使用阿尔法混合去除那条接缝 我知道 Alpha 混合是使用cvAddweight 函数 但在此函数参数是两个图像 alpha beta gamma和目的地 我正在服用gamma 0
  • OpenCV Sobel 滤波器 - 为什么它看起来这么糟糕,尤其是与 Gimp 相比?

    我正在尝试使用 OpenCV 重建一些我之前在 Gimp 中完成的预处理 第一级是用于边缘检测的 Sobel 滤波器 它在 Gimp 中运行得很好 现在这是我对 OpenCV 的尝试 opencv imgproc Sobel src sca
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • C++ OpenCV imdecode 慢

    我将图像的字节数组从 C 发送到 C 库 我使用 OpenCV 版本 3 3 1 解码图像 BMP 图像解码速度很快 但 JPEG 图像解码速度很慢 如何加快 JPEG 图像的解码时间 多线程 GPU 解码性能 Resolution For
  • 从基本矩阵中查找单应矩阵

    我正在尝试计算单应性矩阵H给定一组对应关系和基本矩阵F 根据对极几何原理 我知道这可以通过对极线和对极线的叉积来完成F from 极点几何 http www cs unc edu marc tutorial node44 html e ij
  • 使用 Brew 安装 OpenCV 永远不会完成

    所以我尝试使用 Homebrew 安装 opencv 但它不起作用 我用了brew tap homebrew science进而brew install opencv发生的情况是 gt Installing opencv from home
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何计算 cv::Mat 的步幅

    我想知道如何计算步幅cv Mat 我已经更新了代码 我需要计算步幅 我不知道计算投影变换有什么问题 我得到一个cv Mat然后将其复制到unsigned int数组 然后对其进行转换 然后返回一个cv Mat待展示 cv Mat3b src

随机推荐

  • 关于笔记本linux亮度调节

    Laptop安装linux 系统后 xff0c 开机默认亮度是最大 xff0c 每次开机都很刺眼 xff0c 开机后调节好亮度后 xff0c 重启又恢复了 现在介绍可以永久设置屏幕亮度的方法 xff0c 这样就不用每次开机都设置亮度那么麻烦
  • LINUX下挂载exfat格式u盘或移动硬盘

    我的u盘本来是ntfs格式的 xff0c 本来在linux系统下可以读 xff0c 但由于我双系统 xff0c u盘经常在windows和linux中插来插去 xff0c 后来经常导致u盘在linux中无法挂载 xff0c 提示说未知文件系
  • C语言 消息队列

    消息队列 xff08 也叫做报文队列 xff09 能够克服早期unix通信机制的一些缺点 作为早期unix通信机制之一的信号能够传送的信息量有限 xff0c 后来虽然POSIX 1003 1b在信号的实时性方面作了拓广 xff0c 使得信号
  • Norder软件[FDS和fstorage]

    FDS和fstorage 本文摘录于 xff1a https www cnblogs com iini p 9338169 html只是做学习备份之用 xff0c 绝无抄袭之意 xff0c 有疑惑请联系本人 xff01 这里摘抄重点 根据有
  • C语言 select函数使用

    在编程的过程中 xff0c 经常会遇到许多阻塞的函数 xff0c 好像read和网络编程时使用的recv recvfrom函数都是阻塞的函数 xff0c 当函数不能成功执行的时候 xff0c 程序就会一直阻塞在这里 xff0c 无法执行下面
  • linux 开机grub rescue修复

    安装linux系统后 系统的引导就会变成grub引导 假如对硬盘进行分区管理或一些其它操作后 开机进不去grub引导 界面显示黑屏 然后显示grub rescue gt 的字样时 就需要自己手动修复grub了 1 使用ls命令 ls执行命令
  • Qt5编译时出现<QtGui/QApplication> ---> No such file or directory错误解决办法

    Qt5的更新把目录结构都改变了 然后一些类也去掉了功能 本来我在qt4上写的程序放到qt5编译 马上弹出 lt QtGui QApplication gt gt No such file or directory错误 解决办法 安装libq
  • Qt for iOS,Qt 与Objective C混合编程

    因为我写了一系列Qt的博文以及一本书 Qt on Android核心编程 xff0c 最近有好几个使用Qt的朋友问起 Qt for iOS 的事情 xff0c 因为我在这方面的经验特别少 xff0c 写不出系统的文章来 xff0c 非常抱歉
  • HTML5 section、article和div区别

    在HTML5中 xff0c 规定开发过程中更加注重语义化和代码的结构标准 当中section article和div是非常相似的东西 xff0c 许多人无法区分它们 当初我对于这三个标签也很迷茫 xff0c 觉得都没什么区别 xff0c 用
  • Django安装

    操作系统 xff1a deepin15 1 检查python是否已安装 xff0c 运行命令 python如出现以下信息则python可用 Python 2 7 11 default Dec 9 2015 00 29 25 GCC 5 3
  • libcurl实现http交互

    原因 xff1a 由于涉及到使用libcurl进行http交互 xff0c 故在此进行记录调用流程 概况 xff1a 利用curl模块实现http请求 http介绍 xff1a xff08 hyperText Transfer Protoc
  • linux内核分析-简单的操作系统内核源码解读

    Linux内核分析 MOOC课程http mooc study 163 com course USTC 1000029000 学习笔记 源码组成 xff1a mypcb h mymain c myinterrupt c mypcb h sp
  • GCC 编译过程/编译命令详解/静态库与动态链接库/ error:undefined reference to

    GCC编译 xff1a 预处理 gt 编译 gt 连接 gt 加载 预处理 xff1a 处理程序中 开头的内容编译 xff1a 程序构建过程 xff0c 生成 o文件 xff0c gcc 依赖顺序问题 xff08 从后向前 xff09 xf
  • makefile 语法 /usr/bin/ld: cannot find -lxxxx

    GCC编译错误 1 usr bin ld tmp ccd UkmoA o undefined reference to symbol ERR free strings 64 OPENSSL 1 0 0 lib i386 linux gnu
  • AD10 PCB文件统一设置字体大小(默认字体大小)

    这个网上给我的提示 xff08 http zhidao baidu com link url 61 UNxy0GoaU7jj0QRgCikKIdHIrE7C FOiojG 5nE6a QBqXVuYdublOROizQyNRtfNudH53
  • Cocos2d-x初入学堂(13)-->Tiled Map Editor地图编辑器

    欢迎转载 xff01 转载时请注明出处 xff1a http blog csdn net aa4790139 article details 8135831 我开发的游戏只有第一款游戏 xff0c 没有用到地图编辑器 xff0c 那是我刚进
  • Linux 常用命令脚本源码查看方法总结

    Linux 常用命令脚本源码查看方法总结 下载相关软件包 以32位Ubuntu14 04下 xff0c 获取ls命令的源码为例 xff0c 能够使用例如以下的方法下载源码 xff1a 1 xff09 使用which命令查看ls命令的位置 x
  • 进程和线程的区别与联系

    1 共同点 功能上都是用于实现多任务并发程序设计的技术手段 xff0c 线程的状态包括就绪 执行与阻塞 xff0c 与进程类似 从系统实现的角度看 xff0c 进程实体和线程实体在Linux内核中都是有task struct实现的 xff0
  • AD9的pcb 里面怎样才能从TOP层视图换成从BOTTOM层网上面看,相当于把板子翻过来看

    AD9中更改PCB的视角 切换到3D xff08 view gt switch To 3D xff09 视图 xff0c 然后点击 view gt Orthogonal Rotation 然后在切换到2D视图 xff08 view gt s
  • opencv中三种像素访问方式的运行速度比较

    本文目的 xff1a 在opencv中有三种方式可以读写图像的像素 xff0c 分别为 xff1a 指针读写 迭代器读写 动态地址计算读写 虽然三种方式都可以完成同样的目的 xff0c 但是运行速度却有快有慢 xff0c 尤其是在实现一些复