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

Posted jeshy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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官方的教程都没有明确说明。

以上是关于OpenCV基于字节指针进行高效像素遍历的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV Mat遍历的方法

OpenCV Mat遍历的方法

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

用opencv如何提取像素点的RGB分量

基于OpenCV实现的图像油画效果代码(高效率低耗时的C++代码-带详细注释)

在 OpenCV 中循环遍历 16 位 Mat 像素的有效方法