OpenCV Mat

Mat

1、Mat用C++管理,更为方便,IplImage(用C语言)。
2、由矩阵头(包括矩阵大小,存储方法,指针地址)和数据指针(图像内容的指针)组成。
3、Mat赋值只赋矩阵头信息,图像内容是共享的。
例如:

Mat A, C;                                 // creates just the header parts
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // here we'll know the method used (allocate matrix)

Mat B(A);                                 // Use the copy constructor

C = A;                                    // Assignment operator

4、Mat也可以只要某图像的一部分,用于感兴趣区域的分割(ROI),
例如:

Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
Mat E = A(Range::all(), Range(1,3)); // using row and column boundaries

5、如果要赋值整幅图像用clone()和copyTo(),
例如:

Mat F = A.clone();
Mat G;
A.copyTo(G);

Storing methods(矩阵头中的存储方法)

包括:颜色空间和数据类型。
颜色空间:RGB,HSV和HLS,YCrCb,L*a*b。

实例

1、读取和显示

Load, Modify, and Save an Image

#include <cv.h>
#include <highgui.h>
using namespace cv;
int main( int argc, char** argv )
{
 char* imageName = argv[1];
 Mat image;
 image = imread( imageName, 1 );
 if( argc != 2 || !image.data )
 {
   printf( " No image data \n " );
   return -1;
 }
 Mat gray_image;
 cvtColor( image, gray_image, CV_BGR2GRAY );
 imwrite( "../../images/Gray_Image.jpg", gray_image );
 namedWindow( imageName, CV_WINDOW_AUTOSIZE );
 namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );
 imshow( imageName, image );
 imshow( "Gray image", gray_image );
 waitKey(0);
 return 0;
}
2、Mat初始化
  • 构造
    Mat M(2,2, CV_8UC3, Scalar(0,0,255));//scalar是四维的
    cout << "M = " << endl << " " << M << endl << endl;

    输出:
    CV_8UC3的格式
    CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]

  • 创建多维矩阵
    int sz[3] = {2,3,4}; //三维矩阵每一维度的个数
    Mat L(3,sz, CV_8UC(1), Scalar::all(0));\\3 代表三维矩阵

  • 从IplImage创建Mat
    IplImage* img = cvLoadImage("greatwave.png", 1);
    Mat mtx(img); // convert IplImage* -> Mat

  • 用函数zeros(), ones(), eye()
    Mat A;
    A = Mat::zeros(3, 3, CV_32F);
    A = Mat::ones(100, 100, CV_8U)*3; // make 100x100 matrix filled with 3.
    A = Mat::eye(4, 4, CV_32F)*0.1;// make a 4x4 diagonal matrix with 0.1's on the diagonal.

  • 用函数create()
    M.create(4,4, CV_8UC(2));
    cout << "M = "<< endl << " " << M << endl << endl;

    结果

  • 小矩阵
    Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    cout << "C = " << endl << " " << C << endl << endl;

    结果

  • 复制某一行
    Mat RowClone = C.row(1).clone();
    cout << "RowClone = " << endl << " " << RowClone << endl << endl;

  • 随机函数randu()
    Mat R = Mat(3, 2, CV_8UC3);
    randu(R, Scalar::all(0), Scalar::all(255));

3、格式化输出
  • Default
    cout << "R (default) = " << endl << R << endl << endl;
  • Python
    cout << "R (python) = " << endl << format(R,"python") << endl << endl;

原文出自OpenCV官网英文文档,笔记记录了Mat相关的知识点。

OpenCV中的Mat是一个多维数组,用于存储图像或其他类型的数据。它是OpenCV中最基本的数据结构之一。 Mat类提供了许多方法来操作和访问图像数据。你可以使用Mat对象加载、保存、修改和显示图像。它还提供了一些基本的数学运算,如加法、减法和乘法,以及一些高级图像处理功能,如滤波和边缘检测。 在使用Mat类之前,你需要包含OpenCV的头文件并链接对应的库。然后,你可以使用Mat对象来创建、读取和处理图像数据。例如,你可以使用Mat对象加载一张图像: ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR); if (image.empty()) { std::cout << "Failed to load the image." << std::endl; return -1; } cv::imshow("Image", image); cv::waitKey(0); return 0; } ``` 这段代码将加载名为"image.jpg"的图像,并显示在一个窗口中。你可以使用Mat对象的其他方法来操作图像数据,如修改像素、裁剪图像区域、调整图像大小等。 除了用于存储图像数据,Mat类还可以用于存储其他类型的多维数组。你可以使用构造函数或create()方法来创建指定类型和大小的Mat对象。例如,创建一个3x3的浮点型矩阵: ```cpp cv::Mat mat(3, 3, CV_32F); ``` 这样就创建了一个3x3的浮点型矩阵,可以用来存储和处理数数据。 总之,OpenCVMat类是一个非常强大和灵活的数据结构,用于处理图像和其他类型的多维数据。它提供了许多方法和功能,让你能够方便地进行图像处理和计算机视觉任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值