Mat_类型
方法 | 描述 | 示例 |
---|---|---|
Mat | 数据类型 | Mat mat(3000, 4000, CV_8UC3);//行、列、元素大小字节数 |
mat.data | 图像数据 | QImage img(mat.data, src.cols, src.rows, QImage::Format_RGB888); |
rows | 数据行 | mat.rows //数据行,可代表高度 |
cols | 数据列 | mat.cols //数据列,可代表宽度 |
elemSize | 元素大小字节数 | mat.elemSize(); |
step | 表示行数据长度(单位是字节数) | mat.step; //确定了mat如何去换行。(mat每一行内是连续的,只是行结束地址不定) |
create() | 先定义了mat,后面确定行、列等参数后使用creat | mat.create(3000, 4000, CV_8UC3); //如果mat原来有空间则会被释放 |
确保像素值在0-255之间:
QT使用Mat类型
QT默认是不支持Mat类型作为信号槽的,需要注册,如下是方法。
// 注册
qRegisterMetaType<cv::Mat>("cv::Mat"); //信号槽传递的参数,QT默认不支持cv::Mat。采用此种方式注册。<cv::Mat>是类型,"cv::Mat"是名字
//使用例程
QObject::connect(XVideoThread::Get(), //哪个对象发出
SIGNAL(ViewImage1(cv::Mat)), //发出的信号。
ui.cameraShow,
SLOT(SetImage(cv::Mat))
);
mat之深拷贝、浅拷贝理解
cv::Mat a; //创建一个名为a的矩阵头
a = cv::imread(“test.jpg”); //向a中赋值图像数据,矩阵指针指向像素数据。默认读的格式为BGR
cv::Mat b=a; //复制矩阵头,并命名为b(浅复制)。当删除a变量时,b变量并不会指向一个空数据,只有当两个变量都删除后,才会释放矩阵数据。因为矩阵头中引用次数标记了引用某个矩阵数据的次数,只有当矩阵数据引用次数为0的时候才会释放矩阵数据。采用引用次数来释放存储内容是C++中常见的方式,用这种方式可以避免仍有某个变量引用数据时将这个数据删除造成程序崩溃的问题,同时极大的缩减了程序运行时所占用的内存。
1.Mat类型遍历与赋值
1)拷贝赋值
浅层拷贝:Mat B=A;B就是浅层拷贝A,B只拷贝了A的的头部和地址,当B被操作后A也随之改变。
深层拷贝:Mat A=imread("x.jpg"); Mat B=A.clone();B是开辟了新的内存完全的复制了A的内容,操作B不会对A造成影响。
src1.copyTo(des); //不能用des = src1 (浅复制),这样做会导致des改变的时候src1(原图)也改变了。
//注意:浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)
Mat aa;
Mat ba = aa; //aa “copy” to ba
Mat ca(aa); //aa “copy” to ca
//注意:深拷贝
Mat aa;
Mat ba = aa.clone( ); //aa copy to ba
Mat ca;
aa.copyTo( ca ); //aa copy to ca
2)将数据类型为U16的dataU16赋值给数据类型为u8的dataU8(数据类型转换).
Mat dataU16 = Mat(Size(w, h), CV_16UC1);
Mat dataU8 = Mat(Size(w, h), CV_8UC1);
U16* pxvecU16 = dataU16.ptr<U16>(0);
U8* pxvecU8 = dataU8.ptr<U8>(0);
for (int i = 0; i < dataU16.rows; i++)
{
pxvecU16 = dataU16.ptr < U16>(i);
pxvecU8 = dataU8.ptr<U8>(i);
for (int j = 0; j < dataU16.cols; j++)
{
pxvecU8[j] = (U8)pxvecU16[j];
}
}
mat之构造函数
非常好的参考教程0-Mat类介绍
非常好的参考教程1-Mat类构造与赋值
1.常规1
cv::Mat::Mat( int rows, int cols, int type)
rows:构造矩阵的行数 (高度)
cols:矩阵的列数 (宽度)
cv::Mat M(480,640,CV_8UC3); 表示定义了一个480行,640列的矩阵,矩阵的每个单元的由三个(C3:3 Channel)8位无符号整形(unsigned char 8, U8)构成。表示的是三通道,是彩色图像。
2.常规