在2001年刚刚出现的时候,OpenCV基于 C 语言接口而建。为了在内存(memory)中存放图像,当时采用名为 IplImage 的C语言结构体,但这种方法必须接受C语言所有的不足,这其中最大的不足要数手动内存管理,其依据是用户要为开辟和销毁内存负责。为此,OpenCV在2.0版本中引入了一个新的C++接口Mat(基于类的概念),利用自动内存管理给出了解决问题的新方法。但C++接口唯一的不足是当前许多嵌入式开发系统只支持C语言。
1.1 Mat 创建
方法一:构造函数
Mat img(2, 3, CV_8UC3, cv::Scalar(0, 0, 255));
// CV_8UC3,CV_[The number of bits per item][Signed or Unsigned][TypePrefix]C[The channel number]
//创建2行3列的矩阵,元素使用8位无符号char类型保存,具有3通道,每个像素的初始值是(0,0,255)
//每个像素点都是由1*3的小矩阵构成(行X3,列不变)。
方法二:create方法
//该方法不能为矩阵设置初始值,只是在改变尺寸时为矩阵数据重新分配内存。创建一个4行4列有2个通道的矩阵
img.create(4, 4, CV_8UC(2));
方法三:eye、ones、zeros方法
Mat::eye, 矩阵元素为对角矩阵
Mat::ones, 矩阵元素置1
Mat::zeros, 矩阵元素清零(单通道为灰度图像;彩色图像显示为0即黑色)
其他:Mat复制等
1.2 示例
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; int main( int argc, char** argv ) { Mat img(3,2, CV_8UC3, Scalar(126,0,255)); cout << "yunfung_opencv_learn_test:" <<"\n\n"; cout << "img = \n " << img << "\n"; Mat eye = Mat::eye(4,3,CV_8U); Mat ones = Mat::ones(4,3,CV_8U); Mat zeros; zeros.create(4,3,CV_8U); //分配内存,不初始化元素 cout << "eye = \n " << eye << "\n"; cout << "ones = \n " << ones << "\n"; cout << "zeros = \n " << zeros << "\n"; return 0; }
时间: 2024-10-24 13:27:53