前言

  本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法。

  更多的矩阵处理函数还请参阅相关资料。

CvMat 的类型定义

 typedef struct CvMat
{
int type; // 数据类型
int step; // 行长度
int* refcount; /* 内部使用 */
int hdr_refcount; /* 内部使用 */
union // 指向数据区的指针
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
union // 行数
{
int rows;
int height;
};
union // 列数
{
int cols;
int width;
};
} CvMat;

CvMat 的创建方法

  创建矩阵函数:

 cvMat * cvCreateMat (int rows, int cols, int type);

  rows:行数

  cols:列数

  type:数据类型,其格式一般为 CV_<比特数>(S|U|F)C<通道数>,比如 CV_32FC3 就表示 32 位浮点类型的 3 通道矩阵。

CvMat 中单个元素的存取方法

  1. 可以使用宏 CV_MAT_ELEM () 来实现对矩阵某个元素的读取,如下代码访问矩阵中的第 3 行 2 列的元素:

 float elem_3_2 = CV_MAT_ELEM (*mat, float, , );

  其中,mat是 CvMat * 类型,float 是类型说明,最后两个参数是元素的行和列,该宏返回指定的元素的值。

  2. 可以使用宏 CV_MAT_ELEM_PTR () 来实现对矩阵某个元素的设置,该宏返回指向指定元素的指针,如下代码修改矩阵中的第 3 行 2 列的元素:

 *((float *)CV_MAT_ELEM_PTR (*mat, , )) = elem_3_2;

  需要说明的是,获取到指向指定元素的指针后,还需要对这个指针进行强制转型方能正常使用。

CvMat 的遍历方法

  如果遍历采用一个个取元素的方法,未免效率太慢。实际应用中,对矩阵的遍历常常采用指针遍历法,如下代码展示了对一个 CvMat 矩阵的遍历:

 // 此头文件包含图像IO函数的声明
#include "highgui.h"
// 此头文件包含基本的图像处理函数和高级计算机视觉算法
#include "cv.h"
#include <iostream> #define R 10 // 矩阵行
#define C 10 // 矩阵列 using namespace std; int main (void) { // 创建 R 行 C 列 32位单通道浮点类型的矩阵
CvMat *m1 = cvCreateMat ( R, C, CV_32FC1 ); // 赋值变量
float s = 1.0f;
// 遍历矩阵并赋值
for (int i=; i<R; i++) {
// 获取矩阵每行的行首地址,下面的data成员必须先取其ptr成员计算完偏移地址后,再强制转化为目标数据类型。
float *ptr = (float *)(m1->data.ptr + i * m1->step);
// 遍历子一维数组
for (int j=; j<C; j++) {
ptr[j] = s++;
}
} // 打印结果
for (int i=; i<m1->rows; i++) {
float *ptr = (float *)(m1->data.ptr + i * m1->step);
for (int j=; j<m1->cols; j++) {
printf("%7.2f", *ptr);
ptr++;
}
cout << endl;
}
cout << endl << endl; getchar(); return ;
}

  运行结果:

  

 说明

  1. 一般尽量创建浮点矩阵( F 型 ),别的类型值可以向上转型后存放进去。

  2. 如果要遍历的是字符型( U S 型 )矩阵,那么遍历指针一定要设定为字符型的,等到取出的时候再向上转型/存进的时候向下转型即可。

最新文章

  1. Maven教程
  2. nodejs研究笔记
  3. Product of Array Except Self
  4. XidianOJ 1096 数的拆分
  5. form作为module name 悲剧了
  6. 6.ipv6地址配置
  7. mysql中查询某字段所在的表方法
  8. jdbc的封装
  9. warning:This application is modifying the autolayout engine from a background thread
  10. WPF界面设计技巧(6)—玩玩数字墨水手绘涂鸦
  11. PWM(脉宽调制)——LED特效呼吸灯设计
  12. 汇编语言1(mooc)
  13. ActiveMQ的断线重连机制
  14. vue 点击图片放大
  15. 【Spring】SpringMVCの環境構築(簡)(Version3.1)
  16. SPOJ LCS - Longest Common Substring 字符串 SAM
  17. suricata 的安装编译
  18. MySQL数据库----完整性约束
  19. 关于表单中Readonly和Disabled
  20. 2016.5.57—— Remove Duplicates from Sorted List

热门文章

  1. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---26
  2. CentOS 7系统添加启动项
  3. AC日记——还是01串 51nod 1396
  4. ansible 文件和目录操作
  5. 解决WordPress中字符转义的问题
  6. 语义分割丨PSPNet源码解析「训练阶段」
  7. 批量去掉文件中的^M
  8. Docker 创建image
  9. eclipse中修改JDK版本
  10. Fresco的使用及注意事项