Mat类

1、Mat类的输出
Mat image;
输出行数cout<<image.rows<<endl;
输出列数cout<<image.cols<<endl;
输出Mat, cout<<image<<endl;
输出Mat的某一行,一列

cout<<image.row(i)<<endl;
cout<<image.col(i)<<endl;

定义Mat image(240,360,8UC3);无法通过cout<<image.atcv::Vec3b(2,2)[0]<<endl访问(2,2)位置的第0个元素,它会输出对应的char型数据。要想输出整数:
int n=cout<<image.atcv::Vec3b(2,2)[0]<<endl;
cout<<n<<endl;

	Mat image=imread("./1.png");
    cout<<image.type()<<endl;
    int n=image.at<cv::Vec3b>(2,2)[0];
    cout<<image.at<cv::Vec3b>(2,2)[0]<<endl;
    cout<<n<<endl;
    char t=110;
    cout<<t<<endl;

输出:
在这里插入图片描述
16是8UC3类型,110是它这个位置的值,n是110的char型对应输出。
用指针访问元素

Mat image1=(Mat_<int>(2,2)<<1,2,3,4);
    
    
    uchar  *p=image1.ptr<uchar>(0);
    int  *p1=image1.ptr<int>(0);
    
    int a=*(p1+2);
    int b=*(p+1);
    int c=*p;
    cout<<image1<<endl;
    cout<<a<<endl; 
    cout<<b<<endl;
    cout<<c<<endl;

输出:(如果Mat元素是int类,指针也用int,用char不方便)
在这里插入图片描述
如果想用p加一个数,指向下一个元素,要加4,因为uchar每次加1,移动8位,每个int是4*8位,改为:

int b=*(p+4);

这是可以输出b=2.
at()函数
img.at(0,i)=5;img.at(1,2)[0];
Int intensity = img.at(y, x);或Int intensity = img.at(Point(x,y));点的坐标是先宽,后高;图像索引先高,后宽。
Scalar intensity=img.at(y, x);输出是一个数组

uchar green = intensity.val[1];输出可能是乱码
int green1 = intensity.val[1];输出为整数

2、定义Mat
定义Mat时,可以先确定属性,再赋值,或属性赋值一起。
Mat image(240,360,8UC3);240是row的数目,360是col的数目。
Mat image=(Mat_(1,3)<<1,2,3)这是定义1行3列的Mat。
或者Mat image1=Mat_(1,3);用at赋值,image1.at(0,0)=1;
Mat_ img; img=image;
Matlab形式:
Mat mo = Mat::ones(2,2,CV_32F);
Mat image=Mat::eye(3,3,CV_8UC3);
Mat image=Mat::zeros(image1.size(),image1.type());
用数组 uchar a[255]; Mat image(1,256,CV_8UC1,a);
Mat image.creat(4,4,CV_8UC3);
用imread()读入图片,如果路径中有变量。

#include <boost/format.hpp>
 boost::format fmt("./%s/%s/%s%d.%s");
  int i=6;
   Mat a=imread((fmt%"CSDN"%"bikes"%"img"%(i)%"ppm").str());
    imshow("aa",a);
    waitKey(0);

fmt是自己定义的格式变量,每个%s代表imread中的一个字符串,%d对应数字。
3、Mat类型
整型CV_32U、CV_32S,浮点型:CV_32F。
判断Mat类型,cout<<Image.type();
在这里插入图片描述

4、Mat.setTo
Mat& setTo(InputArray value, InputArray mask=noArray());
mask不为0的元素,换为value,为0的元素保留0。
然后赋给mat,mask保持不变。

Mat src3(3, 3, CV_8UC1);
Mat mask3=(Mat_<uchar>(3,3)<<1,2,3,0,3,2,4,0,9);
src3.setTo(100, mask3);
cout << src3 << endl; 
cout << mask3 << endl;

输出:
在这里插入图片描述
没有mask时,默认mask都是非0元素。

Mat src4(3, 3, CV_8UC1);
src4.setTo(100);
cout << src4 << endl;

输出:
在这里插入图片描述
mat有初值

Mat src5=(Mat_<uchar>(3,3)<<1,2,3,0,3,2,4,0,9);
src5.setTo(100);
cout << src5 << endl; 

输出:
在这里插入图片描述
5、Mat成员
https://www.cnblogs.com/justkong/p/7278579.html
https://blog.csdn.net/daaizjh/article/details/81053165
6、Mat.convertTo()
Mat A; A.converTo(B,CV_8U,255,25)
则B(x,y)=A(x,y)*255+25。
7、rect()用法
Mat q1(image, Rect(a, b, x, y));a,b代表起始点坐标a为横向,b为纵向,x,y代表宽(col)和高(row),这种方式,改变q1会改变image。
Rect rect(0, 0, cx, cy); Mat q1 = image(rect);这种方式,改变q1不会改变image。
8、Cv::CV_Assert
Cv::CV_Assert(myImage.depth() == CV_8U);
如果Cv::CV_Assert()括号内的内容为false则报错
9、判断Mat为空

 Mat F;
 if(!F.data){};

10、Mat类截取
Mat image=
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
Mat img=image.rowRange(1,3).colRange(1,3)
img的(0,0)为2,(1,1)为3,即img重新标识元素坐标。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值