OpenCV中高效的像素遍历方法,写出工程级像素遍历代码

【Opencv】 cv::Vec3d Opencv之<Vec3b>是什么东东 一、What is vector? vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: 首先在程序开头处加上#include<vector>以包含所需要的类文件vector,还有一定要加上using namespace std; 2.声明一个in... 阅读详情

转自:https://mp.weixin.qq.com/s/jfLdvLgAuCVclWkut9LH4g

初次接触OpenCV的开发者,必须过的第一道坎就是学会如何遍历访问Mat对象中每个像素,实现像素级别的图像操作,这个是最级别的编程技能,但是不同的像素遍历方法效率有云泥之别,相差特别大,甚至可能成为算法运行的瓶颈之一,因此找到一种速度快的遍历方法对大图像处理是很关键的。在开始寻找高效遍历方法之前,先来了解一下Mat对象的数据组织形式与像素块数据的存储方式,Mat对象由两个部分组成,元数据头部加像素数据块部分,图示如下:

 

在OpenCV C++中Mat对象的内存管理由OpenCV框架自动负责内存分配与回收,基于智能指针实现内存管理。

三种遍历方法

方法一

基于Mat对象的随机像素访问API实现,通过行列索引方式遍历每个像素值。代码实现如下

void method_1(Mat &image) {
    double t1 = getTickCount();
    int w = image.cols;
    int h = image.rows;
    for (int row = 0; row < h; row++) {
        for (int col = 0; col < w; col++) {
            Vec3b bgr = image.at<Vec3b>(row, col);
            bgr[0] = 255 - bgr[0];
            bgr[1] = 255 - bgr[1];
            bgr[2] = 255 - bgr[2];
            image.at<Vec3b>(row, col) = bgr;
        }
    }
    double t2 = getTickCount();
    double t = ((t2 - t1) / getTickFrequency()) * 1000;
    ostringstream ss;
    ss << "Execute time : " << std::fixed << std::setprecision(2) << t << " ms ";
    putText(image, ss.str(), Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2, 8);
    imshow("result", image);
}

 

方法二

基于Mat对象的行随机访问指针方式实现对每个像素的遍历,代码实现如下:

void method_2(Mat &image) {
    double t1 = getTickCount();
    int w = image.cols;
    int h = image.rows;
    for (int row = 0; row < h; row++) {
        Vec3b* curr = image.ptr<Vec3b>(row);
        for (int col = 0; col < w; col++) {
            Vec3b bgr = curr[col];
            bgr[0] = 255 - bgr[0];
            bgr[1] = 255 - bgr[1];
            bgr[2] = 255 - bgr[2];
        }
    }
    double t2 = getTickCount();
    double t = ((t2 - t1) / getTickFrequency()) * 1000;
    ostringstream ss;
    ss << "Execute time : " << std::fixed << std::setprecision(2) << t << " ms ";
    putText(image, ss.str(), Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2, 8);
    imshow("result", image);
}

 

除了上述的行指针遍历方式,常见的行指针还有如下:

CV_8UC1: 灰度图像
uchar* ptr = image.ptr<uchar>(row_index);

CV_8UC3: 彩色图像
Vec3b* ptr = image.ptr<cv::Vec3b>(row_index);

CV_32FC1: 单通道浮点数图像
float* ptr = image.ptr<float>(row_index);

CV_32FC3: 三通道浮点数图像
Vec3f* ptr = image.ptr<cv::Vec3f>(row_index);

 

 

 

 

方法三

直接获取Mat对象的像素块的数据指针,基于指针操作,实现快速像素方法,代码实现如下:

void method_3(Mat &image) {
    double t1 = getTickCount();
    int w = image.cols;
    int h = image.rows;
    for (int row = 0; row < h; row++) {
        uchar* uc_pixel = image.data + row*image.step;
        for (int col = 0; col < w; col++) {
            uc_pixel[0] = 255 - uc_pixel[0];
            uc_pixel[1] = 255 - uc_pixel[1];
            uc_pixel[2] = 255 - uc_pixel[2];
            uc_pixel += 3;
        }
    }
    double t2 = getTickCount();
    double t = ((t2 - t1) / getTickFrequency()) * 1000;
    ostringstream ss;
    ss << "Execute time : " << std::fixed << std::setprecision(2) << t << " ms ";
    putText(image, ss.str(), Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2, 8);
    imshow("result", image);
}

实验对比结果

系统信息与软件版本

输入图像大小为:1280x720, 彩色
操作系统:win10
OpenCV版本:OpenCV4.1
CPU:core i7 8th

 

 

opencv高效访问图像像素(遍历像素的方法总结) 一、Accessingpixel values访问像素值。(用类自带的方法:方便,但效率不高) 1.      cv::Mat has the a templatemethod at(int y, int x) 用法image.at(j,i)[channel]= value; 注意事项:the programmer needs to specify the return type 阅读详情

相关推荐

OpenCV学习C++接口 Mat像素遍历详解

IplImage 学习总结:

chen 1万+

opencv学习记录——(4)图像像素的读写操作

本节主要介绍了通过遍历的方式访问图像的像素值,并且改变图像的像素值 如何遍历和修改每个像素点的数值,分为单通道和多通道。访问模式模式也有两种。第一种是数组访问模式,用最常规的数组下标访问像素值。 void QuickDemo::pixel_visit_demo(Mat &image) { int dims = image.channels();//image的通道 int h = image.rows; //image的行 int w = image.cols; //image的列 f

qq_39648561的博客 2670

opencv2-遍历图像像素的14种方法

opencv2-遍历图像像素的14种方法

never give up的博客 3369

opencv遍历像素点最快的方法,14种选1

对于uint8类型3通道图像,不论是BGR还是HSV,这种图像在内存的排序方式就是(BGR为蓝绿红): BGRBGRBGR..... BGRBGRBGR..... BGRBGRBGR..... ............................... 对于uint8类型的单通道灰度图,排序方式就是最简单的二维数组(Y代表灰度值): YYYYYY............. YYYYYY............. YYYYYY............. ........................

野生猿-群号1025127672 4164

【OpenCV】OpenCV中遍历图像像素的几种方式对比

Mat 类是OpenCV中的一个基本数据类型,它是一个n维密集数组类Mat 类表示一个 n 维密集数值单通道或多通道数组。它可用于存储实数或复值向量和矩阵、灰度或彩色图像、体素体积、向量场、点云、张量、直方图。本文将总结几种遍历像素的不同方法,在需要处理大量图片的场景,不同的遍历方法,速度上会有显著差异。用指针法遍历图像是最高效的,用迭代器遍历图像则是比较安全的。

shanhedian2013的博客 1130

Opencv访问图像像素的三种方法

一、指针法 给图像的像素赋值,以此来访问图像的像素。 #include #include using namespace std; using namespace cv; int main() { Mat image = imread("D:\\vvoo\\lena.jpg"); imshow("image", image); //三通道 uchar *data = imag

五仁月饼哭了的博客 1万+

图像处理系列03——OpenCV快速遍历像素点

通过图像行首指针加偏移的方式访问像素点,虽然没有at方法方便,但是速度快。2. 指针偏移获取列数据。注意多通道图像每一行实际列数为。,例如三通道Mat需要处理三列才算处理完一个像素。

qq_18076309的博客 916

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 337

opencv之图像遍历方法详解

opencv之图像遍历方法详解

yohnyang的博客 1827

Windows下CMake的下载与安装详解

目录一、CMake介绍二、CMake的下载与安装 一、CMake介绍 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 二、CMake的下载与安装 CMake下载链接:https://cmake.org/download/。 下载最新稳定版即可(Latest Release): 下载完成后,单击“Next”按钮,在下图中勾选“I acce

Wendy的博客 8万+

STM32F405实战:手把手教你实现永磁同步电机无感FOC控制(附完整工程文件)

本文详细介绍了基于STM32F405微控制器实现永磁同步电机无感FOC控制的完整实战方案。文章从硬件搭建、CubeMX配置入手,逐步讲解了FOC核心算法、SVPWM调制,并重点阐述了如何结合HFI高频方波注入与滑模观测器(SMO)实现全速域无感控制。内容涵盖算法原理、代码实现、参数整定及调试技巧,并附有完整工程文件,为开发者提供从理论到实践的全面指导。

sun99的博客 265

OpenCV中高效的像素遍历方法,写出工程级像素遍历代码(关注效率)

初次接触OpenCV的开发者,必须过的第一道坎就是学会如何遍历访问Mat对象中每个像素,实现像素级别的图像操作,这个是最级别的编程技能,但是不同的像素遍历方法效率有云泥之别,相差特别大,甚至可能成为算法运行的瓶颈之一,因此找到一种速度快的遍历方法对大图像处理是很关键的。,但是这个在OpenCV官方的教程都没有明确说明,官方教程代码都是基于第一种方式,我想主要是让初学者容易理解与入门,这个也导致一些人在做开发的时候直接使用第一种方式做遍历,然后就是代码运行太慢,以后请用正确方式打开Mat对象遍历....

$firecat利白的代码足迹$ 4304

深度解析大众点评反爬机制:构建高可用店铺评论采集系统(2026最新实战)

在中文互联网数据采集领域,大众点评(现归属美团)始终占据着特殊地位。其丰富的UGC(用户生成内容)包含了超过2亿条真实店铺评论、数百万家商户的详细POI信息以及用户行为数据,对商业分析、口碑监测、本地生活趋势研究具有不可替代的价值。然而,大众点评的安全团队投入了顶级资源构建反爬系统——从请求签名、行为验证到设备指纹,其防御强度甚至超过多数电商平台。本文将完整呈现一套2026年依然有效的技术方案,包括破解核心参数_token、动态代理池维护、无头浏览器指纹伪装等,最终产出一个生产级采集框架。目录。

2201_76125261的博客 808

opencv 效率_OpenCV中高效的像素遍历方法,写出工程级像素遍历代码

点击上方↑↑↑“OpenCV学堂”关注我三种Mat对象遍历方法比较,像素高效遍历代码Mat对象结构初次接触OpenCV的开发者,必须过的第一道坎就是学会如何遍历访问Mat对象中每个像素,实现像素级别的图像操作,这个是最级别的编程技能,但是不同的像素遍历方法效率有云泥之别,相差特别大,甚至可能成为算法运行的瓶颈之一,因此找到一种速度快的遍历方法对大图像处理是很关键的。在开始寻找高效遍历方法...

weixin_39616547的博客 208

十年芯片资深IC设计工程师面经系列(四)SDC约束

set_driving_cell:当我们的设计是模块级(Block level)的design时,我们的设计前面一般还有其他的设计,那么前面模块的输出便是我们模块的输入,5.1set_false_path:可以单独的时钟或者路径进行约束。set drive :当我们的设计是芯片级(Chip level)的顶层设计时,芯片外围电路要驱动的是负载较大的IO单元,故需要的驱动能力较强,:set_load 是指output端口的负载,设置的值会影响输出到端口的net上的电容,从而影响相应的路径延时。

weixin_47349046的博客 1772

Qt之QMqtt 发送图片数据

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议;MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛;在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT);其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用;

Ilson_的博客 1436

c++和opencv小知识:遍历图像像素的常用方法(详细,很全)

c++遍历图像像素的常用方法 在图像处理时经常会用到遍历图像像素点的方式,同样是遍历图像像素点,共有很多中方法可以做到;在这些方法中,有相对高效的,也有低效的;不同场景使用不同方法。 其中: Mat_对应的是CV_8U,Mat_对应的是CV_8S,Mat_对应的是CV_32S,Mat_对应的是CV_32F,Mat_对应的是CV_64F。 1、遍历图像像素方法一:通过at(i,j)坐标指针 //遍历...

qq_43702097的博客 1万+

AUTOSAR从入门到精通-【应用篇】基于AUTOSAR架构的混合动力电池 ECU 软件开发

由于严峻的环境污染和能源短缺问题,各国都在致力于发展新能源车,以达到节能排放的目的。在此背景下,12V启停系统由于成本较低廉、匹配方便,得到广泛应用。但是12V系统作为启停系统后存在许多问题,比如节能和减排效果有限,并且轻度混合动力系统的功率需求通常在10~15KW,在此电压条件下运行时,电池的电流会达到1000A,因此该方案行不通。高压混合动力系统(>110V)的节油效果好,但是成本很高,并且需要大功率的电机。48V混合动力系统比高压混合动力系统成本。

getusushu的博客 1488

OpenCV 中像素遍历常用的几种方法

OpenCV 像素遍历常用的几种方式

yishuihanq的博客 3609

华为OD机试 - 商品推荐多属性排序 - 数组(Python/JS/C/C++ 双机位A卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。双十一来临,小王准备买某个购物平台买坚果。在输入坚果时,页面默认按照综合推荐列表。小王想知道这个综合排序时如何完成的,于是便开始思考算法题。经过一番操作后,完成它的多个关键词排序算法。希望你给小王提供一份正确的排序结果,验证其实现算法结果的准确性

学Java,找哪吒 622

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

OpenCV 图像像素高效遍历方法

在开始寻找高效遍历方法之前,先来了解一下Mat对象的数据组织形式与像素块数据的存储方式,Mat对象由两个部分组成,元数据头部加像素数据块部分,图示如下: 在OpenCV C++中Mat对象的内存管理由OpenCV框架自动负责内存分配与回收,基于智能指针实现内存管理。 直接获取Mat对象的像素块的数据指针,基于指针操作,实现快速像素方法,代码实现如下: voidmethod_3(Mat...

qq_40041064的博客 1536

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

opencv高效遍历图像

初次接触OpenCV的开发者,必须过的第一道坎就是学会如何遍历访问Mat对象中每个像素,实现像素级别的图像操作,这个是最级别的编程技能,但是不同的像素遍历方法效率有云泥之别,相差特别大,甚至可能成为算法运行的瓶颈之一,因此找到一种速度快的遍历方法对大图像处理是很关键的。在开始寻找高效遍历方法之前,先来了解一下Mat对象的数据组织形式与像素块数据的存储方式,Mat对象由两个部分组成,元数据头部...

jacke121的专栏 5106

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OpenCV对图像遍历的高效方法

一、指针遍历 首先介绍几个Mat类型的属性,rows是Mat类型的行数,cols是列数,channels()是通道数,那么对于图像的每一行,都有cols*channels()个像素点,所以我们可以对所有行进行遍历,然后对于特定一行,遍历所有像素点,代码如下: int nl= image.rows; // 行数 // 每行的元素数量 int nc= image.cols * i...

qq_41685265的博客 2455

Python-OpenCV对图像像素的遍历操作示例

Python-OpenCV对图像的遍历操作示例代码

昊虹AI笔记 5340

opencv中遍历每一个像素点进行处理

有时候我们需要遍历Mat中的每一个像素点,并且对像素点进行处理,这里以图像所有像素点都减去div(div属于int类型) void colorReduce(Mat& inputImage, Mat& outputImage, int div) { // 参数准备 outputImage = inputImage.clone(); int rowNumber = outputImage.r

wwwsssZheRen的博客 1万+

python+opencv实现遍历图片所有像素点,得到bgr

最近做一个需要两张图片重合的任务,用到了opencv遍历图片中的所有像素点,得到每个点的bgr,因此做以下记录: 1.python+opencv环境设置,这里就不讲了,网上有很多资料,不会的童鞋可以找度娘 下面直接来看代码: import os import cv2 import numpy as np np.set_printoptions(threshold=np.nan) # 这里多...

weixin_43360384的博客 1万+
上一篇: 数据增强方法总结
下一篇: OpenCV高斯滤波器详解及代码实现
Manketon
博客等级 码龄15年 52粉丝 79原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值