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 获取源码

官网处获取源码:速度比较慢,没梯可能不好办。
https://github.com/opencv
opencv-3.4.1-arm编译安装 -- 超详细_第1张图片
选择对应版本,下载下来
也可以下载我下载好的,5积分(放的时候是5):
https://download.csdn.net/download/qq_44503344/12666252

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 ..

opencv-3.4.1-arm编译安装 -- 超详细_第2张图片
**1)点击configure **
opencv-3.4.1-arm编译安装 -- 超详细_第3张图片
2)配置编译器 关键,搞错随随便便重新经历make
根据博文:https://blog.csdn.net/u013752202/article/details/47358389/的解释:Operating System只能写Linux,经过测试写arm-linux(实际上只是第一次以为没问题emmm)的话编译出来的库不完整,无法运行。
opencv-3.4.1-arm编译安装 -- 超详细_第4张图片
3)勾选 jpeg和png库
opencv-3.4.1-arm编译安装 -- 超详细_第5张图片
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,有的话取消该选项,对基本使用不影响)
opencv-3.4.1-arm编译安装 -- 超详细_第6张图片
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,都是同个问题
原因:同样是无法连接到该网络,下载这个包
解决方法:https://blog.csdn.net/jiaken2660/article/details/104132060
下载文件后缀该为.tar.gz解压后为:
opencv-3.4.1-arm编译安装 -- 超详细_第7张图片
移动到
opencv-3.4.1-arm编译安装 -- 超详细_第8张图片
重新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,应该影响不大)
opencv-3.4.1-arm编译安装 -- 超详细_第9张图片

5.测试–QT使用cv开启摄像头

参考:【OpenCV+Qt】在Qt界面中显示OpenCV处理的图像

5.1 创建qt工程

opencv-3.4.1-arm编译安装 -- 超详细_第10张图片
opencv-3.4.1-arm编译安装 -- 超详细_第11张图片
opencv-3.4.1-arm编译安装 -- 超详细_第12张图片

5.2 准备工作

1)pro文件中添加头文件与路径,如下:

INCLUDEPATH += $(opencv目录)/include	   
LIBS +=$(opencv目录/lib)/libopencv*  

如图:
在这里插入图片描述
2)在cameratest.cpp中加入头文件opencv2/opencvhpp:
在这里插入图片描述
3)创建一个大小合适的label:
opencv-3.4.1-arm编译安装 -- 超详细_第13张图片
4)添加一个pushbutton,并右键进入点击槽函数:
opencv-3.4.1-arm编译安装 -- 超详细_第14张图片

5.3 编写代码 && build

Cameratest.h
#ifndef CAMERATEST_H
#define CAMERATEST_H

#include 
#include 
#include 
#include 

using namespace cv;

namespace Ui {
	class CameraTest;
}

class CameraTest : public QWidget
{
	Q_OBJECT

public:
	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();                                    // 显示到label

	mytimer->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静态且固定:
opencv-3.4.1-arm编译安装 -- 超详细_第15张图片
1)配置开发板ip:
opencv-3.4.1-arm编译安装 -- 超详细_第16张图片
2)配置虚拟机ubuntu ip
增加虚拟机 虚拟网络 - - - 桥接到USB网络适配器 :
opencv-3.4.1-arm编译安装 -- 超详细_第17张图片
增加ubuntu虚拟网卡 – 使用刚刚创建的vmnet1
opencv-3.4.1-arm编译安装 -- 超详细_第18张图片
设置ubuntu的ip:
新建网络配置:
opencv-3.4.1-arm编译安装 -- 超详细_第19张图片
将新网卡连接到该网络:
opencv-3.4.1-arm编译安装 -- 超详细_第20张图片
查看ip:
opencv-3.4.1-arm编译安装 -- 超详细_第21张图片
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 

结果:
opencv-3.4.1-arm编译安装 -- 超详细_第22张图片

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时,开发板运行测试程序时候报的错误,其实就是库不完整。

根据博文:https://blog.csdn.net/u013752202/article/details/47358389/的解释:在#cmake-gui的时候,Operating System只能写Linux,经过测试写arm-linux(实际上只是第一次以为没问题emmm)的话编译出来的库不完整,无法运行。
解决方法:仔细核对cmake-gui时是否操作有误,重新配置编译安装

5.6.2 问题6:

opencv-3.4.1-arm编译安装 -- 超详细_第23张图片
看到rebuild the lib 差点自闭了
原因:在使用QTimer定时之前,我用了waitKey来进行定时/延时,而开发板的lib库不支持waitKey函数(没有gtk)
解决方法:只是个小问题,改成qt自带的qtimer就行了

6 测试无误后,则将交叉编译后的opencv的lib库复制到开发板的/usr/lib中(只要是开发板运行程序能链接到动态库的目录就行)

你可能感兴趣的:(opencv,qt,opencv,ubuntu,arm)