@
目錄
- 1.全零矩陣
- 2.全一矩陣
- 3.單位矩陣
- 4.矩陣轉置
- 5.求逆矩陣
- 6.逗號式分隔建立矩陣
- 7.矩陣定義(只列出常用的)
- 7.1 資料型別Scalar
- 8.透過ptr與at函式遍歷矩陣
- 8.1 Vec型別
- 9.透過迭代器遍歷矩陣(easy but very very slow)
1.全零矩陣
CV_NODISCARD_STD static MatExpr Mat::zeros(int rows, int cols, int type);
CV_NODISCARD_STD static MatExpr Mat::zeros(Size size, int type);
CV_NODISCARD_STD static MatExpr Mat::zeros(int ndims, const int* sz, int type);
//not recommended
- 引數如下
引數 | 含義 |
---|---|
rows | 行數 |
cols | 列數 |
type | 資料型別(CV_16F) |
size | Size(寬(列數),高(行數)) |
- Size與Mat中的成員函式.size()的返回值,有相同的資料型別,是[寬*高]。
- Mat中的成員變數.size,與以上二者不同,是 rows*cols
2.全一矩陣
CV_NODISCARD_STD static MatExpr Mat::ones(int rows, int cols, int type);
CV_NODISCARD_STD static MatExpr Mat::ones(Size size, int type);
CV_NODISCARD_STD static MatExpr Mat::ones(int ndims, const int* sz, int type);
//not recommended
- 引數如下
引數 | 含義 |
---|---|
rows | 行數 |
cols | 列數 |
type | 資料型別(CV_16F) |
size | Size(寬(列數),高(行數)) |
3.單位矩陣
CV_NODISCARD_STD static MatExpr Mat::eye(int rows, int cols, int type);
CV_NODISCARD_STD static MatExpr Mat::eye(Size size, int type);
- 引數如下
引數 | 含義 |
---|---|
rows | 行數 |
cols | 列數 |
type | 資料型別(CV_16F) |
size | Size(寬(列數),高(行數)) |
4.矩陣轉置
MatExpr Mat::t() const;
5.求逆矩陣
MatExpr Mat::inv(int method=DECOMP_LU) const;
6.逗號式分隔建立矩陣
- 常用於自定義卷積核
template<typename _Tp> inline
Mat_<_Tp>::Mat_(int _rows, int _cols)
: Mat(_rows, _cols, traits::Type<_Tp>::value)
{
}
template<typename _Tp> inline
Mat_<_Tp>::Mat_(int _rows, int _cols, const _Tp& value)
: Mat(_rows, _cols, traits::Type<_Tp>::value)
{
*this = value;
}
template<typename _Tp> inline
Mat_<_Tp>::Mat_(Size _sz)
: Mat(_sz.height, _sz.width, traits::Type<_Tp>::value)
{}
template<typename _Tp> inline
Mat_<_Tp>::Mat_(Size _sz, const _Tp& value)
: Mat(_sz.height, _sz.width, traits::Type<_Tp>::value)
{
*this = value;
}
- 以下為使用例項,注意括號的位置
Mat a=(Mat_<int>(2,2)<<1,2,3,4);
Mat b=(Mat_<double>(Size(2,2))<<1,2,3,4);
注意 :給出的資料型別必須是基本資料型別,如int,double。不能是CV_16F等。
7.矩陣定義(只列出常用的)
Mat::Mat() CV_NOEXCEPT;
Mat::Mat(int rows, int cols, int type);
Mat::Mat(Size size, int type);
Mat::Mat(int rows, int cols, int type, const Scalar& s);
Mat::Mat(Size size, int type, const Scalar& s);
Mat::Mat(const std::vector<int>& sizes, int type);
Mat::Mat(const std::vector<int>& sizes, int type, const Scalar& s);
Mat::Mat(const Mat& m);
void Mat::create(int rows, int cols, int type);
void Mat::create(Size size, int type);
void Mat::create(const std::vector<int>& sizes, int type);
- 引數如下
引數 | 含義 |
---|---|
rows | 行數 |
cols | 列數 |
type | 資料型別(CV_16F) |
size | Size(寬(列數),高(行數)) |
7.1 資料型別Scalar
- Scalar(gray)
- Scalar(blue,green,red)
8.透過ptr與at函式遍歷矩陣
8.1 Vec型別
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<ushort, 4> Vec4w;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<int, 6> Vec6i;
typedef Vec<int, 8> Vec8i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
- 以下為例項
Mat a(Size(2560,1440),CV_8UC3);
for(int i=0;i<a.rows;i++){
for(int j=0;j<a.cols;j++){
a.ptr(i,j)[0]=0;
a.ptr(i,j)[1]=0;
a.ptr(i,j)[2]=255;
}
}
for(int i=0;i<a.rows;i++){
for(int j=0;j<a.cols;j++){
a.ptr<Vec3b>(i,j)[0]=0;
a.ptr<Vec3b>(i,j)[1]=0;
a.ptr<Vec3b>(i,j)[2]=255;
}
}
for(int i=0;i<a.rows;i++){
for(int j=0;j<a.cols;j++){
a.at<Vec3b>(i,j)[0]=0;
a.at<Vec3b>(i,j)[1]=0;
a.at<Vec3b>(i,j)[2]=255;
}
}
- 用ptr訪問可以不加Vec型別,ptr訪問是最快的
- 用at訪問必須加Vec型別,at訪問比ptr略微慢一些
9.透過迭代器遍歷矩陣(easy but very very slow)
Mat a(Size(2560,1440),CV_8UC3);
for(auto iter=a.begin<Vec3b>();iter!=a.end<Vec3b>();iter++){
iter[0]=255;
iter[1]=0;
iter[2]=0;
}
本文由部落格一文多發平臺 OpenWrite 釋出!