Mat对象
面向对象的数据结构
数据结构是指数据对象
以及该数据对象集合中的数据元素之间的相互关系。包括数据的逻辑结构、数据的存储结构和数据的运算(操作)。例如,队列,栈
:线性表
……
数据结构,数据类型,结构类型?
数据结构简单点指一个问题中用到的数据的值和关系表现在逻辑上是个什么样子,比如是个图表,还是一条直线,等等,
数据类型是指各种数据形态都不一样,比如有的是字母类,有的是整数类,有的是小数类,这些不同的数在计算机中将来所要分配的空间大小是不一样的.所以相当于是用数据类型限定这种数在计算机中该分配多大空间的.
结构类型是如果在计算机中存储数据的时候,是简单直接存储数据,还是要给他绑定一个空间放其他关系,相当于增大了数据的形态.比如结点 那么除了要存数据,还要在数据基础上存关系(指针),这样数据在原来逻辑基础上就变形了.这就是定义的时候重新设置类型了.
构造Mat的方法
构造Mat的方式有很多种,下面把常用的方法一一列出:
- 使用构造函数Mat(nrows, ncols, type, fillValue]),例如,
|
|
- 使用M.create(nrows,ncols,type),例如,
|
|
- 构建多维的矩阵,
|
|
- 使用复制构造函数或者赋值操作符
|
|
- 单独对矩阵的某一行某一列进行操作
|
|
- 构建矩阵的ROI区域,单独操作ROI区域的值
|
|
- \u2028确定矩阵在原矩阵中的相对位置,使用locateROI,
|
|
- 对于外部数据输入,进行初始化
|
|
- IplImage,CvMat和Mat相互转换
|
|
- 类似Matlab方式和<<赋值
|
|
备注:
1
、
C++中一个类可以有很多个构造函数,但是参数一定要不一样。编译器会自动提供两个构造函数:默认构造函数和复制构造函数。析构函数只能有一个。
2、上述所指的常用方法指的Mat对象的
成员函数
。
补充两个数据成员:
rows 为像素的行数(int height = src.rows;)
cols 为像素的列数(int width = src.cols;)
-->用复制(部分、全部)来创建一个Mat对象
备注:
Mat B(A);
单纯复制对象的头和指针部分时,不会复制数据部分,但是通过操作新的对象B时,会影响到我们的旧的对象A。而全部复制无影响,请尽情操作吧。
--> 用构造函数 或者 成员函数 来创建Mat对象
构造函数
格式:CV_ [每一项的位数] [有符号或无符号] [类型前缀] C [通道数]
Mat dst;
dst = Mat(src.size(), src.type());
dst = Scalar(127, 0, 255);
备注:
Scalar()向量表示初始化每个像素值,
参数需要和通道数保持一致
,例如上述。
成员函数
或者先定义图像,再初始化像素值。
代码示例如下:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("liaowenbin.bmp");
if (src.empty())
{
printf("Not file.../n");
return -1;
}
//只会复制对象的头和指针
#if 0
Mat dst(src);
namedWindow("Picture",WINDOW_AUTOSIZE);
imshow("Picture",dst);
#endif
//完全复制 Mat clone()
#if 0
Mat dst = src.clone();
namedWindow("Picture", WINDOW_AUTOSIZE);
imshow("Picture", dst);
#endif
//完全复制 void copyTo(Mat Image)
#if 0
Mat dst;
src.copyTo(dst);
namedWindow("Picture", WINDOW_AUTOSIZE);
imshow("Picture", dst);
#endif
#if 0
//定义小数组
Mat dst =(Mat_<uchar>(3, 3) << 0, 5, 6,
3,4,5,
4,2,1);
cout << "dst = " << dst << endl;
//单通道的像素指针
uchar* p = dst.ptr(0); //0表示第1行
//cout << "*p = " << *(p+1) << endl << endl << "src ="
// << src << endl;
printf("*p = %hhd \n",*(p+8));
system("Pause");
#endif
#if 0
Mat dst(3,3,CV_8UC3,Scalar(1,23,45));
cout << "dst = " << dst << endl << endl;
//多通道的像素指针
uchar* p = dst.ptr(0);
cout << "p = " << static_cast<const void *>(p) << endl;
printf("*p = %hhd \n",*(p+5));
system("Pause");
#endif
waitKey(0);
return 0;
}