前言:读完了Multiple View Geometry的第九章和第十章,想着用程序实现下相机恢复和场景重建,上一篇博客已经实现了对相机的恢复,在场景重建编程时无奈发现C++学的并不好,只好翻出来压仓多年的C++ Primer Plus,大家跟我一起复习吧。
我参考的程序是Mastering OpenCV这本书的第四章例程Structure from Motion的代码,推荐做SLAM的小白也看一下这本书的这一章节。
在运行这个例程时遇到几个问题我都写在之前的一个博客里了,如果大家也遇到了类似的报错可以参考一下:http://blog.youkuaiyun.com/fk1174/article/details/51786700,跑通之后就是开始研读源代码了,然后就是一堆诸如此类的。。。
class MultiCameraPnP : public MultiCameraDistance
{
std::vector<CloudPoint> pointcloud_beforeBA;
std::vector<cv::Vec3b> pointCloudRGB_beforeBA;
public:
MultiCameraPnP(const std::vector<cv::Mat>& imgs_,const std::vector<std::string>& imgs_names_,const std::string& imgs_path_):MultiCameraDistance(imgs_,imgs_names_,imgs_path_) {}
...
...
...
}
作为原来大学学VB的我来说并不是很容易看懂的,在翻开C++这本书前我就给自己提出了两个问题:
1,和类MultiCameraPnP名称一样的成员函数是做什么的?
2,定义类的时候冒号后面怎么还有一坨东西?class MultiCameraPnP : public MultiCameraDistance
有了需求再翻开书看是一件不会让人轻易睡着的事情。
对于C++里面为什么要引入类的概念想必大家都应经听了很多了,这是面向编程最大的特点,我的理解是它是一个对一类东西通用的数据块单元,里面包含了这一类东西所共有的属性,和操作这些属性值的接口,在说类的public和private部分之前我们要有一个概念,虽然平时我们写小程序所有代码都是自己写的,但是当代码工程量很大时就不是一个人写了,这时候就有了代码分工,我们把类设计者和类使用者分开,就有了public和private的概念,比如我是老大,我写的代码负责定义类,我手上有几个小弟负责使用我的类去进一步实现别的功能,那么我肯定不能让我的小弟们随便修改类里面的全部东西,所以有了private的存在,而我得设计出一系列公有接口让小弟们调用,他们才可以通过这些接口修改类里面的某个值。
类成员包括数据成员和成员函数,他们都可以放在public或者private中声明,一般数据放在私有以满足隐藏数据需要,函数一般放在公有以调用,但是也有放在私有的函数比如好几个成员函数都调用了一个外部并不需要的函数,比如下面的set_tot():
void Stock::acquire(const std::string & co, long n, double pr)
{
company = co;
if (n < 0)
{