OpenCV 2.4.9在Ubuntu 12.04下的安装 && 移植到ARM上

来源:互联网 发布:海康sadp软件下载 编辑:程序博客网 时间:2024/05/22 14:02

操作系统:Ubuntu_12.04_x64 ,OpenCV版本:2.4.9。考虑到win7上也装了一个2.4.9版本的OpenCV,所以没有选择最新的3.0或2.4.10版本,而是选择安装该版本,这样方便后面出问题调试的时候,排除一些平台相关的问题。

Ubuntu平台上的安装,首先是一些需要的安装包:

• GCC 4.4.x or later. This can be installed with:

    sudo apt-get install build-essential
• CMake 2.6 or higher;
• Git;
• GTK+2.x or higher, including headers (libgtk2.0-dev);
• pkg-config;
• Python 2.6 or later and Numpy 1.5 or later with developer packages (python-dev, python-numpy);
• ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev;
• [optional] libdc1394 2.x;

• [optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev.


然后在官网上下载 OpenCV 2.4.9 for Linux,放在Ubuntu 12.04 中,解压,得到  opencv-2.4.9 的目录,执行:

cd ~/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

安装到 /usr/local 目录下,注意最后的两个 点 .. ,代表opencv源码所在的目录。然后:

make
sudo make install

make的过程中报 " /lib/libbz2.so.1: could not read symbols: File in wrong format" 的错误,查了一下发现是因为我的系统是64位,编译生成的 .so 文件是64位,但需要链接的 /lib/libbz2.so.1是32位的文件, Linking CXX shared library 出问题了。

解决方法:在我的Ubuntu系统中,64位的动态链接库文件在 /lib/x86_64-linux-gnu/ 目录下,需要将该目录下 64位的 libbz2.so 文件加入到编译规则中,cmake的一些变量规则都位于CMakeCache.txt 这个文件中,通过搜索 /lib 找到了 BZIP2_LIBRARIES:FILEPATH 这个变量,将该变量的值由 /lib/libbz2.so.1  改成 /lib/x86_64-linux-gnu/libbz2.so.1 。修改之后重新cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. ,然后继续make即可继续编译。

编译完成install之后OpenCV就成功安装在Ubuntu上了,编写测试源程序,测试成功。(注:如果在eclipse中编写OpenCV,运行时需要修改运行变量 DISPLAY=:0.0)


接下来,就是将OpenCV移植到ARM开发板上。这里使用的ARM开发板芯片为ARM Cortex-A8内核的freescale i.MX535,板子和freescale官方的QSB相似,使用官方的Ubuntu 系统。

在编译之前,需要确定安装了交叉编译器 arm-none-linux-gnueabi- ,以及 cmake-gui 。没有则安装,安装方式网上可查。

使用交叉编译器将OpenCV 编译成能在ARM-Linux 上运行的版本,编译步骤同上面类似,在opencv-2.4.9 目录中创建一个名为 arm 的目录,进入目录,为方便,这里使用cmake-gui。source code的位置我这里为 /home/yang/opencv-2.4.9,build the binaries 选择 /home/yang/opencv-2.4.9/arm ,点击configure 指定Makefiles 时选择 Specify options for cross-compiling ,Next, Operating System: arm-linux(后改成Linux) ,Version: 2.4.9(后改成2.6.35) ,Processor 不填,Compilers C和C++ 分别选择对应的交叉编译器,这个取决于具体交叉编译器的安装路径。Target Root: /opt/gcc-4.4,4-glibc-2.11.1-multilib-1.0。finish。点击 Configure确定没有红框选项出现,将CMAKE_INSTALL_PREFIX变量写入 /home/yang/arm-opencv ,生成的文件会被安装到该目录下,然后点击 Generate 生成 Makefile。

这样,在 arm 目录中可以进行make 编译了。

编译过程中,出现错误: ../../lib/libopencv_core.so: undefined reference to 'pthread_spin_init' 等等几行与 pthread 有关的错误。

解决方法:修改 CMakeCache.txt 文件,找到 CMAKE_EXE_LINKER_FLAGS:STRING=' ' ,把 ' ' 换成 -pthread -lrt ,然后继续make。

出现错误:../../lib/libopencv_ocl.so: undefined reference to 'dlopen' 

                    ../../lib/libopencv_ocl.so: undefined reference to 'dlsym'

解决方法:在编译选项里添加 -ldl ,即Link dl library 。然后继续make,

编译成功!sudo make install ,在 /home/yang/arm-opencv 目录下就会有 bin, include , lib ,share 四个目录以及一个LICENSE 文件。将arm-opencv整个文件目录拷贝到 /usr/local 目录下。

将 arm-opencv/lib/ 下的所有动态链接库文件通过优盘拷贝到 ARM 开发板的 /lib/ 目录下。写了一个测试程序DisplayImage ,用于创建一个窗口并显示图片,使用交叉编译器进行编译,编译命令为: arm-linux-g++ DisplayImage.cpp -o DisplayImage -I/usr/local/arm-opencv/include -L/usr/local/arm-opencv/lib -lopencv_core -lopencv_highgui -lptread -lrt ,结果生成 arm下的32位可执行文件 DisplayImage。将DisplayImage 和 测试图片拷贝到开发板中,执行,输出错误:./DisplayImage: /lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /lib/libopencv_highgui.so) 。

解决方法:/lib/libstdc++ 是标准库,由于该标准库版本较低,所以产生错误。查了一下,我的交叉编译器使用的arm stdc++库是 libstdc++.so.6.0.13 版本,拷贝到开发板的 /lib/ 并建立libstdc++.so.6的软链接依然不行,在Ubuntu主机下使用 strings libstdc++.so.6.0.13 | grep GLIBC 查看,发现只支持到 GLIBCXX_3.4.13 。从网上下载了 arm 版的libstdc++.so.6.0.17 库,拷贝到开发板的 /lib/ 目录中并建立libstdc++.so.6的软链接。

继续执行,输出错误:OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /home/yang/opencv/opencv-2.4.9/modules/highgui/src/window.cpp, line 483
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/yang/opencv/opencv-2.4.9/modules/highgui/src/window.cpp:483: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow

意思是开发板上缺少GTK/QT 这类图形显示功能。所以决定使用Qt进行图形显示。Qt 在ARM开发板上的安装和配置后面单独写一篇文章,本文专注把OpenCV 在ARM上跑起来。OpenCV 中的Mat 是 BGR 格式,要转换成 QImage 的RGB 格式,因此参考了这篇文章 的转换方法。这里需要注意:1. qmake 的时候要在.pro 文件中加入INCLUDES += /usr/local/arm-opencv/include 和 LIBS += -L/usr/local/arm-opencv/lib ; 2. qmake 后生成的Makefile 也需要做相应修改,加入OpenCV的库,在LIBS 变量后加入 -lopencv_core -lopencv_highgui -lopencv_imgproc 等(加入需要的模块),然后进行 make ;3. make后生成的可执行文件和测试图片一起拷贝到开发板中的同一个目录下,然后执行(我的设置可能还有一点问题,执行时程序try 的lib总是去找 ../../lib/ 这个路径,所以必须放在根 / 的二级子目录下)。

最后,贴出源代码和显示效果。

#include <QApplication>#include <QImage>#include <QWidget>#include <QLabel>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace cv;int main(int argc,char **argv){        QApplication app(argc,argv);        QLabel *label = new QLabel(QString("hello qt"));        label->setGeometry(QRect(20,50,150,30));        label->show();        Mat image, rgb;        image = imread( "1.jpg",1);        QImage qimg;        if(image.channels()==3)        {                cvtColor(image,rgb,CV_BGR2RGB);                qimg = QImage((const unsigned char*)(rgb.data),                                rgb.cols,rgb.rows,                                rgb.cols*rgb.channels(),                                QImage::Format_RGB888);        }        else        {                qimg = QImage((const unsigned char*)(image.data),                                image.cols,image.rows,                                image.cols*image.channels(),                                QImage::Format_RGB888);        }        label->setPixmap(QPixmap::fromImage(qimg));        label->resize(label->pixmap()->size());        label->show();        app.exec();}


2 0
原创粉丝点击