论计算机图形学算法数学原理及C++实现(2)

    说到计算机图形处理,首选工具为opencv(免费,开源,成熟项目,提供多种语言接口)。以下将统一使用opencv开发语言C++作为程序语言。C++ 的opencv说难也难,说容易也容易。如果读者熟悉C++精髓之模板类、模板函数、函数重载、继承等知识点,学习opencv本身会像学习STL那么容易并且很多两者间互相通用或者极其相似。话说回来,为了更加详细地跟大家讨论算法细节,我会花些篇幅介绍opencv的一些基本知识,在介绍的同时也就会讨论算法本身。

    先来说说opencv里面的一些基本数据结构吧。 

  1. C语言基本数据结构(类如 int,float,double等等)
  2. 标准模板库里定义的数据类型(如opencv大量使用的vector)
  3. opencv自定义的抽象数据类型或者结构体(如 Vec,Matx等)  

    前两种就不详说了,不懂的翻查C++ primer。让我们主要纠结第三种,这也是本节重点。

    其实opencv自定义的数据结构基本都是向量和矩阵,向量又是矩阵的一个特殊子类,无非是只有一列的矩阵,但仍然有很大的意义专门介绍一下向量。下面我们从最基本的Matx开始,然后看各种向量类是如何继承Matx类的。

    Matx类是opencv自定义的矩阵类,用来保存矩阵的各种信息,其更是一种模板类,所以使我们可以自定义类的数据类型。Matx类有如下初始形式:

   

    比如要建立一个元素为浮点的3X3矩阵,可以Matx<float,3,3> mat来初始。

    Vec类继承自Matx类,如上面所说,是只有一列的Matx类。初始形式为:

    初始一个3维空间的向量,Vec<double,3> vec

    Scalar类又继承于Vec类,就是 Vector<double,4>。在opencv里,我们经常用Scalar向量标注像素颜色,如Scalar(255,0,0)代表纯红色(注意Scalar是有4个元素的,其中有一个透明度没有写出来,是因为大多数情况默认为不透明)。如果你觉得默认的Scalar数据类型不想是double想是int,也可以自己重载,重载方式为Scalar_<int>,以此类推。

   Point_类、Size_类和Rect_类很相似但既不继承于Matx类,也不互相继承。Point_类其实就是代表图上的一个二维点,x,y两个属性存放在类中的public中 所以可以直接point.x和point.y直接引用。Size_代表一个方形的高和宽,也存放于public属性中,也可以直接size.width和size.height直接引用。Rect_类实际是Point_类和Size_类的组合,代表一个方形,x和y代表方形左上角的坐标,width和height代表方形的宽和高以此定义一个方形。三类均可以自己定义初始与Scalar_类类似。

   opencv中最贴心的设计就是很多常用的模板初始已经定义好了,如Point2的预定义就是“”typedef Point_<double> Point2d”,可以直接使用。

  总结一下几种数据结构,其实Vec和Matx类在实际编程中并不常用,更常用的是Mat类。因为Vec和Matx在数据量小的情况下得到了优化,如果数据量大了,比如一张图片,那使用Mat会是更正确的选择。

    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值