入坑C++(1):与Matlab对比学习

研究生以来,不管是做医学信号处理信号处理还是医学图像处理,都是用Matlab完成的。Matlab作为高校科研教学使用最广泛的软件,使用方便简单,用户不需要理解太多的编程知识,但也不太讲究运算速度,能够精力集中于算法本身,十分有利于科研本身的发展。 但是Matlab一直以来都是受到软件行业的鄙视,说Matlab根本就不能算是编程语言,我本人对此本没有什么意见,毕竟我自己用的开心就好,简单的软件能够完成自己的任务为什么要用复杂的语言呢? 可是最近开始找工作投简历了,很多和图像以及信号相关的岗位,一些“高级”语言能力是必要的,尤其是C/C++和JAVA等。目前我正在做毕业论文,是关于对医学图像的自动分割和分析,实现的工具是利用Matlab。 为了对比实践学习C++,我主要学习C++的图像处理功能,希望在Matlab上实现的毕业论文中图像处理功能都在C++上实现。

我知道在工业界,最常用的图像处理工具不是Matlab,而是OpenCV。 OpenCV是一个开源的函数库,类似与Matlab的图像处理工具箱。Matlab的图像处理工具箱是基于Matlab这个基础执行工具的,虽然两者是被同一公司捆绑在一起发行的。OpenCV则没有支持自己的基本工具,需要依靠第三方的执行工具,比如常用的通用工具Python、C++和Java等。这里提一下,编程语言和执行工具的区别,编程语言就和我们自然语言一样,是由语义和语法构成的,它们对具体语言就行了规范。而执行该语言实现功能的则是执行工具,或者编译工具/编译环境。语言,我们可以写在任何的地方,像记事本、Word等都可以,但是要执行则需要用该语言与之对应的编译工具。拿Matlab来举例,Matlab是脚本语言,其写好的可执行脚本文件也就是.mat文件,只能在Matlab软件(也可称其为环境)中执行。而C++语言写好的可执行文件(.cpp)执行起来则没有那么简单了,首先需要编译成机器可识别的二进制文件(.obj),然后将其和需要用到的库文件一起连接成可执行文件.exe,最后执行该.exe文件,得到最终的结果。这一系列的操作是需要与Matlab软件相仿的执行环境的,比如微软的Visual Studio。对比Matlab理解了C++执行的过程,再回头看看OpenCV,在Matlab中我们要用一些现成的函数(方法、算法),直接传递好输入参数就好了,其实C++也一样,函数具体内容我们不需要理解,只要知道需要传递什么参数就好了。但是C++在使用该函数前需要告诉编译器,该函数的一些信息,也就是声明。

为什么在C++中需要在函数使用前声明呢?对比Matlab来说(这里只是方便理解,可能不是对的),我们在使用一个函数时,Matlab执行时会在当前目录和系统目录中搜索该函数,因为每个函数都是一个单独的.m文件存在,直到找到该函数。而在C++中,因为函数不是单独存在的,其位于一个类中,而相似的类有被包含在一个模块中,而模块最终组成了一个函数库(有些库还有子库),如opencv。下面的例子是要使用imshow这个函数前需要的声明操作:

#include <opencv2/opencv.hpp>

opencv2就是OpenCV第二代的库名,opencv.cpp是其中的一个模块,而函数imhsow就是位于该模块中,所以在使用imshow前必须要告诉编译系统,函数imshow的包含关系,这可能是为了避免C++编译环境到处寻找该函数,提高效率吧。

在使用imshow的函数是,我们需要连在其模块名一起:

cv::imshow();

当然这样用起来很麻烦,每个函数还要加模块名,要是能像Matlab那样直接用该所好啊OK啊,没问题,在使用前再加上一个命名空间声明就行了:

using namespace cv;

我们通过模仿Matlab的使用,大致理解C++怎么去执行和引用已经定义好的函数了。后面就是具体学习每个函数的用法,已经如何建立自己的函数。

    原文作者:秋实华
    原文地址: https://www.jianshu.com/p/3da835fac91a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞