访问Mat矩阵中的元素并为其赋值

在OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式。今天主要讲容易方式:         最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, col ),输入参数是矩阵,不是指针,网上有很多人说是指针,矩阵元素类型,行,列,返回值是相应行,列的矩阵元素。CV_MAT_ELEM可以给矩阵赋值,也可以访问矩阵元素。

        CV_MAT_ELEM宏实际上会调用CV_MAT_ELEM_PTR(matrix,row,col)宏来完成任务。 CV_MAT_ELEM_PTR()宏的参数是矩阵,行,列。CV_MAT_ELEM()宏和CV_MAT_ELEM_PTR()宏的区别是,在调用CV_MAT_ELEM时,指向矩阵元素的指针的数据类型已经依据输入参数中的元素类型而做了强制转换:

如下程序:

CvMat* mat = cvCreateMat(3,3,CV_32FC1);//创建矩阵

cvZero(mat);//将矩阵置0

//为矩阵元素赋值CV_MAT_ELEM( *mat, float, 0, 0 ) = 1.f;                                                                                       CV_MAT_ELEM( *mat, float, 0, 1 ) = 2.f;CV_MAT_ELEM( *mat, float, 0, 2 ) = 3.f;CV_MAT_ELEM( *mat, float, 1, 0 ) = 4.f;CV_MAT_ELEM( *mat, float, 1, 1 ) = 5.f;CV_MAT_ELEM( *mat, float, 1, 2 ) = 6.f;CV_MAT_ELEM( *mat, float, 2, 0 ) = 7.f;CV_MAT_ELEM( *mat, float, 2, 1 ) = 8.f;CV_MAT_ELEM( *mat, float, 2, 2 ) = 9.f;

//获得矩阵元素的值float element = CV_MAT_ELEM(*mat,float,2,2);

float element_1_1 = 7.7f;*((float*)CV_MAT_ELEM_PTR(m, 1, 1)) = element_1_1;

float element = CV_MAT_ELEM(m,float, 1,1 );

cout<<element<<endl;

       以上使用矩阵中元素的方式很方便,但不幸的是,该宏在每次调用时,都会重新计算指针的位置。这意味着,先查找矩阵数据区中第0个元素的位置,然后,根据参数中的行和列,计算所需要的元素的地址偏移量,然后将地址偏移量与第0个元素的地址相加,获得所需要的元素的地址。所以,以上的方式虽然很容易使用,但是却不是获得矩阵元素的最好方式。特别是当你要顺序遍历整个矩阵中所有元素时,这种每次对地址的重复计算就更加显得不合理。
时间: 2024-12-04 22:55:46

访问Mat矩阵中的元素并为其赋值的相关文章

LeetCode:Spiral Matrix - 螺旋输出矩阵中的元素

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix/ 3.题目内容 英文:Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. 中文:给出一个m行n列的矩阵,以螺旋顺序返回矩阵中的所有元素. 例如:现有矩阵如下: [  [ 1,

OpenCV访问Mat对象中数据时发生异常---Mat中的数据访问

7.1和7.1.1由于越狱不成熟,半完美越狱后电脑上无法访问系统越狱目录,如var usr 等等. 今天有些意外地发现,可以在电脑上使用手机的越狱目录我手机 i4 7.1.1 联通 半完美越狱,没装Afc2Add,也没装Appsync 附上  --->我的半完美越狱过程 好了,下面直接正题 一.前提,必须安装ifile! 打开ifile,并转到 /var/mobile/media 目录下,然后点击右上角的 [ 编辑 ]如图: 二.点左下角的 + 号创建,如图: 三.点 [ 类型],选择[符号链接

一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵

题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下来N行,每行M个数,表示矩阵每个元素的值 输出: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 样例输入: 4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 样例输出: 1 首先这个题应该是有一个动态规划的解法,不过好像复杂度也要到O(n^3lo

将矩阵中0元素所对应的行列都清零

编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行与列清零. void setZeros(int **matrix, int lrow, int lcol) { bool *row = new bool[lrow]; bool *column = new bool[lcol]; //记录值为0的元素所在的行索引和列索引 for (int i = 0; i < lrow; i++) { for (int j = 0; j < lcol; j++) { if (matrix[i][j] ==

杨氏矩阵中查找元素

在杨氏矩阵中查找一个元素是否存在 杨氏矩阵即每一行均以递增顺序排列,每列从上到下也为递增顺序 方法一:数组 #include<stdio.h> #include<stdlib.h> #define COLS 3 #define ROWS 3 //要查找只要在找到右上角的元素和输入元素进行比较.如果右上角元素大,即可排除其他行,若小 //,则可排除本行,继续循环,用输入元素和右上角的元素进行比较 int find(int arr[][COLS], int rows, int cols

《OpenCV:访问Mat图像中每个像素值》

图像容器Mat 还是先看Mat的存储形式.Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放<uchar>类型:如果是RGB彩色图,存放<Vec3b>类型. 单通道灰度图数据存放格式: 多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图: 注意通道的顺序反转了:BGR.通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便.可以用 isContinuous()函数来判断图像

转载【OpenCV】访问Mat中每个像素的值(新)

转载一个讲Mat像素访问的,仅记为笔记. y原文链接为:http://blog.csdn.net/xiaowei_cqu/article/details/19839019 目录(?)[-] Color Reduce 方法零ptr和操作符 方法一ptr和指针操作 方法二ptr指针操作和取模运算 方法三ptr指针运算和位运算 方法四指针运算 方法五ptr位运算以及imagecols imagechannels 方法六连续图像 方法七continuouschannels 方法八Mat _iterato

(转)OpenCV 访问Mat中每个像素的值

转自:http://blog.csdn.net/xiaowei_cqu/article/details/19839019 在<OpenCV 2 Computer Vision Application Programming Cookbook>看到的例子,非常不错,算是对之前的文章<访问Mat图像中每个像素的值>的回顾和补充. Color Reduce 还是使用经典的Reduce Color的例子,即对图像中的像素表达进行量化.如常见的RGB24图像有256×256×256中颜色,通

leetcode.矩阵.378有序矩阵中第K小的元素-Java

1. 具体题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1,  5,  9], [10, 11, 13], [12, 13, 15] ],k = 8, 返回 13. 2. 思路分析 二分法:初始化 low 指针为矩阵中最小元素:matrix[0][0],high 指针为矩阵中最大元素:matrix[rows-1][cols-1],之后进行二分查找,迭代时每次计算矩阵中