首页 > 其他分享 >OpenCV(cv::Mat 类的成员函数 ptr<T>())

OpenCV(cv::Mat 类的成员函数 ptr<T>())

时间:2024-09-03 10:36:44浏览次数:11  
标签:Mat OpenCV 矩阵 ptr 访问 cv 指针

目录



在 OpenCV 中,Mat 类的成员函数 ptr<T>() 用于获取指向矩阵数据的指针,允许直接访问底层数据。T 是指针的类型,它通常与矩阵的元素类型对应。通过这个函数,你可以以一种低开销的方式访问和修改矩阵数据。



1. 函数定义

template<typename T>
T* ptr(int row = 0);
  • T: 指定数据类型的指针,比如 float*, uchar* 等等。
  • row: 表示要访问的矩阵行的索引(默认是 0)。


2. 功能

  1. 访问矩阵的指定行: ptr<T>(row) 返回矩阵中指定行的数据指针。例如,在处理图像时,你可以获取每一行的数据并进行逐像素的操作。

  2. 类型安全的指针: 通过模板参数 T,你可以获得类型安全的指针,并且能够确保读取到的数据符合指定的类型。



3. 示例

假设有一个 2D 浮点型矩阵,你想高效地遍历和访问矩阵中的每一个元素,ptr<float>() 可以帮助你直接访问指定行的所有数据。

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 创建一个3x3的浮点矩阵
    cv::Mat mat = (cv::Mat_<float>(3, 3) << 1.0, 2.0, 3.0, 
                                             4.0, 5.0, 6.0, 
                                             7.0, 8.0, 9.0);

    // 遍历矩阵的每一行
    for (int i = 0; i < mat.rows; i++) {
        // 获取指向该行首元素的指针
        float* rowPtr = mat.ptr<float>(i);

        // 通过指针遍历该行的所有列元素
        for (int j = 0; j < mat.cols; j++) {
            // 修改该元素的值
            rowPtr[j] += 1.0;  // 每个元素加1
        }
    }

    std::cout << "Updated Matrix:\n" << mat << std::endl;

    return 0;
}

输出:

Updated Matrix:
[2, 3, 4;
 5, 6, 7;
 8, 9, 10]
  • mat.ptr<float>(i):用于获取矩阵 mat 的第 i 行的指向 float 类型数据的指针。
  • 直接访问数据:rowPtr[j] 允许你像访问普通数组那样访问每一列的元素。
  • 高效性:由于 ptr<T>() 直接返回指针,你可以直接操作底层数据。这种方式比使用 at() 方法更高效,尤其是在处理大量数据时。

假设有一个 8 位单通道(灰度)图像 Mat 对象 img,你可以使用 ptr<uchar>() 访问和修改图像数据。

cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);

// 遍历每一行
for (int i = 0; i < img.rows; ++i) {
    // 获取第 i 行的指针
    uchar* row_ptr = img.ptr<uchar>(i);

    // 遍历每一列
    for (int j = 0; j < img.cols; ++j) {
        // 访问第 i 行第 j 列的像素
        uchar pixel = row_ptr[j];

        // 修改像素值
        row_ptr[j] = pixel / 2;  // 例如,将像素值减半
    }
}

在这个例子中,ptr<uchar>(i) 返回指向第 i 行数据的指针,类型为 uchar*,每个元素是图像中的一个像素。



4. 注意事项

  • 类型匹配: ptr<T>() 中的 T 必须与 Mat 对象的实际数据类型匹配,否则会出现未定义行为。
  • 行索引有效性ptr<T>() 接受行索引 i,确保传递的索引值在矩阵行数范围内,否则会产生越界访问错误。


总结

ptr<T>() 是 OpenCV 提供的高效数据访问手段,它允许你绕过矩阵的边界检查和安全性检查,直接访问矩阵的底层数据,尤其适用于对性能有要求的场景。



标签:Mat,OpenCV,矩阵,ptr,访问,cv,指针
From: https://www.cnblogs.com/keye/p/18394099

相关文章

  • 安防监控/视频汇聚EasyCVR视频监控平台级联上级无法播放是什么原因?
    EasyCVR视频监控平台,作为一款智能视频监控综合管理平台,凭借其强大的视频融合汇聚能力和灵活的视频能力,在各行各业的应用中发挥着越来越重要的作用。EasyCVR视频汇聚平台采用先进的图像处理技术和传输协议,能够确保高清、稳定的视频传输。同时,平台支持多种主流标准协议和厂家的私有......
  • 智慧安防EasyCVR视频监控汇聚平台云端录像时间轴拖动不跳转,是什么原因?
    视频汇聚EasyCVR视频智能管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力,为各行各业的视频监控需求提供了优秀的解决方案。EasyCVR平台支持多种视频流的外部分发,如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等,这为其在各种复杂环境......
  • wh~视觉~CV~合集1
     哈哈准备开始挪一些cv相的合集~ whaosoftaiotTaobao开发板商城天皓智联 www.143ai.com一、CVの文档自动扫描仪 介绍如何使用OpenCV+GrabCut实现一个文档自动扫描仪。背景介绍   文档扫描是将物理文档转换为数字形式的过程。可以通过扫描仪或手机摄像头拍摄图像来......
  • opencv学习:基础用法和图像添加边界框设置
    1.opencv基础用法1.从文件加载图像a=cv2.imread("1.jpg")b=cv2.imread("2.jpg")2.从文件读取视频video=cv2.VideoCapture("1.mp4")3.读摄像头cv2.VideoCapture(0)4.保存图片cv2.imwrite(r"1_gray.jpg",b)5.展示图片cv2.imshow("shuiju",a)6.释......
  • 《深度学习》OpenCV 图像边缘检测 算法解析及代码演示
    目录一、图像边缘检测1、什么是边缘检测2、常用的边缘检测算法        1)Sobel算子    2)Scharr算子        3)Canny边缘检测算法        4)Laplacian算子3、边缘检测流程        1)预处理        2)计算梯度     ......
  • 【OpenCV】快速入门(二)--视频处理(1)
    OpenCV–视频处理先看代码#include<iostream>#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"intmain(intargc,char**argv){cv::namedWindow("Example3",cv::WINDOW_AUTOSIZE);cv::VideoCaptu......
  • 开机就能打?没那么玄乎!客观分析 “狂躁许可”漏洞(CVE-2024-38077)及其影响范围
    一、事件背景2024年7月9日,微软官方发布了一个针对“windows远程桌面授权服务远程代码执行漏洞”(CVE-2024-38077)的修复补丁包,起初并没有引起大家的警觉。今日在国外某网站上疑似漏洞的作者公开了该漏洞的“POC验证代码”。一时激起千层浪,该漏洞开始疯狂发酵并在安全圈里转发。该文章......
  • OpenCV(cv::getTickCount()、cv::getTickFrequency())
    目录1.getTickCount()2.getTickFrequency()3.综合应用4.注意事项getTickCount()和getTickFrequency()是OpenCV库中的两个函数,通常用于获取高精度的时间间隔。这两个函数主要用于计时和性能测量。1.getTickCount()getTickCount()函数用于返回从系统启动到当前为......
  • OpenCV(图像NaN处理)
    目录1.目的2.示例1.目的将src矩阵中的某些区域(由mask指定的非零区域)设置为NaN。SetToNan函数实现了这一功能。2.示例#include<iostream>#include<opencv2/opencv.hpp>usingnamespacestd;usingnamespacecv;voidSetToNan(cv::Mat&src,constcv::Mat......
  • OpenCV绘图函数(14)图像上绘制文字的函数putText()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述在图像上绘制指定的文本字符串。cv::putText函数在图像上绘制指定的文本字符串。无法使用指定字体渲染的符号会被问号(?)替换。关于文本渲染的具体示例可以参考getTextSize函数......