ubuntu下Scilab SIVP的安装

来源:互联网 发布:java compare 编辑:程序博客网 时间:2024/06/14 08:06

1, 概述

SIVP是国内团队在SCILAB上做的视频处理函数的扩展。网上有很多链接,不过我发现下面这个好像有最新的更新:

https://atoms.scilab.org/toolboxes/SIVP

对于SIVP,我浅薄的感觉是它好像是主要在Windows上开发的。在Linux系统上的维护好像并不好。而我就是要在Ubuntu上运行scilab+SIP+SIVP。所以只好花了些时间看看SIVP在我Ubuntu上怎么运转起来。先粗略介绍一下情况:

-         在上面链接中,能够得到0.5.3.2的版本。似乎在我Ubuntu上也能够编译过去,但是很快就发现它运行还是有问题。

-         从其它网站上下载的老一点的版本,0.5.3,经过仔细对比后,发现0.5.3.2在代码上变化不大,只是为Linux下编译做了些改变。但是带来的后果是0.5.3.2包变得很大,而且最后用下来没有达到傻瓜式的效果。既然我要自己来重新编译,那么我还是认为0.5.3的版本比较干净,编译环境配置文件也写的比较干净,所以下面的工作就基于0.5.3(老一点的版本)来进行。

 

在细节展开前,再说一下目前对SIVP这个项目的一点闲话:

-         这是个开源项目,这个我喜欢。不过当我想为它捐点零钱的时候,发现捐钱通道好像只有国外通道,很不方便。这真让人遗憾。有人想给钱都这么不方便,也反映出中国开源社区的现状。最后钱还是没有能够给出去。

-         SIVP这个项目的代码有些老了,更新很不活跃。它用到的opencv的函数,在我的opencv2.4.8中都已经淘汰不可用了。直接导致我最后在代码中删除了一个输出函数。另外,它和scilab接口的形式也即将被scilab淘汰。Scilab声明在6.0.0版本中将不支持这种老的接口。所以如果SIVP没有再进行维护更新的话,很可能会面临被淘汰的情况。

-         顺便评论一下对0.5.3.2的看法。在这个最新版本中,作者似乎想把SIVP的运行库都打包在一起,这样就不用依赖PC上的运行库了。这种方法出发点是不错,只是作者好像没做彻底。导致在我的环境下反正是少东西。如果强行用我PC上的东西把缺口补上,实际运行时候就会出现错误。

 

2, 编译

好,闲话说完,进入正题。我的系统配置是:

Ubuntu14.04+opencv2.4.8+scilab5.5.1。至于其它的编译环境,我很难一一列出了。反正如果少了啥,就用sudoapt-get install去安装吧。如果你不知道该安装什么,建议可以用apt-file search去看看缺少的东西关联的包都有哪些,然后选一个最靠谱的安装吧。顺便说一下,我的opencv2.4.8是自己编译安装的,所以安装在/user/local/目录下,如果你是用apt-get直接安装的话,路径可能会有些不一样。下面阅读的时候注意一下。

 

依照说明,把sivp包放到scilab5.5.1/share/scilab/contrib目录下。然后在scilab环境中运行builder.sce。如果一切顺利,那就可以直接跳转到启动部分了(别高兴太早,启动还是有玄机。如果你用0.5.3.2,那很可能你编译是没有问题,但是你启动时候就麻烦大了。)下面我描述一下在0.5.3上,我遇到的问题:

 

问题一:编译器抱怨<list>库找不到。

这是opencv编译时候常见的问题。根源在于c/c++的冲突。你编译的软件用的是老式的opencvC接口。而新的opencv2虽然维护了老的C接口库和头文件,但是有些太老的东西,就被抛弃了。这个太老的东西就是#include <cvaux.h>。它已经老到在opencv2.4.8中,已经没有为它维护的对应的C版本的库和lib了。

解决方法:在sivp/sci_gateway/c/common.h中,直接把#include <cvaux.h>给注释掉。这样带来的后果是,后面有一个文件detectforeground.c会编译不过了。不过这也没啥大不了,因为这个文件/函数用到的CvBGStatModel太老了,以至于新的opencv中都找不到它了。暂时就委屈一下,把它忽略吧,如果后面遇到一定要这个文件提供的功能,自己再用新的opencv函数重新写一下,然后替换掉,重新编译吧。

不建议的解决方法:默认的编译器是gcc。如果用g++编译基于copencv文件的话,的确会省很多事情,避免很多错误。于是你可以尝试在sivp/sci_gateway/c/builder_gateway_c.sce文件中,修改tbx_build_gateway函数如下:

tbx_build_gateway("sivp"        , ..

                   inter_names   , ..

                   inter_files   , ..

                   curr_path     , ..

                   opencv_libs   , ..

                   inter_ldflags , ..

                   inter_cflags, "","g++" );

这样svip就会用g++来编译。这样看上这个问题是没有了,但是在后面会遇到更大的麻烦:

-     g++gccC语言的语法检查和容忍不一样,等到编译最后自动生成的libsivp.c的时候,会出现g++的语法错误;

-         你用g++编译出来的库,很可能无法和用gcc编译出来的scilab, sip兼容。于是你又有更多的工作要做,去补上这个缺口。

当然,如果是你自己单独的项目,统一用g++来编译,那是没有什么问题的。

 

问题二 stack-h.c过时警告。

这个没办法。scilab准备要修改接口了,咱们就凑合用吧。解决办法就是在CFLAG上加上-D__USE_DEPRECATED_STACK_FUNCTION__。这个在错误报告里有。添加的地方就是sivp/sci_gateway/c/builder_gateway_c.sce中。注意添加的位置,我们应该在linuxopencv2的选项中。另外我吧-DOPENCV_V2给注释掉了,我发现这个没啥用。当然,你留着也无碍。我还加了-std=c99。建议加上,只是告诉编译器遵循的语法定义规则:

inter_cflags = " -std=c99-D__USE_DEPRECATED_STACK_FUNCTIONS__ "; //"-DOPENCV_V2 ";

 

问题三:有些语法告警,你可能要在cflags里面加-Wno-write-strings来避免。我记得可能我用了-std=c99后,这些告警就没有了。反正告警都好办,忽略就是了。它提示你加什么,你就加什么。

 

问题四:CvBGStatModel这个定义找不到了。在2.4.8中已经没有了。而detectforeground.c中大量使用了它,所以只好在builder_gateway_c.sce中,把这个函数相关的部分注释掉(2个地方,一个是输出函数,一个是文件名。Scilab中注释可以用//)。反正就少一个功能。如果后果严重,那也没有办法,只能用新的opencv库中的函数,重写这个文件。

 

问题五:还有几个零散的问题,说是opencv函数的参数不够。这是opencv新老库的变化。网上查看一下函数定义,把默认参数补上就好了。这种情况不多,好像只有23个地方。

 

3, 启动

终于编译通过。但是发现,在工具条直接启动sivp时候,还是出错。这是因为sivp/etc/sivp.start的问题。这个启动文件中,它要去找相关的库去加载。我们要修改它。

首先要知道我们编译出来的libsivp.so都需要哪些库。前面编译完成后,在/sivp/sci_gateway/c目录下,由libsivp.so文件。用:

readelf -a libsivp.so | grep "Shared"

去看看它都需要动态链接哪些库。然后找到这些库的位置,从新更改link部分的命令。在我的系统中,如下:

   link("/usr/local/lib/libopencv_core.so.2.4");

   link("/usr/local/lib/libopencv_highgui.so.2.4");

    link("/usr/local/lib/libopencv_imgproc.so.2.4");

   link("/usr/local/lib/libopencv_objdetect.so.2.4");

   link("/usr/local/lib/libopencv_video.so.2.4");

   link("/lib/x86_64-linux-gnu/libm.so.6");

   link("/lib/x86_64-linux-gnu/libc.so.6");

 

然后再回到工具条,启动sivp,终于好用了。尝试了一下imresize,能工作了。

 

0 0