opencv-3.4.1-arm编译安装 -- 超详细
相关链接:
opencv-3.4.1-x86编译安装 – 超详细
opencv-3.4.1-arm编译安装
- 环境
- 1.安装依赖库
- 2.OpenCV源码获取并解压
- 2.1 获取源码
- 2.2 工作目录准备
- 3.交叉编译OpenCV
- 3.1 cmake-gui生成makefile
- 3.2 make&&make install 及可能遇到的问题
- 3.2.1 **`问题1`**
- 3.2.2 **`问题2`**
- 4.交叉编译OpenCV_contrib
- 4.1 修改cmake-gui 生成Makefile
- 4.2 编译安装make && make install
- 4.2.1 `问题3`:
- 4.2.2 `问题4`:
- 5.测试--QT使用cv开启摄像头
- 5.1 创建qt工程
- 5.2 准备工作
- 5.3 编写代码 && build
- 5.4 ubuntu与开发板准备
- 5.4.1 摄像头接入开发板,测试
- 5.4.2 配置ip -- 开发板-ubuntu互连
- 5.4.3 搭建nfs服务器,开发板访问工作目录
- 5.4.4 添加cv动态库路径
- 5.5 开发板运行qt程序
- 5.6 开发板运行测试程序可能遇到的问题
- 5.6.1 `问题5`:
- 5.6.2 `问题6`:
- 6 测试无误后,则将交叉编译后的opencv的lib库复制到开发板的/usr/lib中(只要是开发板运行程序能链接到动态库的目录就行)
环境
ubuntu:ubuntu1604
arm-linux-gcc:arm-cortex_a9-linux-gnueabi (version 4.7.4)
arm开发板:S5P6818
opencv源码:opencv-3.4.1
opencv_contrib扩展包:opencv_contrib-3.4.1
makefile生成:cmake+cmake-gui
1.安装依赖库
#apt-get install lib32z1
#apt-get install cmake cmake-qt-gui build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff5-dev libswscale-dev libjasper-dev
2.OpenCV源码获取并解压
2.1 获取源码
官网处获取源码:速度比较慢,没梯可能不好办。
选择对应版本,下载下来
也可以下载我下载好的,5积分(放的时候是5):
2.2 工作目录准备
#mkdir /opt/wkspace/opencv_arm
#cd /opt/wkspace/opencv_arm
#cp ?/opencv-3.4.1.zip
#cp ?/opencv_contrib-3.4.1.zip .
#unzip opencv-3.4.1.zip
#unzip opencv_contrib-3.4.1.zip
3.交叉编译OpenCV
交叉编译时,要先编译源码包再编译扩展包
3.1 cmake-gui生成makefile
#cd opencv-3.4.1
#mkdir build
#cd build
#cmake-gui ..
**1)点击configure **
2)配置编译器 关键,搞错随随便便重新经历make
根据博文::Operating System只能写Linux,经过测试写arm-linux(实际上只是第一次以为没问题emmm)的话编译出来的库不完整,无法运行。
3)勾选 jpeg和png库
4)修改安装目录 记得要改哈。。免得安装到usr/local里跟x86版本搞混了
我安装在 /opt/wkspace/opencv_arm/output
5)configure && Generate生成makefile
3.2 make&&make install 及可能遇到的问题
make时长可能有点久,我机器大概花了7个小时。
3.2.1 问题1
/opt/wkspace/opencv_arm/opencv-3.4.1/3rdparty/protobuf/src/google/protobuf/stubs/common.cc:52:2: error: #error "No suitable threading library available."
原因:没有连接到pthread库
解决方法:
1)修改common.cc文件
在文件最上方加入语句
#define HAVE_PTHREAD
2)修改CMakeCache.txt
修改(可以在vim中用’/'来定位字串):
//Flags used by the linker.
CMAKE_EXE_LINKER_FLAGS:STRING=
为:
//Flags used by the linker.
CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt
重新make解决
3.2.2 问题2
../../lib/libopencv_core.so: undefined reference to `dlopen'
../../lib/libopencv_core.so: undefined reference to `dlclose'
../../lib/libopencv_core.so: undefined reference to `dlsym'
collect2: error: ld returned 1 exit status
modules/core/CMakeFiles/opencv_test_core.dir/build.make:880: recipe for target 'bin/opencv_test_core' failed
原因:dl库未链接
解决方法:修改CMakeCache.txt
修改(可以在vim中用’/'来定位字串):
//Flags used by the linker.
CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt -ldl
重新make解决
4.交叉编译OpenCV_contrib
4.1 修改cmake-gui 生成Makefile
#cd opencv-3.4.1
#mkdir build
#cd build
#cmake-gui ..
加入modules路径
勾选C++11特性 — ENABLE_CXX11(可选,注意看configure是否由于C11报错error,有的话取消该选项,对基本使用不影响
)
Configure && Generate , 生成Makefile
4.2 编译安装make && make install
4.2.1 问题3
:
/opt/wkspace/opencv/opencv_contrib-3.4.1/modules/xfeatures2d/src/vgg.cpp:490:41 fatal error: vgg_generated_120.i: No such file or directory
还有很多类似的xxx.i,都是同个问题
原因:同样是无法连接到该网络,下载这个包
解决方法:
下载文件后缀该为.tar.gz解压后为:
移动到
重新make解决
4.2.2 问题4
:
/opt/wkspace/opencv/opencv-3.4.1/modules/stitching/include/opencv2/stitching/detail/matchers.hpp:52:42: fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
同样也有一些类似的找不到头文件问题,都同个解决方法
原因:扩展包的include没在gcc编译这个文件时的头文件路径上
解决方法:将对应文件的include处更改为绝对路径
改为:
安装扩展包后:/opt/wkspace/opencv_arm/ouput/lib
(可能可以简化安装包之类,不过这个总大小也就32M,应该影响不大)
5.测试–QT使用cv开启摄像头
参考:【OpenCV+Qt】在Qt界面中显示OpenCV处理的图像
5.1 创建qt工程
5.2 准备工作
1)pro文件中添加头文件与路径,如下:
INCLUDEPATH += $(opencv目录)/include
LIBS +=$(opencv目录/lib)/libopencv*
如图:
2)在cameratest.cpp中加入头文件opencv2/opencvhpp:
3)创建一个大小合适的label:
4)添加一个pushbutton,并右键进入点击槽函数:
5.3 编写代码 && build
Cameratest.h |
---|
#ifndef CAMERATEST_H
#define CAMERATEST_H#include <QWidget>
#include <QTimer>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>using namespace cv;namespace Ui {class CameraTest;
}class CameraTest : public QWidget
{Q_OBJECTpublic:explicit CameraTest(QWidget *parent = 0);~CameraTest();private slots:void on_pushButton_clicked();private:Ui::CameraTest *ui;QTimer * mytimer; // 定时获取摄像头图像VideoCapture cap; // opencv用于打开摄像头的控件Mat frame; // 从cap中获取一帧图像 是oepncv的BRG格式,输出到label还需转换private slots:void cameraOpen();
};
#endif // CAMERATEST_H
Cameratest.cpp |
---|
#include "cameratest.h"
#include "ui_cameratest.h"using namespace cv;CameraTest::CameraTest(QWidget *parent) :QWidget(parent),ui(new Ui::CameraTest)
{ui->setupUi(this);mytimer = new QTimer(this);connect(mytimer, SIGNAL(timeout()), this, SLOT(cameraOpen()));cap.open(0); // 打开摄像头 /dev/video0
}CameraTest::~CameraTest()
{delete ui;
}void CameraTest::cameraOpen() {// 定时获取摄像头数据并显示mytimer->stop();cap >> frame; // 从摄像头获取一帧数据Mat image; // 定义一个Mat存储转换后的RGB格式图像/* opencv 默认BGR存放;而Image需要用RGB格式 */cvtColor(frame, image, CV_BGR2RGB); QImage Qimage = QImage((const unsigned char *)(image.data), // 强转为普通字节流image.cols, image.rows,image.step,QImage::Format_RGB888);ui->label->setPixmap(QPixmap::fromImage(Qimage)); ui->label->resize(Qimage.size());ui->label->show(); // 显示到labelmytimer->start(30);
}/* 按键触发定时器 */
void CameraTest::on_pushButton_clicked()
{mytimer->start(30);
}
5.4 ubuntu与开发板准备
5.4.1 摄像头接入开发板,测试
#cat /dev/video0
有乱码输出 ---- 此摄像头设备节点为/dev/video0
5.4.2 配置ip – 开发板-ubuntu互连
我用的是usb转网口,ip静态且固定:
1)配置开发板ip:
2)配置虚拟机ubuntu ip
增加虚拟机 虚拟网络 - - - 桥接到USB网络适配器 :
增加ubuntu虚拟网卡 – 使用刚刚创建的vmnet1
设置ubuntu的ip:
新建网络配置:
将新网卡连接到该网络:
查看ip:
3)互ping:
5.4.3 搭建nfs服务器,开发板访问工作目录
#vim /etc/exports
重启nfs服务器
#service nfs-server restart
开发板端:
#mount -o nolock 169.254.218.200:/opt /mnt
5.4.4 添加cv动态库路径
开发板端:
#cd /mnt/wkspace/opencv_arm/output/lib
#export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH
5.5 开发板运行qt程序
#cd /mnt/wkspace/Qt_opencv_test/build-Opencvtest-arm_linux-Debug
#./Opencvtest
结果:
5.6 开发板运行测试程序可能遇到的问题
5.6.1 问题5
:
./Opencvtest: error while loading shared libraries: /opt/wkspace/opencv_arm/output/lib/libopencv_aruco.so: cannot open shared object file: No such file or directory
原因:cmake-gui的时候,Operating System写arm-linux时,开发板运行测试程序时候报的错误,其实就是库不完整。
根据博文::在#cmake-gui的时候,Operating System只能写Linux,经过测试写arm-linux(实际上只是第一次以为没问题emmm)的话编译出来的库不完整,无法运行。
解决方法:仔细核对cmake-gui时是否操作有误,重新配置编译安装
5.6.2 问题6
:
看到rebuild the lib 差点自闭了
原因:在使用QTimer定时之前,我用了waitKey来进行定时/延时,而开发板的lib库不支持waitKey函数(没有gtk)
解决方法:只是个小问题,改成qt自带的qtimer就行了
发布评论