赞
踩
- double vals[4] = {1,2,3,4};
- Matx22d m(vals);
Mat C =(Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
- 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
- Mat canvas1=imread("canvas1.jpg");
- Mat canvas2(canvas1.size(), CV_8UC3, Scalar(120,250,0));
如果第三个参数是Scalar(20,20,20),也可以写成Scalar::all(20)
- 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)赋初值
在作为类的成员变量时,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;
- }
假设自己写了个类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;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。