通过近一周的时候终于成功交叉编译opencv成功了,真心不容易。有一句话乃真理也,凡事贵在坚持。过程总是痛苦的,因为不懂得很多问题但是又需要面对很多问题,最大的收获就是耐心解决所有问题后就懂得这些了。

1.为什么要交叉编译opencv?

之前比较天真,以为在Ubuntu上安装好opencv后,如果gcc通过编译,那么就直接arm-linux-g++嘛,事实证明我真的很天真。

之所以要交叉编译opencv,是因为在编译的时候,gcc和arm-linux-gcc所需要调用的库是不一样的,尽管名字是一样的。至于为什么,我猜应该是编译出来的可执行文件是在不同环境下运行的,所以编译的时候要链接的库当然不能是一样的。

2.为什么选择opencv2.3.1

说实话挺艰辛的,从opencv2.4.10到opencv2.4.9再到opencv1.0,这三个版本都未能成功交叉编译,后来只好继续尝试,终于在第四个版本opencv2.3.1成功了。贵在坚持。

一、开发环境

宿主机Ubuntu12.04

交叉编译器:arm-linux-gcc4.5.1(友善之臂)

cmake-2.8.7-Linux-i386.sh

二、编译opencv

1.解压

解压opencv2.3.1到任意目录下,我的压缩包本来放在/home/ljy-linux/下,直接解压

#tar jxvf OpenCV-2.3.1a.tar.bz

2.进入源目录并修改

为什么要修改,因为安装的时候会出错所以直接先修改了

修改OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h文件第63行的源码:将absl()修改为abs()

#cd OpenCV-2.3.1/modules/flann/include/opencv2/flann/

#vi dist.h

修改完之后保存

3.运行cmake-gui

运行之前先建两个目录

#cd /usr/local

#mkdir arm

#mkdir opencv-arm

目录arm用来安装opencv,opencv-arm则作为交叉编译的工作目录

#cmake-gui

选择源代码目录:/home/ljy-linux/OpenCV-2.3.1

选择Build目录:/usr/local/opencv-arm/

点击Configure,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next
Operating System填写arm-inux
C Compilers填写/usr/local/arm/FriendlyARM/4.5.1/bin/arm-linux-gcc
C++ Compilers填写/usr/local/arm/ FriendlyARM/4.5.1/bin/arm-linux-g++
程序库的Target Root填写/usr/local/arm/ FriendlyARM/4.5.1/,然后点击Finish

修改默认配置,默认安装目录为/usr/local,把CMAKE_INSTALL_PREFIX变量改为/usr/local/arm/
去掉WITH_TIFF(如果不需要的话一定要勾选掉)

再次点击Configure

然后点击Generate生成Makefile

4.编译和安装

编译之前,修改一下CMakeCache.txt。

#cd  /usr/local/opencv-arm

#vi CMakeCache.txt

CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt

开始编译

#make

完全编译完成后安装

#make install

5. 写个简单的测试程序,打开摄像头并创建一个窗口显示

// test.cpp

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

int main()

{

CvCapture* capture = NULL;

IplImage* frame = NULL;

if( !(capture = cvCaptureFromCAM(-1)))

{

fprintf(stderr, "Can not open camera./n");

return -1;

}

cvNamedWindow("video", 1);

while(frame = cvQueryFrame( capture ) )

{

cvShowImage("video", frame);

}

cvDestroyWindow("video");

cvReleaseCapture(&capture);

return 0;

}

6.编译连接测试程序

arm-linux-g++ -I /usr/local/arm/include/opencv/ -L /usr/local/arm/lib//libopencv_imgproc.so -L /usr/local/arm/lib//libopencv_core.so -L /usr/local/arm/lib//libopencv_flann.so  -L /usr/local/arm/lib//libopencv_highgui.so  -L /usr/local/arm/lib//libopencv_ml.so -lpthread -lrt -o test test.cpp

似乎有些警告,先忽略了。

7.放到arm上运行

  放到板上运行之前要先把之前编译好的库文件放到板子上面。

  原本是在板子上面创建同样的路径,后来发现运行不了,提示找不到库文件,后来想想直接把lib下的所有.so文件放到了根目录的/lib下,再次运行,成功了。

  类似的,应该只要把编译好的库文件一起放在arm板上的系统库文件中就可以了。

8.成功只是一半的

  运行是成功的,编译好了的库也被成功调用了,但是arm板提示说缺少界面的创建,大概就是这个意思,所以还需要一些界面来打开窗口等等,可以使用qt等。因为友善之臂arm板的界面是用qt写的,所以接下来学习一下qt的编程然后加上OpenCv再在arm板上打开摄像头并显示出来。

Ubuntu下移植OpenCv的更多相关文章

  1. Ubuntu 下安装opencv 编译后执行找不到库

    在ubuntu下编译opencv程序后,执行报下面到错误:error while loading shared libraries: libopencv_core.so.2.4: cannot ope ...

  2. [OpenCV][ARM9下移植OpenCV]

    [OpenCV][ARM9下移植OpenCV]   安装环境 宿主机: Red Hat Enterprise Linux Server 6.3 开发板: mini2440 相关软件: cmake-3. ...

  3. [学习OpenCV攻略][017][ARM9下移植OpenCV]

    安装环境 宿主机: Red Hat Enterprise Linux Server 6.3 开发板: mini2440 相关软件: cmake-3.5.1.tar.gz.OpenCV-2.3.1a.t ...

  4. ubuntu下安装opencv 2.4.9 脚本,支持摄像头和cuda

    arch=$(uname -m) if [ "$arch" == "i686" -o "$arch" == "i386" ...

  5. ubuntu下安装opencv库+Python2.7环境安装及开发摄像头拍照应用

    好久没有更新了,今天更一篇最近遇到的问题,及解决办法,后面博客得继续写起来 安装 #使用Python下的lib库直接进行安装 apt-get install python-opencv 测试 #使用如 ...

  6. ubuntu下使用opencv问题以及解决方案

    CMakeFiles/hw5_1_node.dir/computeORB.o: In function `cv::String::~String()':/usr/local/include/openc ...

  7. 在ubuntu下安装opencv

    每次学习一个新的东西,最让气恼的也许就是库,软件之类的东西了把.本来以为再ubuntu虚拟机上照着网上的教程一步步做肯定一下子就弄好了,结果发现好多教程都有好多的坑,有些地方他们少一步你也不知道,有些 ...

  8. CAFFE(二):Ubuntu 下安装OpenCv 3.4.1

    一步:进入OpenCv官网 选择 3.4.1 版本的 source , 下载 opencv-3.4.1.zip ,如下图选择Sources下载 解压缩到home目录.并执行如下代码: { cd ~/o ...

  9. ubuntu下安装配置OpenCV

    Cmake的安装 我用的是ubuntu-software自动下载安装的. Ubuntu 下安装 OpenCV 首先下载安装相关包,然后下载OpenCV 系统:ubuntu16.04 OpenCV:2. ...

随机推荐

  1. android 各种xml资源的引用方式

    更多资源类型 本页定义了其它一些具体的资源类型,包括: Bool 存放布尔值的XML资源. Color 存放颜色值的XML资源(十六进制颜色). Dimension 存放数量值的XML资源(带计量单位 ...

  2. java 的面向对象

    1.java是什么语言: java也属于面向对象编程语言. 2.面向对象的三大特性: 封装 ,继承, 多态. 3.什么是对象: 对象是真实存在的唯一失误. 面向对象的英文是(oop),面向对象的编程思 ...

  3. Numpy Python

    如果一个数组太长,则NumPy自动省略中间部分而只打印两端的数据: 可通过设置printoptions参数来禁用NumPy的这种行为并强制打印整个数组. set_printoptions(thresh ...

  4. 【转】+【举例】ArcGIS中的坐标系统定义与投影转换

    背景知识: UTM (Universal Transverse Mercator)坐标系是由美国军方在1947提出的.虽然我们仍然将其看作与"高斯-克吕格"相似的坐标系统,但实际上 ...

  5. 微软2016校园招聘4月在线笔试 A FontSize

    题目链接:http://hihocoder.com/problemset/problem/1288 分析:题目中所求的是最大的FontSize(记为S),其应该满足P*[W/S]*[H/S] > ...

  6. 1、Linux驱动重要的数据结构

    1.struct file 这个结构体定义在  linuxsource/include/linux/fs.h 中第960行左右 具体成员如下: struct file { /* * fu_list b ...

  7. HTML5.dcloud.io-stream-app

    dcloud.io提出的Stream App 本文仅仅是关于dcloud.io提出的SteamApp初探,所有内容请参考其官网. 1. Application promotion by scaning ...

  8. Android框架之AndroidAnnotations基础

    一:开源网址 https://github.com/excilys/androidannotations/wiki 二:AndroidAnnotation特点 (1)依赖注入 可以注入 views, ...

  9. vios 多 vlan设置

    [转 ]测试后修正 成功让IVM跑了多个VLAN,添加一块可携带多个vlanID的网卡,Nativevlan是改造的折中方法,如果不喜欢这种方法,附---删除多vlan网卡方法,一般情况下,lpar的 ...

  10. 02-Swift初体验

    Playground是什么? 从Xcode6开始出现(Swift开始出现) 翻译为:操场/游乐场 对于学习Swift基本语法非常方便 所见即所得(快速查看结果) 语法特性发生改变时,可以快速查看. S ...