Opencv Mat 数据类型
程序员文章站
2022-05-16 11:23:25
...
Opencv Mat 数据类型
Mat类型其本质只是一片数据域的指针,当进行复制操作时,并不会新复制一片数据,而只是创建一个新的指针指向原数据域。
CV_{8U,16S,16U,32S,32F,64F}C{1,2,3}:数据类型和通道数
Mat 构造函数
Constructor | Description |
---|---|
cv::Mat; | 默认构造器 |
cv::Mat( int rows, int cols, int type ); | 指定行列和类型 |
cv::Mat( int rows, int cols, int type, const Scalar& s ); |
指定行列和类型并初始化数值 |
cv::Mat( int rows, int cols, int type, void* data, size_t step=AUTO_STEP ); |
指定行列和类型并加载数据初始化 |
cv::Mat( cv::Size sz, int type ); | 使用Size指定行列和类型 |
cv::Mat( cv::Size sz, int type, const Scalar& s ); |
使用Size指定行列和类型并初始化数值 |
cv::Mat( cv::Size sz, int type, void* data, size_t step=AUTO_STEP ); |
使用Size指定行列和类型并加载数据初始化 |
cv::Mat( int ndims, const int* sizes, int type ); |
指定多维矩阵 |
cv::Mat( int ndims, const int* sizes, int type, const Scalar& s ); |
指定多维矩阵并初始化 |
cv::Mat( int ndims, const int* sizes, int type, void* data, size_t step=AUTO_STEP ); |
指定多维矩阵并加载数据初始化 |
范例程序
cv::Mat m;
// Create data area for 3 rows and 10 columns of 3-channel 32-bit floats
m.create( 3, 10, CV_32FC3 );
// Set the values in the 1st channel to 1.0, the 2nd to 0.0, and the 3rd to 1.0
m.setTo( cv::Scalar( 1.0f, 0.0f, 1.0f ) );
cv::Mat m( 3, 10, CV_32FC3, cv::Scalar( 1.0f, 0.0f, 1.0f ) );
通过另一个矩阵来构造
Constructor | Description |
---|---|
cv::Mat( const Mat& mat ); | Copy constructor |
cv::Mat( const Mat& mat, const cv::Range& rows, const cv::Range& cols ); |
Copy constructor that copies only a subset of rows and columns |
cv::Mat( const Mat& mat, const cv::Rect& roi ); |
Copy constructor that copies only a subset of rows and columns specified by a region of interest |
cv::Mat( const Mat& mat, const cv::Range* ranges ); |
Generalized region of interest copy constructor that uses an array of ranges to select from an n-dimensional array |
cv::Mat( const cv::MatExpr& expr ); | Copy constructor that initializes m with the result of an algebraic expression of other matrices |
cv::Mat( const CvMat* old, bool copyData=false ); |
Constructor for a new object m that creates m from an oldstyle CvMat, with optional data copy |
cv::Mat( const IplImage* old, bool copyData=false ); |
Constructor for a new object m that creates m from an oldstyle IplImage, with optional data copy |
模板构造函数
Constructor | Description |
---|---|
cv::Mat( const cv::Vec<T,n>& vec, bool copyData=true ); |
Construct a one-dimensional array of type T and size n from a cv::Vec of the same type |
cv::Mat( const cv::Matx<T,m,n>& vec, bool copyData=true ); |
Construct a two-dimensional array of type T and size m × n from a cv::Matx of the same type |
cv::Mat( const std::vector<T>& vec, bool copyData=true ); |
Construct a one-dimensional array of type T from an STL vector containing elements of the same type |
静态函数
Function | Description |
---|---|
cv::Mat::zeros( rows, cols, type ); | Create a cv::Mat of size rows × cols, which is full of zeros, with type type (CV_32F, etc.) |
cv::Mat::ones( rows, cols, type ); | Create a cv::Mat of size rows × cols, which is full of ones, with type type (CV_32F, etc.) |
cv::Mat::eye( rows, cols, type ); | Create a cv::Mat of size rows × cols, which is an identity matrix, with type type (CV_32F, etc.) |
元素访问 at<>
Example | Description |
---|---|
M.at<int>( i ); | Element i from integer array M |
M.at<float>( i, j ); | Element ( i, j ) from float array M |
M.at<int>( pt ); | Element at location (pt.x, pt.y) in integer matrix M |
M.at<float>( i, j, k ); | Element at location ( i, j, k ) in three-dimensional float array M |
M.at<uchar>( idx ); | Element at n-dimensional location indicated by idx[] in array M of unsigned characters |
通过 Iterator(MatConstIterator 或者 MatIterator)访问数据
int sz[3] = { 4, 4, 4 };
cv::Mat m( 3, sz, CV_32FC3 ); // A three-dimensional array of size 4-by-4-by-4
cv::randu( m, -1.0f, 1.0f ); // fill with random numbers from -1.0 to 1.0
float max = 0.0f; // minimum possible value of L2 norm
cv::MatConstIterator<cv::Vec3f> it = m.begin();
while( it != m.end() ) {
len2 = (*it)[0]*(*it)[0]+(*it)[1]*(*it)[1]+(*it)[2]*(*it)[2];
if( len2 > max ) max = len2;
it++;
}
NAryMatIterator
const int n_mat_size = 5;
const int n_mat_sz[] = { n_mat_size, n_mat_size, n_mat_size };
cv::Mat n_mat0( 3, n_mat_sz, CV_32FC1 );
cv::Mat n_mat1( 3, n_mat_sz, CV_32FC1 );
cv::RNG rng;
rng.fill( n_mat0, cv::RNG::UNIFORM, 0.f, 1.f );
rng.fill( n_mat1, cv::RNG::UNIFORM, 0.f, 1.f );
const cv::Mat* arrays[] = { &n_mat0, &n_mat1, 0 };
cv::Mat my_planes[2];
cv::NAryMatIterator it( arrays, my_planes );
float s = 0.f; // Total sum over all planes in both arrays
int n = 0; // Total number of planes
for( int p = 0; p < it.nplanes; p++, ++it ) {
s += cv::sum(it.planes[0])[0];
s += cv::sum(it.planes[1])[0];
n++;
}
/////////// compute dst[*] = pow(src1[*], src2[*]) //////////////
const Mat* arrays[] = { src1, src2, dst, 0 };
float* ptrs[3];
NAryMatIterator it(arrays, (uchar**)ptrs);
for( size_t i = 0; i < it.nplanes; i++, ++it )
{
for( size_t j = 0; j < it.size; j++ )
{
ptrs[2][j] = std::pow(ptrs[0][j], ptrs[1][j]);
}
}
访问成块元素
Example | Description |
---|---|
m.row( i ); | Array corresponding to row i of m |
m.col( j ); | Array corresponding to column j of m |
m.rowRange( i0, i1 ); | Array corresponding to rows i0 through i1-1 of matrix m |
m.rowRange( cv::Range( i0, i1 ) ); | Array corresponding to rows i0 through i1-1 of matrix m |
m.colRange( j0, j1 ); | Array corresponding to columns j0 through j1-1 of matrix m |
m.colRange( cv::Range( j0, j1 ) ); | Array corresponding to columns j0 through j1-1 of matrix m |
m.diag( d ); | Array corresponding to the d-offset diagonal of matrix m |
m( cv::Range(i0,i1), cv::Range(j0,j1) ); | Array corresponding to the subrectangle of matrix m with one corner at i0, j0 and the opposite corner at (i1-1, j1-1) |
m( cv::Rect(i0,i1,w,h) ); | Array corresponding to the subrectangle of matrix m with one corner at i0, j0 and the opposite corner at (i0+w-1, j0+h-1) |
m( ranges ); | Array extracted from m corresponding to the subvolume that is the intersection of the ranges given by ranges[0]- ranges[ndim-1] |
代数运算
Example | Description |
---|---|
m0 + m1, m0 – m1; | Addition or subtraction of matrices |
m0 + s; m0 – s; s + m0, s – m1; | Addition or subtraction between a matrix and a singleton |
-m0; | Negation of a matrix |
s * m0; m0 * s; | Scaling of a matrix by a singleton |
m0.mul( m1 ); m0/m1; | Per element multiplication of m0 and m1, per-element division of m0 by m1 |
m0 * m1; | Matrix multiplication of m0 and m1 |
m0.inv( method ); | Matrix inversion of m0 (default value of method is DECOMP_LU) |
m0.t(); | Matrix transpose of m0 (no copy is done) |
m0>m1; m0>=m1; m0==m1; m0<=m1; m0<m1; | Per element comparison, returns uchar matrix with elements 0 or 255 |
m0&m1; m0|m1; m0^m1; ~m0; m0&s; s&m0; m0|s; s|m0; m0^s; s^m0; |
Bitwise logical operators between matrices or matrix and a singleton |
min(m0,m1); max(m0,m1); min(m0,s); min(s,m0); max(m0,s); max(s,m0); |
Per element minimum and maximum between two matrices or a matrix and a singleton |
cv::abs( m0 ); | Per element absolute value of m0 |
m0.cross( m1 ); m0.dot( m1 ); | Vector cross and dot product (vector cross product is defined only for 3 × 1 matrices) |
cv::Mat::eye( Nr, Nc, type ); cv::Mat::zeros( Nr, Nc, type ); cv::Mat::ones( Nr, Nc, type ); |
Class static matrix initializers that return fixed Nr × Nc matrices of type type |
其他操作
Example | Description |
---|---|
m1 = m0.clone(); | Make a complete copy of m0, copying all data elements as well; cloned array will be continuous |
m0.copyTo( m1 ); | Copy contents of m0 onto m1, reallocating m1 if necessary (equivalent to m1=m0.clone()) |
m0.copyTo( m1, mask ); | Same as m0.copyTo(m1), except only entries indicated in the array mask are copied |
m0.convertTo( m1, type, scale, offset ); |
Convert elements of m0 to type (e.g., CV_32F) and write to m1 after scaling by scale (default 1.0) and adding offset (default 0.0) |
m0.assignTo( m1, type ); | Internal use only (resembles convertTo) |
m0.setTo( s, mask ); | Set all entries in m0 to singleton value s; if mask is present, set only those values corresponding to nonzero elements in mask |
m0.reshape( chan, rows ); | Changes effective shape of a two-dimensional matrix; chan or rows may be zero, which implies “no change”; data is not copied |
m0.push_back( s ); | Extend an m × 1 matrix and insert the singleton s at the end |
m0.push_back( m1 ); | Extend an m × n by k rows and copy m1 into those rows; m1 must be k × n |
m0.pop_back( n ); | Remove n rows from the end of an m × n (default value of n is 1) |
m0.locateROI( size, offset ); | Write whole size of m0 to cv::Size size; if m0 is a “view” of a larger matrix, write location of starting corner to Point& offset |
m0.adjustROI( t, b, l, r ); | Increase the size of a view by t pixels above, b pixels below, l pixels to the left, and r pixels to the right |
m0.total(); | Compute the total number of array elements (does not include channels) |
m0.isContinuous(); | Return true only if the rows in m0 are packed without space between them in memory |
m0.elemSize(); | Return the size of the elements of m0 in bytes (e.g., a three-channel float matrix would return 12 bytes) |
m0.elemSize1(); | Return the size of the subelements of m0 in bytes (e.g., a three-channel float matrix would return 4 bytes) |
m0.type(); | Return a valid type identifier for the elements of m0 (e.g., CV_32FC3) |
m0.depth(); | Return a valid type identifier for the individial channels of m0 (e.g., CV_32F) |
m0.channels(); | Return the number of channels in the elements of m0 |
m0.size(); | Return the size of the m0 as a cv::Size object |
m0.empty(); | Return true only if the array has no elements (i.e., m0.total==0 or m0.data==NULL |