C++:openCV中通过指针访问[r][c]处矩阵元素-包括对角线

在OpenCV中,cv::Mat类是用于存储和操作图像或数值数据的强大工具。当需要直接访问矩阵中的特定元素时,除了使用at方法外,还可以使用ptr方法。ptr方法返回指向矩阵某一行开始位置的指针,允许我们通过指针算术来访问该行的元素。

ptr方法的作用

ptr<Type>(row)方法返回一个指向cv::Mat中指定行row的第一个元素的指针,其中Type是矩阵中元素的类型(如floatdoubleint等)。通过这个指针,我们可以访问该行中的任何元素,但需要注意C++中的指针算术。

示例代码

以下是一个简单的示例,展示了如何使用ptr<float>来访问并修改一个浮点型矩阵中对角线上的元素。

cpp 复制代码
#include <opencv2/opencv.hpp>  
#include <iostream>  
  
int main() {  
    // 创建一个3x3的浮点型矩阵,并初始化为0  
    cv::Mat matrix = cv::Mat::zeros(3, 3, CV_32F);  
  
    // 使用ptr方法访问并修改对角线上的元素  
    for (int r = 0; r < matrix.rows; ++r) {  
        // ptr<float>(r) 返回指向第r行第一个元素的float*指针  
        float* rowPtr = matrix.ptr<float>(r);  
          
        // 访问并修改对角线上的元素(即(r, r)位置的元素)  
        rowPtr[r] = r + 1; // 将对角线上的元素设置为其行号加1  
    }  
  
    // 打印修改后的矩阵  
    std::cout << "Modified Matrix:\n";  
    for (int r = 0; r < matrix.rows; ++r) {  
        for (int c = 0; c < matrix.cols; ++c) {  
            std::cout << matrix.at<float>(r, c) << " ";  
        }  
        std::cout << std::endl;  
    }  
  
    return 0;  
}

输出

运行上述代码将输出以下矩阵,其中对角线上的元素被修改为它们的行号加1:

cpp 复制代码
Modified Matrix:  
1 0 0   
0 2 0   
0 0 3

注意事项

  • 当使用ptr方法时,需要确保不会越界访问矩阵的元素。
  • 指针算术(如rowPtr[r])是基于C++的,因此需要一定的C++基础来理解和使用。
  • 尽管ptr方法在某些情况下可以提供更高的性能(比如当你需要连续访问矩阵的一行或一列时),但在大多数情况下,使用at方法更为直观和安全。

希望这个博客示例能够帮助你理解如何在OpenCV中使用ptr方法来访问和修改矩阵中的元素!

相关推荐
算法鑫探5 小时前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
WBluuue5 小时前
数据结构与算法:康托展开、约瑟夫环、完美洗牌
c++·算法
木子墨5165 小时前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
浅时光_c5 小时前
14 结构体 共用体 枚举类型
c语言
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌
weixin_513449967 小时前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
烟锁池塘柳07 小时前
一文讲透 C++ / Java 中方法重载(Overload)与方法重写(Override)在调用时机等方面的区别
java·c++·面向对象
yolo_guo8 小时前
glog单行 30000 字节限制问题
c++
cccccc语言我来了8 小时前
C++轻量级消息队列服务器
java·服务器·c++
闻缺陷则喜何志丹8 小时前
【背包 组合】P7552 [COCI 2020/2021 #6] Anagramistica|普及+
c++·算法·背包·洛谷·组合