Ubuntu下移植OpenCv
通过近一周的时候终于成功交叉编译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的更多相关文章
- Ubuntu 下安装opencv 编译后执行找不到库
在ubuntu下编译opencv程序后,执行报下面到错误:error while loading shared libraries: libopencv_core.so.2.4: cannot ope ...
- [OpenCV][ARM9下移植OpenCV]
[OpenCV][ARM9下移植OpenCV] 安装环境 宿主机: Red Hat Enterprise Linux Server 6.3 开发板: mini2440 相关软件: cmake-3. ...
- [学习OpenCV攻略][017][ARM9下移植OpenCV]
安装环境 宿主机: Red Hat Enterprise Linux Server 6.3 开发板: mini2440 相关软件: cmake-3.5.1.tar.gz.OpenCV-2.3.1a.t ...
- ubuntu下安装opencv 2.4.9 脚本,支持摄像头和cuda
arch=$(uname -m) if [ "$arch" == "i686" -o "$arch" == "i386" ...
- ubuntu下安装opencv库+Python2.7环境安装及开发摄像头拍照应用
好久没有更新了,今天更一篇最近遇到的问题,及解决办法,后面博客得继续写起来 安装 #使用Python下的lib库直接进行安装 apt-get install python-opencv 测试 #使用如 ...
- ubuntu下使用opencv问题以及解决方案
CMakeFiles/hw5_1_node.dir/computeORB.o: In function `cv::String::~String()':/usr/local/include/openc ...
- 在ubuntu下安装opencv
每次学习一个新的东西,最让气恼的也许就是库,软件之类的东西了把.本来以为再ubuntu虚拟机上照着网上的教程一步步做肯定一下子就弄好了,结果发现好多教程都有好多的坑,有些地方他们少一步你也不知道,有些 ...
- CAFFE(二):Ubuntu 下安装OpenCv 3.4.1
一步:进入OpenCv官网 选择 3.4.1 版本的 source , 下载 opencv-3.4.1.zip ,如下图选择Sources下载 解压缩到home目录.并执行如下代码: { cd ~/o ...
- ubuntu下安装配置OpenCV
Cmake的安装 我用的是ubuntu-software自动下载安装的. Ubuntu 下安装 OpenCV 首先下载安装相关包,然后下载OpenCV 系统:ubuntu16.04 OpenCV:2. ...
随机推荐
- 笔记007:对象——RegExp正则表达式对象
1.RegExp 一个用于匹配的模式文本 用0个或多个修饰符描述的匹配模式细节 RegExp对象的创建形式 用内建构造器创建 var re = new RegExp("j.*t&quo ...
- 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识
驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...
- thinkphp 动态验证码
<?php namespace Home\Controller; use Think\Controller; class TestController extends Controller { ...
- 使用Carthage管理iOS依赖库
Carthage安装和使用和CocoaPods类似: 1.安装: 终端执行以下命令: $ brew update $ brew install carthage 查看Carthage的版本号: $ c ...
- 批量执行SQL语句,进行删除,插入或者更改。
private bool ExecuteTransaction(List<string> list) { using (SqlConnection connection = new Sql ...
- oracle函数应用
----Oracle中的函数 oracle中函数的分类: --第一种:日期函数 --第二种: 字符函数 --第三种: 数学函数 --第四种: 转换函数 --第五种: 分析函数 ------------ ...
- opencv单目摄像机标定(一)
#include <string> #include <iostream> #include <cv.h> #include <highgui.h> u ...
- intellij,eclipse,vs2013快捷键
如何跳转到上一次编辑的位置,即如何跳到上一个光标所在的位置? intellij: Command+Alt+左方向键:上一光标的位置 Command+Alt+右方向键:下一光标的位置 定位到最后编辑位置 ...
- 用SQLMAP工具进行SQL注入
1.检查注入点 [注入点需要自己寻找,可以利用一些工具,例如:Acunetix Web Vulnerability scanner (WVS),AppScan等]u表示URL. sqlmap - ...
- Python:socket
Socket:又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket()函数 Pyt ...