OpenCV基于字节指针进行高效像素遍历

直接获取Mat对象的像素块的数据指针,基于字节指针操作,实现快速像素遍历方法(1280x720, 彩色,仅需几毫秒完成)。Mat对象的数据组织形式与像素块数据的存储方式,Mat对象由两个部分组成,元数据头部加像素数据块部分。

代码实现如下:

void img_Byte_ptr(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);
}

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

唯一正确的是直接使用data指针直接访问,但是这个在OpenCV官方的教程都没有明确说明。

原文地址:https://www.cnblogs.com/jeshy/p/11118346.html

时间: 2025-01-12 05:50:33

OpenCV基于字节指针进行高效像素遍历的相关文章

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

OpenCV学习C++接口 Mat像素遍历详解 原文地址:https://www.cnblogs.com/zhehan54/p/8460602.html

怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

  分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.bmp", 0 ); 这样图像已经灰度化,然后调用cvThreshold(image, image, 125, 255, CV_THRESH_BINARY); 就可以了,125那里是你所用的阈值,这就是最简单的二值化,你要用ostu,或者别的高级一点的,就要自己写函数了   // Truncate v

opencv中Mat类型数据操作与遍历

Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是matrix header(包括matrix的大小尺寸,储存方法,储存地址等等..),另一个是指向存储像素值的矩阵的指针. Opencv中对Mat的复制分为两种, Mat A, C; // creates just the header parts A = imread(argv[1], CV_LO

用opencv读取图像鼠标点的像素,更正一个Bug

作者:skyseraph 出处:http://www.cnblogs.com/skyseraph/ 以下代码在网上流传很广. 不过,调试运行之后发现,功能是正确的,但是内存很快就耗尽,导致死机.经过查找,加上: cvReleaseImage(&img1);    //释放源图像占用的内存 这一行是我(szliug)加的,否则内存很快就会耗尽,会死机的. 之后运行正常. /*===============================================// 功能:OpenCV Ut

四、基于文件指针的文件操作

基于文件指针的文件操作(缓冲) linux的文件和文件描述符 linux中对目录和设备的操作都是文件操作,文件分为普通文件,目录文件,链接文件和设备文件. 普通文件:也称磁盘文件,并且能够进行随机的数据存储(能够自由seek定位到某一个位置): 管道:是一个从一端发送数据,另一端接收数据的数据通道: 目录:也称为目录文件,它包含了保存在目录中文件列表的简单文件. 设备:该类型的文件提供了大多数物理设备的接口.它又分为两种类型:字符型设备和块设备. 字符型设备一次只能读出和写入一个字节的数据,包括

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

SDUT 2142 【TEST】数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

一起talk C栗子吧(第一百四十三回:C语言实例--文件操作:基于文件指针三)

各位看官们,大家好,上一回中咱们说的是基于文件指针进行文件操作的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中详细地介绍了标准库中与文件操作相关的函数.不过,限于时间的原因,没有举具体的例子.还是那句老话,只说不练,不是我们的风格.因此,今天我们将通过具体的例子来说明如何使用文件指针来操作文件. 对文件的操作,还是使用我总结的文件操作三步曲比较好: p_file = fopen(file_name,"w"); //打开文件 re

KINECT+opencv基于骨骼信息对视频进行动作识别

KINECT+opencv基于骨骼信息对视频进行动作识别 环境:kinect1.7+opencv2.4+vc2015 使用kinect获取并按批处理三维空间内的骨骼信息 基于视频帧差计算各关节运动向量并与本地模板匹配 目录 KINECTopencv基于骨骼信息对视频进行动作识别 目录 写在前面 对当前帧处理并匹配 kinect对帧的处理 与模板的向量余弦计算 根据动态时间规划法匹配 记录并保存模板到本地 使用opencv的FileStorage类生成xml文件 写在前面 自前一篇过去一周了.这次