安装opensse遇到的问题-----备忘

一、CMakeLists.txt理解

Cmakefile是针对Cmake的,CMake是一个跨平台的软件,在很多平台可以使用。一般在windows下,我们会直接使用VS生成项目,在Linux下面,我们也可以使用QT Creater生成项目,但是两个不同平台上面的项目不能相互移植。这就有了CMake的用武之地,我们可以先编写一个CMakeLists.txt文件,将需要的.h和.cpp文件包含进来,然后在不同的平台使用CMake调用各自的编译器生成各自的工程。

 Makefile是linux下面的文件,对于一个包含很多文件的工程,如果直接编译,那么我们就需要使用一些命令将所有的文件都包括进来。如果我们对其中的一些文件稍做修改,那么我们需要重新输入这些命令。Makefile文件就可以很好的解决这个问题,它将所需要的命令都包含在这个Makefile文件中,然后简单的make一下就完成了所有的步骤。

(1)/usr/local/include

CMakeLists.txt中会写包含路径,如下图

安装opensse遇到的问题-----备忘

打开/usr/local/include/可以看到,里面包含了已安装的软件的共享库(.hpp和.h文件)的路径。

其中.hpp文件是本质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该.hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用project中的cpp文件数与编译次数,也不用再发布lib与dll文件,因此非常适合用来编写公用的开源库。

hpp的优点不少,但是编写中有以下几点要注意:

1、是Header Plus Plus的简写。(.h和.hpp就如同.c和.cpp似的)

2、与.h类似,.hpp是C++程序头文件格式。
3、是VCL专用的头文件,已预编译。
4、是一般模板类的头文件。
5、一般来说,.h里面只有声明,没有实现,而.hpp里声明实现都有,后者可以减少.cpp的数量。
6、.h里面可以有using namespace std,而.hpp里则无。

7、不可包含全局对象和全局函数。

由于.hpp本质上是作为.h被调用者include的,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。(来自:https://blog.****.net/f_zyj/article/details/51735416)

安装opensse遇到的问题-----备忘

打开opencv

安装opensse遇到的问题-----备忘

打开opensse,里面包含了makefilelist.txt文件中引入的路径中的所有库文件(./opensse/sse)

安装opensse遇到的问题-----备忘


(2)usr/local/lib中的文件(.so-------shared object------动态链接库)

有个小典故,usr的并不是user的意思,而是unix system resrouce,这一点有助于理解/usr这个子文件系统。
/usr/bin:几乎所有的系统可执行文件都会安装在这里

/usr/local/bin则是可以存放一些系统用户自己特定的可执行文件,不用担心会被系统升级之类的行为覆盖,破坏,这个目录不是必须的

在ubuntu下,直接通过apt-get安装的软件一般会在/usr下面,自己编译安装的软件(或者通过一些其他的非官方途径)会在/usr/local下面

两个文件夹都是有效的,主要是看路径配的是哪一个

以PATH举例来说,如果/usr/local/bin在前面,就会优先选用里面的对应的文件来执行;当然一般来说/usr/bin是默认在前面,或者干脆默认没有把/usr/local/bin放在路径里

Linux动态链接库.so文件的命名及用途总结:https://blog.****.net/zhanglianpin/article/details/50491958

cmakefilelist.txt中会写包含路径,如下图

安装opensse遇到的问题-----备忘

该文件夹下放的是动态链接库,自己安装的第三方软件的库一般会放在这里

在opensse 运行skechdemo的extract命令时遇到了.so文件的问题,解决方法如下:

(解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file

默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。

  1、首先打开/etc/ld.so.conf文件

  2、加入动态库文件所在的目录:执行vi /etc/ld.so.conf,在"include ld.so.conf.d/*.conf"下方增加"/usr/local/lib"。

  3、保存后,在命令行终端执行/sbin/ldconfig -v;其作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。

https://www.cnblogs.com/codingmengmeng/p/7456539.html)

二、opensse的安装

https://github.com/zddhub/opensse/wiki中给出了安装方法

下面自己来梳理一下:

(1)安装opencv(安装在了/home/alisa/下载/opencv-3.3.0)

(2)安装qt(安装在了/home/alisa/Qt5.6.0)

(以上,就是opensse所需要的环境,前提是安装了gcc和cmake)

(3)安装opensse(注意如果没有权限,使用命令su切换权限)

安装opensse遇到的问题-----备忘

安装成功之后在命令行输入sse即可看到下图,列出sse的六个功能(skech search的六个流程)

安装opensse遇到的问题-----备忘

(4)训练数据

首先需要得到3d模型的各个view的草图,可通过trianglemesh(https://github.com/zddhub/trianglemesh)

安装trianglemesh

安装opensse遇到的问题-----备忘

得到每个模型的102个view的草图

./linedrawing_project.sh -d ~/Database/SHREC12 -p *.off

然后进行训练

安装opensse遇到的问题-----备忘

按照这个流程会得到filelist(扫描rootdir中的所有图片并生成一个filelist)、feature、samples、index_file这几个文件,过程中注意文件的路径。

得到这五个文件后就收集到了所有需要的数据,可以进行测试了

(5)通过GUI进行测试

安装opensse遇到的问题-----备忘