Opencv3编程入门第四章--Opencv 数据结构与基本绘图

基础图像容器 Mat

Mat优点及注意事项

  • Mat优点
    – 不用手动开辟空间
    – 不需要手动释放空间

要点1. Mat = 矩阵头+一个指向存储所有像素值的矩阵

要点2. 拷贝构造函数只复制信息头和矩阵指针,而不复制矩阵,即赋值运算符和拷贝构造函数(构造函数)只复制信息头,例【Mat B(A) or C = A】

要点3. 使用函数clone()或者copyTo()来复制一个图像的矩阵【深拷贝】

像素值的存储方式

  1. RGB【显示屏】
  2. HSV/HLS 【对光照不敏感】
  3. YCrCb 【JPEG】
  4. CIE Lab 【用来度量2个颜色的距离】

显式创建Mat对象方法

  1. 使用Mat()构造函数
Mat M(2,2,CV_8UC3, Scalar(0,0,0255))
输出:
[  0,   0, 255,   0,   0, 255;
 0,   0, 255,   0,   0, 255]

tips: CV_[位数][带符号与否][类型前缀]C[通道数]

  1. 在C/C++中通过构造函数进行初始化
int sz[3] = {2,2,2};
Mat L(3,sz,CV_8UC,Scalar::all(0));
  1. 利用Create()函数
M.create(4,4,CV_8UC(2));
cout<<"M="<<endl<<" "<< M << endl << endl;

该方法不能为矩阵设置初值,知识在盖面尺寸是重新为矩阵数据开辟内存而已。

  1. 对小矩阵使用逗号分隔式初始化函数
Mat C = (Mat_<double>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
cout << "C=" << endl << " " << endl << endl
  1. 为已存在的对象创建信息头
Mat RowClone = C.row(1).clone();
count << "RowClone = " << endl << "" << RowClone << endl << endl;

Opencv格式化输出方法

int main()
{
	Mat M(10, 3, CV_8UC3);
	randu(M, Scalar::all(0), Scalar::all(255));//随机
	cout << "r(Opencv默认风格)=" << M << ";" << endl << endl;
	waitKey(0);
	return 0;
}
输出:
r(Opencv默认风格)=[ 91,   2,  79, 179,  52, 205, 236,   8, 181;
 239,  26, 248, 207, 218,  45, 183, 158, 101;
 102,  18, 118,  68, 210, 139, 198, 207, 211;
 181, 162, 197, 191, 196,  40,   7, 243, 230;
  45,   6,  48, 173, 242, 125, 175,  90,  63;
  90,  22, 112, 221, 167, 224, 113, 208, 123;
 214,  35, 229,   6, 143, 138,  98,  81, 118;
 187, 167, 140, 218, 178,  23,  43, 133, 154;
 150,  76, 101,   8,  38, 238,  84,  47,   7;
 117, 246, 163, 237,  69, 129,  60, 101,  41];

输出其他常用数据结构

  1. 定义和输出二维点
Point2f p(6,2);
cout << p << ";\n" << endl;  // [6,2]
  1. 定义和输出三维点
Point3f p3f(8,2,0);
cout << p3f << ";\n" << endl; 
  1. 定义和输出基于Mat的std::vector
vector<float> v;
v.push_back(3);
v.push_back(4);
cout <<Mat(v) << ";\n" << endl; 

4.定义和输出std::vector点

vector<Point2f> points(20);
for (size_t i = 0; i < points.size(); ++i)
	points[i] = Point2f((float)(i*5),(float)(i%7));
cout <<points ;	

常用数据结构和函数

  1. 点的表示
Point point
point.x = 10;
point.y = 8;
  1. 颜色的表示:Scalar类
    Scalar(a,b,c)
  2. 尺寸的表示:Size类
    Size(5,5);
  3. Rect类
    contains(Point)判断点是否在矩阵内;
    inside(Rect)判断矩阵是否在该矩阵内;
    tl()返回左上角点坐标;
    br()返回右下角坐标;
  4. 颜色空间转换:cvtColor()函数
cvtColor(src,dst,CV_RGB2GRAY);
//将输入图像的RGB颜色通道转为GRAY,然后将GRAY形式的图像传给dst;

6.基本图形的绘制
【ToDo】待整理
基本图形的绘制.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值