Opencv Mat的三种常用类型简介
本系列文章由 @YhL_Leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/47683127
本文主要介绍Opencv常用的三种Mat类型:Mat,Mat_,Matx。
1. Mat
1.1 创建与初始化
int rows = 3, cols = 1;
cv::Size size(cols, rows);
/* first method */
cv::Mat myMat( rows, cols, CV_8UC1, cv::Scalar(0) );
cv::Mat myMat = cv::Mat( rows, cols, CV_8UC1, cv::Scalar(0) );
cv::Mat myMat( size, CV_8UC1, cv::Scalar(0) );
cv::Mat myMat( cv::Size(cols, rows), CV_8UC1, cv::Scalar(0) );
/* second method */
cv::Mat myMat2;
myMat = cv::Mat( rows, cols, CV_8UC1 );
// initial with other mat or data
myMat.copyTo(myMat2); // initial with mat
cv::Point3i pts( 1, 2, 3 );
myMat2 = cv::Mat(pts, true); // initial with other data
注意:
使用
Mat::Mat(int rows, int cols, int type, const Scalar& s)和Mat::Mat(Size size, int type, const Scalar& s)函数进行Mat初始化的时候,一定要注意Size行列存放顺序是(col, row)或者是(width, height);Mat的type种类非常多,可以创建普通的CV_8UC1, ... , CV_64FC41-4通道的矩阵,也可以创建更高通道的矩阵CV_8UC(n), ... , CV_64FC(n),其中最大可以达到CV_CN_MAX通道,Opencv 2.4.11版本中#define CV_CN_MAX 512;创建多通道
Mat时,例如CV_8UC3,使用cv::Scalar(0, 0,0)或myMat.setTo(cv::Scalar(0)),其中后者通用于任意通道;使用其他
Mat拷贝初始化的时候,void Mat::copyTo(OutputArray m) const函数会首先调用m.create(this->size(), this->type())所以会对输入的m进行重新创建(包括size和type),然后进行数据拷贝。m.copyTo(m)也是允许的,没有任何问题。
1.2 数据访问
这里只列举出常用三种方法:
1.指针数组的方式
cv::Mat image = cv::imread( "E:\\test.JPG", CV_LOAD_IMAGE_GRAYSCALE );
const int rows = image.rows;
const int cols = image.cols;
uchar* data = (uchar*)image.data;
for ( int i=0; i<rows; i++ )
{
for ( int j=0; j<cols; j++ )
{
int index = i*cols + j;
data[index] = 0;
/*
if color one:
data[index * 3 + 0] = 0;
data[index * 3 + 1] = 0;
data[index * 3 + 2] = 0;
*/
}
}
/*
// also can be used as follow:
for ( int i=0; i<rows; i++ )
{
uchar* data = (uchar*)image.data + i*cols;
for ( int j=0; j<cols; j++ )
{
*data++ = 0;
}
}
}
*/
// cv::imwrite( "E:\\test2.JPG", image );
2..ptr的方式
/* .ptr with [] */
for ( int i=0; i<rows; i++ )
{
uchar *data = image.ptr<uchar>( i );
for ( int j=0; j<cols; j++ )
{
data[j] = 0;
/*
if color one:
data[j*3 + 0] = 0;
data[j*3 + 1] = 0;
data[j*3 + 2] = 0;
*/
}
}
/* .ptr with pointer */
for ( int i=0; i<rows; i++ )
{
uchar *data = image.ptr<uchar>( i );
for ( int j=0; j<cols*image; j++ )
{
*data++ = 0;
}
}
3..at的方式
for ( int i=0; i<rows; i++ )
{
for ( int j=0; j<cols; j++ )
{
image.at<uchar>(i, j)= 0; // also can be: image.at<uchar>( cv::Point(j, i) ) = 0;
/*
if color one:
image.at<uchar>( i, j*3 + 0 ) = 0;
image.at<uchar>( i, j*3 + 1 ) = 0;
image.at<uchar>( i, j*3 + 2 ) = 0;
*/
}
}
三种方法速度上有一定差异,感兴趣的可以自己测试一下~
2. Mat_
Mat_继承于Mat,相比于Mat没有增加任何数据段,但增加了一些更加便捷的功能,表达上也更加精简。
2.1 创建与初始化
/* first method */
cv::Mat_<double> myMat_ = ( cv::Mat_<double>(3, 3) <<
1.0, 2.0, 3.0,
4.0, 5.0, 6.0,
7.0, 8.0, 9.0);
cv::Mat_<double> myMat_ = cv::Mat_<double>::zeros(3, 3); // others: eyes, diag, ones
/* second method */
cv::Mat_<double> myMat_(3, 1, 0.0);
// -> cv::Mat image(3, 1, CV_64FC1, cv::Scalar(0.0));
// create a 100x100 color image and fill it with green(in RGB space)
cv::Mat_<cv::Vec3b> image( 100, 100, cv::Vec3b(0, 255, 0) );
/* third method */
cv::Mat myMat( 100, 100, CV_64F1, cv::Scalar(0) );
cv::Mat_<double>& myMat_ = (cv::Mat_<double>&)myMat;
注意:
使用
( cv::Mat_<double>(row, col) << ...) )形式创建并初始化的时候,最外面的( )不能省略;使用第二种通过
Mat指针或者引用的方式创建与初始化Mat_时,两者的数据类型一定要一致,不然程序虽然编译没问题,但运行就会BUG~
2.2 数据访问
/*
Note that Mat::at<_Tp>(int y, int x) and
Mat_<_Tp>::operator ()(int y, int x) do
absolutely the same and run at the same speed
*/
int rows = myMat_.rows;
int cols = myMat_.cols;
/* first method */
for ( int i=0; i<rows; i++ )
{
for ( int j=0; j<cols; j++ )
{
std::cout << myMat_(i, j) << std::endl;
}
}
// for multi-channel images/matrices:
for ( int i = 0; i < rows; i++ )
{
for( int j = 0; j < cols; j++ )
{
// scramble the 2nd (red) channel of each pixel
image(i, j)[2] ^= (uchar)(i ^ j); // ^: exclusive or operation
}
}
/* second method */
int matCount = rows * cols;
for ( int idx=0; idx < matCount; idx++ )
{
std::cout << myMat_(idx) <<std::endl;
}
3. Matx
Matx主要用于大小、数据类型(浮点型)已知的小矩阵(最大不超过6x6),包括:Matx12f, ... , Matx66f和Matx12d, ... , Matx66d。
创建与初始化都很简单,不做过多介绍:
cv::Matx31d myMatx( 1.0, 2.0, 3.0 );
cv::Matx33d myMatx2 = cv::Matx33d( 0.0, 0.0, 0.0 );
最后,关于Mat的运算(加,减,乘,求逆,转置,均值,标准差…)三种类型基本差异不大,在文档中也容易找到~
参考文档:http://www.docs.opencv.org/modules/core/doc/basic_structures.html?highlight=mat
Opencv Mat的三种常用类型简介的更多相关文章
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- C++ Opencv Mat类型使用的几个注意事项及自写函数实现Laplace图像锐化
为了提升自己对Opencv中Mat数据类型的熟悉和掌握程度,自己尝试着写了一下Laplace图像锐化函数,一路坎坷,踩坑不断.现将代码分享如下: #include <opencv2/opencv ...
- OpenCv Mat操作总结
Author:: Maddock Date: 2015-03-23 16:33:49 转载请注明出处:http://blog.csdn.net/adong76/article/details/4053 ...
- OpenCV——Mat,IplImage,CvMat类型转换
Mat,cvMat和IplImage这三种类型都可以代表和显示图像,三者区别如下 Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化. 而CvMat和IplImage类型更侧 ...
- OpenCV Mat数据类型及位数总结(转载)
OpenCV Mat数据类型及位数总结(转载) 前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量, ...
- Qt QImage与OpenCV Mat转换
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51029382 应一个朋友的要求,整理总 ...
- <学习opencv>图像和大型阵列类型
OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...
- Matlab to OpenCV Mat
convert Matlab matrix to OpenCV Mat. Support CV_32FC3 only currently. The Code int matlab2opencv(cv: ...
- python——动态类型简介
动态类型简介 类型属于对象,而不是变量 每一个对象都有两个标准的头部信息:类型标志符和引用计数器. 对象的垃圾收集,就是通过引用计数器实现的.可以在脚本中任意使用对象而不需要考虑释放内存空间. 循环饮 ...
随机推荐
- 【学习】JMS通信模式
1.关于JMS的点对点模式 JMS的点对点模式下,多个消费者可以注册到同一个队列上,但是生产者的某个消息只能被一个消费者接收,在多个消费者间,生产者的消息被多个消费者循环接收,如当前有6个消息在队列中 ...
- windows连接投影仪后桌面画面和白板画面不一致
windows连接投影仪后桌面画面和白板画面不一致: 一. windows 搜索: 投影仪 选择相应的效果:
- ActiveMQ学习笔记(16)----Message Dispatch高级特性(二)
1. Optimized Acknowledgetment ActiveMQ缺省支持批量确认消息,由于批量确认会提高性能,如果希望在应用程序中禁止经过优化的确认方式,可以采用以下几种方式: 1. 在C ...
- JDOM,dom4j方式解析XML
<?xml version="1.0" encoding="UTF-8"?> <dataSources> <!-- 定义MySQL ...
- 第三方库requests
requests库 # 1.记得安装 第三方 模块 requests # pip install requests import requests url = 'http://www.baidu.co ...
- 手把手教你如何新建scrapy爬虫框架的第一个项目(下)
前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章页为例进行说明. 在我们创建好Scrap ...
- 模块-时间模块(new)
模块-时间模块 导入: import time 方法: _STRUCT_TM_ITEMS __doc__ __loader__ __name__ __package__ __spec__ altzon ...
- React显示文件夹中SVG
import React from 'react'; import _ from 'lodash'; import styles from './iconPicker.less'; const req ...
- Linux CentOs6.5误卸载自带python和yum后的解决办法
事故背景:前几天因项目需要,在服务器上搭建python-mysql模块,结果没安装好,于是乎想卸载重装,遂在网上查询卸载python的方法,结果一不小心直接把系统的python删了个干净....... ...
- 关于Subversion主从备份方式的调整(全量、增量脚本)更新
本文引用于http://blog.chinaunix.net/uid-25266990-id-3369172.html 之前对Subversion服务器作了迁移,关于SVN的架构也走了调整,有单一的服 ...