OpenCV固定矩阵类Matx、矩阵类Mat初始化方法汇总

1,Matx初始化方法

1.1 用数组初始化

double vals[4] = {1,2,3,4};
Matx22d m(vals);

2,Mat初始化方法

2.1 直接赋值初始化

Mat C =(Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);

2.2 通过数组初始化

int a[3][3] = { 0, -1, 0,-1, 5, -1, 0, -1, 0};
Mat C(3,3,CV_32S,a);     //type不能错!int对应CV_32S,float对应CV_32F,double对应CV_64F

复杂点,可以通过3维数组构造多通道的浮点Mat:

int main()
{
    // 创建一个3行4列2通道的float数组
    float afTest[3][4][2] = { {{1.11,1.12},{1.21,1.22},{1.31,1.32},{1.41,1.42}},    
                              {{2.11,2.12},{2.21,2.22},{2.31,2.32},{2.41,2.42}},
                              {{3.11,3.12},{3.21,3.22},{3.31,3.32},{3.41,3.42}} };

    float fA = afTest[1][3][0];             // 索引第1行第3列的0通道
    Mat mA(3, 4, CV_32FC2, afTest);         // 数组转化为2通道的float型Mat
    float fB = mA.at<Vec2f>(1, 3)[0];       // 索引Mat第1行第3列的0通道
    return 1;
}

运行结果:fA和fB都是2.41

注意:用数组构造Mat时是用的数组的指针!所以如果后面更改了Mat中的值,数组的值也会跟着改变!

mA.at<Vec2f>(1, 3)=Vec2f(9,10);        
cout<<afTest[1][3][0]<<endl;            // 会得到9

mA.at<Vec2f>(1,3)[0]=11;
cout<<afTest[1][3][0]<<endl;            // 会得到11

2.3 读图初始化、用另一个Mat的尺寸初始化

Mat canvas1=imread("canvas1.jpg");
Mat canvas2(canvas1.size(), CV_8UC3, Scalar(120,250,0));

如果第三个参数是Scalar(20,20,20),也可以写成Scalar::all(20)

2.4 指定尺寸的初始化

int Height=1024;
int Width=1280;
Mat a(Height,Width,CV_8UC1,Scalar(155));

或者用create函数(不能赋初值,不推荐)

Mat a;
a.create( Height, Width, CV_8UC1);    //不推荐,不能在后面加Scalar(140)赋初值

2.5 先声明尺寸、类型后赋值

在作为类的成员变量时,Mat必须在成员变量中声明,于是size和type分别是默认的(0, 0)和CV_8UC1。

所以初始化不得不在其他地方,可以这样:

class CGun
{
public:
    Mat m_mPic;
    void Showpic();
};

void CGun::ShoWpic()
{
    m_mPic=Mat(3,3,CV_32F,Scalar(0));
    cout<<"m_Pic:"<<m_mPic<<endl;
}

2.6 先声明,再用const unsigned char*初始化

假设自己写了个类CMyClass,在头文件中声明了成员cv::Mat m_mInputImg,可用这样的成员函数赋值:

// 给CMyClass成员cv::Mat m_mInputImg赋值
bool CMyClass::GetImg(int iW, int iH, int iCh, const unsigned char* auImgData)
{
    // 如果通道数为1
    if (1==iCh)
    {
        m_mInputImg = Mat(iH, iW, CV_8UC1);
        memcpy(m_mInputImg.data, auImgData, iH * iW);
        return true;
    }
    // 如果通道数为3
    else if (3 == iCh)
    {
        m_mInputImg = Mat(iH, iW, CV_8UC3);
        memcpy(m_mInputImg.data, auImgData, iH * iW * 3);
        cvtColor(m_mInputImg, m_mInputImg, COLOR_BGR2GRAY);
        return true;
    }
    else
    {
        return false;
    }
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值