OpenCV的移植

<

div id=”content” contentScore=”7865″>OpenCV 的移植

开源的计算机视觉类库 OpenCV ( Intel Ò Open Source Computer Vision Library )由英特尔公司位于俄罗斯的研究实验室所开发,它是一套可免费获得的由一些 C 函数和 C ++ 类所组成的库,用来实现一些常用的图像处理及计算机视觉算法 ] 。由于 OpenCV 的源代码是完全开放的,而且源代码的编写简洁而又高效,特别是其中大部分的函数都已经过汇编最优化,以使之能高效而充分地利用 Intel 系列处理芯片的设计体系, OpenCV 的代码执行效率是非常高的,所以近年来在国外的图像处理相关领域中被广泛地使用,成为一种流行的图像处理软件。

2.1.1 OpenCV 的特点

相对于其它常用的图像处理软件来说, OpenCV 有其显著的不可比拟的优点,主要体现在如下几个方面[1] :

( 1 ) OpenCV 是一个包含了超过 300 个 C 函数的应用编程接口,它不依赖于外部库,既可以独立运行,也可在运行时使用其它外部库。

( 2 )高性能: OpenCV 中所有的算法都是基于封装于 IPL 的具有很高灵活性的动态数据结构,而且其中有一半以上的函数在设计及汇编时被 Intel 公司针对其所生产的处理器进行了优化。

( 3 )开放性:不管对于商业的还是非商业的用途, OpenCV 都是完全免费的,其源代码完全开放,开发者可以对源代码进行修改,将自己设计的新类添加到库中,只要设计符合规范,自己的代码也可以被别人广泛使用。

(4 )可移植性:由于OpenCV 的大部分库函数基本上采用C 或C++ 语言编写,因此可以方便地移植到其它如ARM 、MPIS 等嵌入式微处理器中。

2.1.2 OpenCV 的函数体系

    OpenCV 中每个函数的命名都以“cv ”开始,然后是该函数的行为及目标。例如用来创建图像的函数“cvCreateImage ”,载入图像的函数“cvLoadImage ”。OpenCV 是为图像处理及计算机视觉在实际工程中的应用而设计的一个类库,其中所有的函数都由于其在实际应用中所实现的不同的功能而分属不同的类型,主要的函数类型有:

(1 )基本的图像处理与分析函数:这个类型的函数主要用于实现一些基本的图像处理与分析功能,例如图像平滑函数cvSmooth ,Sobel 算子cvSobel ,Canny 边缘分割函数cvCanny 等。

(2 )结构分析函数:包括有轮廓处理函数,几何学函数以及平面细分函数。

(3 )运动分析与目标跟踪函数:包括有用于运动分析与目标跟踪的函数,例如背景重建函数cvAcc ,用光流法或动态轮廓模型来实现目标跟踪的函数cvCalcOpticalFlowBM 和cvSnakeImage 以及卡尔曼滤波函数CvKalman 等。

(4 )摄像机标定和3D 重建函数:包括有用于摄像机标定,姿态估计以及从两个摄像机进行3D 相似重构的函数。

(5 )GUI 与视频处理函数:包括有高级图形用户接口highGUI 用以实现对图像的载入、显示及保存等基本操作以及用以实现视频输入输出及处理的函数。

根据上述的函数体系,程序开发者可以根据自己所开发应用程序所要实现的功能来方便地选择所需的库函数,从而大大减少开发时间和精力,缩短程序开发的周期。

2.1.3 OpenCV 移植

    OpenCV 提供了基于MS-Windows 和基于Linux 操作系统的源代码,但这些源码主要都针对PC 机平台,对于ARM 开发平台,OpenCV 并没有作具体的移植介绍,然而如果在嵌入式ARM 平台上利用OpenCV 进行应用开发,则必须对OpenCV 进行交叉编译和移植。

    我们在交叉编译支持嵌入式ARM 的OpenCV 函数库的过程中发现只有在编译OpenCV 的级图形用户接口highGUI 目录的内容时出现系统找不到gtk+-2.0 和gdk-pixbuf-2.0 的pkg-config 脚本错误,通过对OpenCV 的源码和configure 配置文件进行分析,发现OpenCV 源码中除了highGUI 库中的cvShowImage 函数用到了GTK +-2.0 中相关内容,该函数主要完成将图像显示在GTK +窗体上,而configure 配置文件中因找不到GTK 和GDK 的包配置文件pkg-config 的相关内容便将GTK 相关配置选项进行了屏蔽,所以进行交叉编译时无法通过。实际上在嵌入式Qt 开发平台中,基本上不用GTK 中的相关内容,所以可将configure 配置文件中检测GTK 和GDK 的部分注释掉,然后再进行交叉编译便可生成支持嵌入式ARM 微处理器的OpenCV 动态库,具体移植和编译步骤:

( 1 )、配置文件的修改:

       将 configure 文件下列内容注释掉,只保留 GTK_CFLAGS=”” 、 GTK_LIBS=”” 、 have_gtk=no 三项内容(如下黑体所示);

#  if test “$PKG_CONFIG” = “no” ; then

#     echo “*** The pkg-config script could not be found. Make sure it is”

#     echo “*** in your path, or set the PKG_CONFIG environment variable”

#     echo “*** to the full path to pkg-config.”

#     echo “*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config.”

#  else

#     PKG_CONFIG_MIN_VERSION=0.9.0

#     if $PKG_CONFIG –atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then

#        echo “$as_me:$LINENO: checking for \”gtk+-2.0 gdk-pixbuf-2.0\”” >&5

echo $ECHO_N “checking for \”gtk+-2.0 gdk-pixbuf-2.0\”… $ECHO_C” >&6

 

#        if $PKG_CONFIG –exists “”gtk+-2.0 gdk-pixbuf-2.0″” ; then

#            echo “$as_me:$LINENO: result: yes” >&5

#echo “${ECHO_T}yes” >&6

#            succeeded=yes

 

#            echo “$as_me:$LINENO: checking GTK_CFLAGS” >&5

#echo $ECHO_N “checking GTK_CFLAGS… $ECHO_C” >&6

#            GTK_CFLAGS=$PKG_CONFIG --cflags ""gtk+-2.0 gdk-pixbuf-2.0""

#            echo “$as_me:$LINENO: result: $GTK_CFLAGS” >&5

#echo “${ECHO_T}$GTK_CFLAGS” >&6

#            echo “$as_me:$LINENO: checking GTK_LIBS” >&5

#echo $ECHO_N “checking GTK_LIBS… $ECHO_C” >&6

#            GTK_LIBS=$PKG_CONFIG --libs ""gtk+-2.0 gdk-pixbuf-2.0""

#            echo “$as_me:$LINENO: result: $GTK_LIBS” >&5

#echo “${ECHO_T}$GTK_LIBS” >&6

#        else

            GTK_CFLAGS=””

            GTK_LIBS=””

            ## If we have a custom action on failure, don’t print errors, but

            ## do set a variable so people can do so.

#            GTK_PKG_ERRORS=$PKG_CONFIG --errors-to-stdout --print-errors ""gtk+-2.0 gdk-pixbuf-2.0""

#        fi

#     else

#        echo “*** Your version of pkg-config is too old. You need version #$PKG_CONFIG_MIN_VERSION or newer.”

#        echo “*** See http://www.freedesktop.org/software/pkgconfig

#     fi

#  fi

 

#  if test $succeeded = yes; then

#     have_gtk=yes

 

#cat >>confdefs.h <<_ACEOF

##define HAVE_GTK

#_ACEOF

 

#  else

      have_gtk=no

#  fi

( 2 )、交叉编译

[root@opencv-0.9.7]$./configure -–host=arm-linux

[root@opencv-0.9.7]$make

[root@opencv-0.9.7]$make install

       执行 make install 命令后, OpenCV 将编译好的的库文件保存在 /usr/local/lib 目录下。主要的库文件: libhighgui.so.0.9.7 、 libhighgui.la 、 libcxcore.so.0.9.7 、 libcxcore.la 、 libcvaux.so.0.9.7 、 libcvaux.la 、 libcv.so.0.9.7 、 libcv.la 及相应的符号链接

( 3 )、环境境参数设置

       将编译好的库文件和相应的符号链接下载到 ARM 开发平台上 /usr/qpe/lib 目录中,并利用 export 设置 OpenCV 工作时所需的环境参数 LD_LIBRARY_PATH 。

下载opencv-0.9.7的网址是http://surfnet.dl.sourceforge.net/sourceforge/opencvlibrary/opencv-0.9.7.tar.gz

<a href=”http