本文主要是介绍OpenCV笔记(五)CvMat结构体初解2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这一节学习矩阵的维度和通道的含义和概念。
一、对维度和通道的理解:
例(用cvGetReal2D或cvGet2D函数):二维矩阵。
单通道:float value = (float)cvGetReal2D(&mat, y, x);// mat:CvMat型结构体,y:行,x:列,函数返回值为double型,返回坐标为(y,x)的值;
多通道:CvScalar vlaue = cvGet2D(&mat, y, x); //mat:CvMat型结构体,y:行,x:列,函数返回值为CvScalar型(第三篇中介绍的结构体类型,成员为val[4]);
下面贴出通道数为2时的源码,该程序遍历输出矩阵中的值:
#include "stdafx.h"
#include "cxtypes.h"
#include "highgui.h"int main(int argc, char* argv[])
{CvMat mat;float data[12]={1, 2, 3, 4,5, 6, 7, 8,9,10,11,12};/*初始化mat,其中,若通道数为2,则type类型为:CV_<8|16|..><F|U|..>C2,其中cols处值应为:数组的列数除以2,因为双通道中,两个值为一组。*/cvInitMatHeader(&mat, 3, 2, CV_32FC2, data);for(int y = 0; y < mat.rows; y++){for(int x = 0; x < mat.cols; x++){CvScalar value = cvGet2D(&mat, y, x);//结构体value中的成员:val[4]:B、G、R、alpha;printf(" (%.2f %.2f) ", value.val[0], value.val[1]); }printf("\n");}return 0;
}
通道:如上源码中,CV_32FC2中,“C”后面的“2”即为通道数,如何简单地理解通道呢?比如通道数为3,则data(float类型)中的三个数为一组,构成一个单元m,所形成的以m为单元的矩阵可以拆分成3个以float类型的数为单元的矩阵。比如对于二维矩阵来说,按此思想,由原来的data矩阵(定义为2行m列, 因为通道数为3,所以m = (12/2)/3=2,即data应为2行2列。 )划分为:{1,4,7,10},{2,5,8,11},{3,6,9,12};3个2行2列的矩阵。
维度:维度的最直观体现就是坐标的个数,比如3维,就有z,x,y三个坐标。(注意:如果要定义大于2维的结构体,要用CvMatND。)
Ps:更高效快速地读取矩阵信息:使用cvGet2D等函数的原理是栈,如果图片比较大,数以百万计的栈操作会使程序的效率变低,那么如何提高效率呢?
额,就是用指针啦~下一节我们再来学习~
这篇关于OpenCV笔记(五)CvMat结构体初解2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!