OpenCV下的Mat类模板基础(实例)

文章介绍了OpenCV中的核心数据结构cv::Mat,包括其模板特性、如何创建对象、基本操作,如读取、显示和存储图像,以及矩阵的翻转等图像处理操作。此外,还提到了Mat类的内存管理和引用计数机制。

目录

1.Mat类模板相关知识点

2.创建cv::Mat类对象

3.cv::Mat类对象基本操作

(1)读取图像,显示图像,存储图像


Windows下的CodeBlocks配置Opencv环境

OpenCV的数据结构

1.Mat类模板相关知识点

  • Mat类模板可以用于保存其他n维数组,主要用于保存图像数据,默认情况下,定义的cv::Mat类对象时,其大小为0 x 0(也可以给构造函数提供合适的参数)如:
    • cv:Mat img(240,320,CV_8U,cv::Scalar(100))
    • 其中CV_8U表示图像中的每个像素用1个字节表示(8bit),U表示无符号整数。
    • 对于彩色图像,使用3通道(channels)表示,其中CV_8UC3。
    • 也可以使用16位或者32位整型CV_8SC3,32或者64位浮点型CV_32F。
  • cv::Mat类对象离开作用域之后,会自动销毁,所以避免了内存泄露。
  • cv::Mat类提供了一个引用计数器和浅复制机制以便将一个图像复制给另一个图像,而不是复制其数据,这两个图像会共享同一个数据区,特别是当参数是值传递和函数返回的是图像时。
  • 一个引用计数器保证只有当所有的引用都销毁之后才真正销毁数据。

2.创建cv::Mat类对象

cv::Mat类对象
语法描述
double m[2][2] = {{1.0,2.0},{3.0,4.0}};Mat M(2,2,CV_32F,m)根据二维数组m创建一个2 x 2维矩阵M
Mat M(100,100,CV_32FC2,Scalar(1,3))创建一个100 x 100的2通道矩阵,第一个通道用1填充,第二个通道使用3填充
M.create(300,300,CV_8UC(15))创建一个300 x 300的15通道矩阵
int sizes[3] = {7,8,9};Mat M(3,sizes,CV_8U,Scalar::all(0))创建多维数据,其维数为3,每一维的尺度由sizes数组指定
Mat M = Mat::eye(7,7,CV_32F)创建一个7 x 7的单位矩阵,每个元素是32位浮点数
Mat M = Mat:zeros(7,7,CV_64F)创建一个7 x 7的零矩阵,每个元素是64位浮点数
Mat M = Mat:ones(7,7,CV_64F)创建一个7 x 7的全1的矩阵,每个元素是64位浮点数

访问cv::Mat类对象的元素
语法描述
M.at<double>(i,j)访问第i行,第j列的元素,元素类型为double,注意计数从0开始
M.row(1)访问第1行
M.col(3)访问第3列
M.rowRange(1,4)访问第1行到第4行
M.colRange(1,4)访问第1列到第4列
M.rowRange(2,5).colRange(1,3)访问第2行到第5行,第1列到第3列
M.diag()访问对角线

cv::Mat类对象的表达式
语法描述
Mat M2 = M1.clone()创建M1的复制数据M2
Mat M2;M1.copyTo(M2)将M1的数据复制到M2
Mat M1 = Mat::zeros(9,3,CV_32FC3);Mat M2 = M1.reshape(0,3)对M1的数据进行调整后生成M2
Mat M2 = M1.t()M1的转置
Mat M2 = M1.inv()M1的逆
Mat M3 = M1 * M2M1乘以M2
Mat M2 = M1 + sM1 加上一个标量

3.cv::Mat类对象基本操作

(1)读取图像,显示图像,存储图像

#include <iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
    //创建两个个Mat对象
    Mat image,result;
    //显示矩阵的大小
    cout<<"image.width = "<<image.size().width<<" image.height = "<<image.size().height<<endl;

    //读取图片
    image = imread("../images/GuiZhou.jpg");

    //判断图像是否读取成功
    if(!image.data){
        cout<<"read image failed!"<<endl;
    }

    //显示原始图像

    namedWindow("Original image!");
    imshow("Original image!",image);

    //对图像进行水平翻转,并且将翻转之后的结果存放在result矩阵中
    flip(image,result,1);//1-表示水平翻转,0-表示垂直翻转,负数表示上下左右同时翻转

    //显示翻转之后的图像

    namedWindow("flip image!");
    imshow("flip image!",image);

    //将翻转之后的图像保存下来
    imwrite("flip.png",result);

    waitKey(0);
    return 0;
}

原始图像

翻转之后的图像

 

参考书:

《数字图像处理》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值