tips:该次移植过程是在华为Atlas 200dk上进行的,但针对各种嵌入式平台基本都试用,如树莓派,等等
在安装完图像界面以及qt之后,我们想通过qt调用opencv进行图像处理,对此,在改变文章中,我们介绍如何在Atlas 200dk移植opencv,在下篇文章中我们会在上面跑一个简单的开源项目,进行人脸识别,有兴趣的朋友可以去看看这篇文章。
一、前期准备
- 下载opencv4.5.1源码包:
官网下载地址:https://opencv.org/releases/
也可到作者的资源出下载:https://download.csdn.net/download/sinat_33909696/18509418
- 安装opencv相关依赖包:
sudo apt install build-essential
sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
tips:在安装第三行的时候可能会出现无法定位软件包libjasper-dev的错误提示
这里分别说明一下x86系统和arm系统各自解决该问的方法:
x86: 我们可以直接添加以下仓库连接,然后进行重新安装:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt upgrade
sudo apt install libjasper1 libjasper-dev
arm: 因为上述为x86的软件源,因此针对arm版本来说,显然我们就需要找arm版本的源,但是作则找了好久也没有找到相关的源,于是选着了离线安装libjasper-dev软件包,如果有朋友发现了该软件源或更好的解决方法,希望可以在评论区留下你的解决,一起探讨探讨。
libjasper-dev软件包
离线安装:
1 、进入Debian官网下载安装libjasper-dev
Debian官网:https://www.debian.org/
2、点击更多
3、点击软件包
4、在搜索软件包目录,填写软件包名称,发行版选择any,section选择any,然后点击搜索:
5、选着armhf版本进行下载
6、输入sudo dpkg -i libjasper-dev_1.900.1-debian1-2.4+deb8u6_armhf.deb
指令安装deb包,安装过程可能会出现缺少依赖:libjasper1,所以我们再按照以上步骤先去下载安装libjasper1,再安装libjasper-dev,如果安装libjasper1还是提示需要依赖,那就再重复以上步骤下载安装需要的依赖,直到安装成功。
7、使用dpkg进行安装不自动处理安装依赖包,我们可以通过 sudo apt-get install -f 来安装依赖,(当然我还是建议大家自己离线安装,这样可以保证一定能安装成功)
8、其次安装deb软件包,我们还可以使用apt命令进行deb软件包的安装,apt相比于dpkg来说好处就是可以自动处理依赖包的安装:
输入:apt-get install -y ./libjasper-dev_1.900.1-debian1-2.4+deb8u6_armhf.deb
来进行安装安装deb安装包
tips:这里要注意的是不要直接在 apt 命令后指定deb包的名字,必须有路径信息,否则 apt 命令会尝试从远程仓库中搜索deb包同名的package,从而导致安装失败。
9、上述手动安装libjasper-dev库会提示缺失好几个依赖包,如果嫌麻烦的可以直接去我的资源中下载libjasper-dev和其完整依赖:资源连接:https://download.csdn.net/download/sinat_33909696/18510530
10、如果上述安装libjasper-dev库失败:请开启32位兼容,在重复上面安装过程:
开启指令:
dpkg --add-architecture armhf
apt-get update
apt-get install libc6:armhf
二、编译以及安装opencv
- 上述依赖安装完成后就可以就可以进行编译了,解压OpenCV-4.1.0源码包,进入文件夹,创建一个名为build的文件夹:进入该文件夹:输入以下命令进行cmake的配置:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
如果报错,那么去掉 -D后面的空格再尝试一下,即
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..
这之中 , /usr/local 是 OpenCV 的安装路径
- cmake配置好之后,输入以下名进行编译
sudo make
也可以使用多线程进行编译
sudo make -j 12
j 后面的数字是你想要使用的线程数量
开始编译后
安装上述过程安装完相关依赖包之后进行编译,一半都不会出错:但读者在编译的时候由于使用了 -j 12,即12核进行编译,编译过程中报了一个错:
这是应为我在Atlas 200dk上进行编译的,超出了内存:
解决方法:
1、直接make或者-j后面数字不要加太大即可
2、其次,我们还可以通过增加交换分区来解决内存不够的情况:
sudo dd if=/dev/zero of=/swapfile bs=64M count=16
#count的大小就是增加的swap空间的大小,64M是块大小,所以空间大小是bs*count=1024MB
sudo mkswap /swapfile
#把刚才空间格式化成swap格式
sudo swapon /swapfile
#使用刚才创建的swap空间
然后在重新make即可
- 等待编译结束,键入如下命令进行安装
sudo make install
因为上面我们指定了安装路径为、/usr/local,因此,相应的lib库以及ingclude头文件会被放在/usr/local下。
- 至此。opencv安装完成。
- 如果实在没编译成功,也可以下载作者编译好的opencv4.5.1,然后安装,继续下面步骤:下载地址:
https://download.csdn.net/download/sinat_33909696/18510164
三、配置opencv环境
- 首先将OpenCV的库添加到路径,从而可以让系统找到
- 键入如下命令打开opencv.conf ,打开后很可能是空白
sudo vim /etc/ld.so.conf.d/opencv.conf
在文末添加
/usr/local/lib
保存后,执行如下命令使得刚才的配置路径生效
sudo ldconfig
- 接下来配置 bash
sudo gedit /etc/bash.bashrc
在文件最末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存,执行如下命令使得配置生效
source /etc/bash.bashrc
然后更新
sudo updatedb
到这里配置就完成了
四、qt中opencv4.5.1配置
-
在开始前,我们还需要做一步准备工作,进入安装opencv的目录:
/usr/local/include
我们可以看到该文件夹下面有一个opencv4的目录,进入opencv4的目录我们可以发现里面有一个opencv2的目录,进入opencv2的目录我们可以看到,该目录下才存放着我们需要的头文件,但是我们在调用的时候一半都是这样引入头文件的<opencv2/xxx>,因此,而我们的头文件目录又是/usr/local/include,因此,由于中间多了一个opencv4的文件夹而造成找不到头文件的错误,对此,我们需要将opencv4目录下的文件夹opencv2文件夹移出来一级,使其和opencv4文件夹在同一级目录才可以,键入如下命令进行拷贝一份:cp opencv2 .. -rf
,移完之后include文件夹下文件如下:
-
然后建立一个qt控制台项目,在pro配置文件中加入opencv的头文件以及lib库文件:
INCLUDEPATH += /usr/local/include
LIBS += /usr/local/lib/libopencv_*.so
- 写一个简单的测试代码:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("/home/HwHiAiUser/Desktop/1.jpg");
imshow("sa",src);
waitKey(0);
return 0;
}
- 点击运行,可以看到,qt中配置opencv成功:
参考文章1:在 Ubuntu系统下安装 OpenCV 全过程
参考文章2:树莓派64位系统安装libjasper-dev显示无法定位软件包问题
参考文章3:Liunx使用apt安装本地deb软件包
参考文章3:Liunx使用apt安装本地deb软件包
参考文章4:编译buildroot遇到g++: internal compiler error: Killed (program cc1plus) 解决办法