银河麒麟V10系统+飞腾CPU交叉编译OpenCV

一、银河麒麟下安装OPenCV基础库

1、准备工作

在/usr/local/下新建一个ffmpeg文件夹

mkdir /usr/local/ffmpeg

2、安装nasm

nasm下载链接如下:

https://www.linuxfromscratch.org/blfs/view/8.2/general/mercurial.html

进入网址后,界面如下:

先点击右上角Next,到nasm-2.13.03的页面,再选择红框选中区域,下载nasm

下载完成后进入到下载目录执行下面的操作:

tar -xvf nasm-2.13.03.tar.gz

cd nasm-2.13.03/

./configure

make –j8

make install

执行上述过程中make时可能会报错,错误结果如下

./include/nasmlib.h:194:1: error: ‘pure’ attribute on function returning ‘void’ [-Werror=attributes] 194 | void pure_func seg_init(void);

这是由于gcc版本过新,解决方案如下

vim ./include/nasmlib.h

在vim编译器中找到大概193行位置,对下面一行代码进行注释

void pure_func seg_init(void);

然后重新make,再执行make install,完美解决。输入下面的命令,查看nasm版本号,打印出来表示安装成功。

nasm -verison

3、安装yasm

官网下载链接Index of /projects/yasm/releases/

​​

如上图红框所示,下载相应的版本

将下载后的文件解压到/usr/local/ffmpeg文件夹内,主要操作如下:

cd /usr/local/ffmpeg

tar -xvf yasm-1.2.0.tar.gz

cd yasm-1.2.0/

./configure –build=arm-linux

make –j8

make install

最后安装成功后可以使用如下命令查看

yasm –version

 

4、安装x264

官网链接如下

https://www.videolan.org/developers/x264.html

进去之后界面如下

点击红框选中位置进行下载,同样,下载后放入/usr/local/ffmpeg文件夹内进行解压等后续操作:

tar -xvf x264-master.tar.bz2

cd x264-master

./configure --enable-shared

make

make install

安装完成后同样可以使用下面命令进行测试

x264 --version

出现下面界面表示安装成功

5、安装fdk-aac-0.1.6

源码包下载地址:https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.6.tar.gz

tar -xvf fdk-aac-0.1.6.tar.gz

cd fdk-aac-0.1.6.tar.gz

./configure

make –j8

sudo make install

6、安装Speex

sudo apt install speex

7、安装pkg-config

sudo apt install pkg-config

8、安装zlib1g

sudo apt install zlib1g-dev

结果: zlib1g-dev : 依赖: zlib1g (= 1:1.2.11.dfsg-2kylin1) 但是 1:1.2.12.1-1+eagle 正要被安装,这里可以看到是因为有一个zlib1g正在被安装,所以才会产生的冲突。

将zlib1g降级就好了呀!

sudo apt install zlib1g=1:1.2.11.dfsg-2kylin1

9、安装libgtk2.0

sudo apt-get install libgtk2.0-dev

根据提示依赖项依次安装

10、安装ffmpeg

(1)、下载源码

首先去官网下载ffmpeg,链接如下

http://ffmpeg.org/download.html#build-linux

进去之后按照下面提示操作

 

 

2)、编译安装

下载之后放入/usr/local/ffmpeg文件夹内

然后依次执行下面步骤

tar -xvf ffmpeg-4.4.2.tar.xz

cd ffmpeg-4.4.2

./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-libx264 --enable-gpl

make -j8

make install -j8

上面执行完成后,安装基本算是成功了,至于为什么没全成功,后面还需要再进一步配置方可使用。

(3)、环境配置

配置过程如下

配置1

cd /usr/local/ffmpeg/

查看该目录下是否包含下面的几个文件目录

bin目录中包含了ffmpeg的二进制文件

include目中包含了编程需要引入的头文件目录

lib是编译好的库文件目录

share是文档目录

配置2

cd /usr/local/ffmpeg/bin

./ffmpeg -version

一般情况下会看到下图的结果

说明至此,ffmpeg真的安装成功了

如果,出现特殊情况,那就是报错了,不要慌,继续执行下面

配置3

vi /etc/ld.so.conf.d/ffmpeg.conf

可能是一个新文件。如果不是就在文档末尾添加下面一句话

/usr/local/ffmpeg/lib

保存退出,使用ldconfig使得配置生效

ldconfig

修改/etc/ld.so.conf

目的是使用ffmpeg库的时候,能让编译器找到我们的库,因为编译器默认找/usr/lib,而不是/usr/local/lib

sudo vim /etc/ld.so.conf

在文件中添加 /usr/local/lib

在文件中添加 /usr/local/ffmpeg/lib

在 /etc目录下 sudo ldconfig

添加环境变量

目的是为了能使用ffplay ,ffprobe, ffmpeg,而不用每次都到ffmpeg目录下面./运行

最后,再执行配置2的语句,此时应该出现配置2 的截图了,说明至此安装完毕。

安装后添加环境变量的问题

sudo vim /etc/profile

在最后面加上这两行  最好不要复制

export HBASE_HOME=/usr/local/ffmpeg

export PATH=$PATH:/usr/local/ffmpeg/bin

执行source /etc/profile  命令刷新配置

测试:ffmpeg -version

问题

编译ffmpeg时,在ffmpeg目录执行./configure … 之后,没有修改config.h文件,这样也编译不出ffplay来。解决办法是进入到 ffmpeg 目录下,打开 config.h文件找 FFPLAY 关键字,将其后面的 0 修改为 1,保存并退出该文件。在当前目录下执行 make && sudo make install。注意,修改 config.h文件后,不要再执行./configure …了,否则config.h中的值又都恢复为原来的值了

测试

如果遇到ffplay不能播放的问题

ffplay 不能播放 Could not initialize SDL - No available video device (Did you set the DISPLAY variable?)

  sudo apt-get install libx11-dev

  sudo apt-get install xorg-dev

  重新进入SDL2-2.0.14目录

  make clean

  ./configure

  make -j4

  sudo make install

当然,到此,我们还没有对安装进行实际测试,不确定安装后是否能达到预期的效果,为此,本文专门使用了一个mp4视频进行了测试,将mp4转换为avi格式,测试步骤和结果如下,此处截图时转换后的格式为mp4,后面命令中进行了修改

首先,查看一下原视频,格式为mp4,大小为17507051,位置在桌面,名称叫test.mp4,为了方便测试,可以将该文件拷贝到/monchickey/ffmpeg/bin目录下。

然后在/monchickey/ffmpeg/bin目录下执行下面的命令

./ffmpeg -i test.mp4 -f psp -r 29.97 -b 768k -ar 24000 -ab 64k -s 320*240 destination.avi

此时你会看到下面的运行界面

​​​​​​​

 紧接着是这样的画面

  ​​​​​​​终于通过实际的测试了,等待程序执行完成之后,会发现bin目录下多了一个destination.avi文件

  ​​​​​​​

​​

 可以看到后,格式转换后,文件的大小发生了变化,打开视频后发现与原视频效果差不多。

常用参数

#ffmpeg常用参数的介绍

#-i 指定要转换视频的源文件

#-s 视频转换后视频的分辨率

#-vcodec 视频转换时使用的编解码器

#-r 视频转换换的桢率(默认25桢每秒)

#-b 视频转换换的bit率

#-ab 音频转换后的bit率(默认64k)

#-acodec 制度音频使用的编码器

#-ac 制定转换后音频的声道

#-ar 音频转换后的采样率

./ffmpeg -i source.mp4 -f psp -r 29.97 -b 768k -ar 24000 -ab 64k -s 320*240 destination.mp4

需要的自取,上面使用的参数命令可以对照命令参数详情自己理解。

二、银河麒麟下移植OpenCV

1、opencv下载链接

Releases - OpenCV

2、配置opencv,可跳过

下载完成后,解压目录

unzip opencv-3.4.6.zip

首先,修改一个文件,不然安装过程中会报错

vim 你的路径/opencv-3.4.6/modules/videoio/src/cap_ffmpeg_impl.hpp

若没有则跳过

然后加入下面三句宏定义

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)

#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER

#define AVFMT_RAWPICTURE 0x0020

3、编译opencv

一、x86_arm交叉编译

1)、通过cmake-gui安装

1、安装cmake-gui

sudo apt-get install cmake-gui

在源码目录下

mkdir /usr/local/opencv-3.4.6

mkdir build

cd build

2、安装完成后运行:

sudo cmake-gui

3、然后会弹出CMake的图形化界面,在上方的两个路径里面,选择好代码所在文件夹的路径和要安装的路径。

说明:Where is the source code对应opencv的文件夹,Where to build the binaries对应opencv存放编译好的配置文件等信息的文件夹(刚才创建的build文件夹)

​​​​​​​4、交叉编译

​​​​​

注意:Linux要大写首字母,不能写成linux。Target Root代表标准库与头文件的搜索起始位置,可以理解为对应交叉编译工具的根目录,下图中的工具链是:

C:/usr/local/cross-arm/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc

C++:/usr/local/cross-arm/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++

Target Root:/usr/local/cross-arm/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/

​​​​​​​ ​​​​​​​

勾选Advanced配置zlib路径,find / -name zlib.h查看zlib.h是否在那个目录存在

/usr/local/opencv-3.4.6-arm/opencv-3.4.6/3rdparty/zlib/

  ​​​​​​​ ​​​​​​​

5、编译

sudo make –j8

可能报错,参考百度解决

错误1:undefined reference to ‘png_riffle_palette_neon’

解决1:

在build目录下:vi ../3rdparty/libpng/pngpriv.h大概131行位置

/*#  if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \*/

如上所示,把上面的一行注释掉,增加下面一行。再次make即可

#if defined(PNG_ARM_NEON) && (defined(ARM_NEON) || defined(__ARM_NEON)) &&\

   defined(PNG_ALIGNED_MEMORY_SUPPORTED)

6、安装

sudo make install

7、环境变量

参考2、其他平台配置

二、其他平台

1)、通过cmake-gui安装

1、安装cmake-gui

sudo apt-get install cmake-gui

在源码目录下

mkdir /usr/local/opencv-3.4.6

mkdir build

cd build

2、安装完成后运行:

sudo cmake-gui

3、然后会弹出CMake的图形化界面,在上方的两个路径里面,选择好代码所在文件夹的路径和要安装的路径。

 

 4、点击左下方的Configure按钮,选择Unix Makefiles,选择Use default native compilers(默认),然后点击Finish

 5、需要下载一些文件,要等待一段时间。然后CMake即载入默认配置,如下图所示:

6、这里需要对两个地方进行修改:

(1)在CMAKE_BUILD_TYPE 值处输入RELEASE,其他保持不变(如果已经存在就不必修改)。

下方的CMAKE_INSTALL_PREFIX显示了默认的安装目录,生成makefile文件最后执行 make install时就会安装到这个目录,这里可以根据个人需求更改。

(2)在OPENCV_EXTRA_MODULES_PATH处,选择输入目录(单击这一行后方空白处即可选中)

(3)然后选择opencv_contrib-3.2.0文件夹中的modules文件夹,注意,不是只选中opencv_contrib-3.2.0文件夹就好了,需要选中里面的modules文件夹!    如下图所示,然后点Choose。

注:OPENCV_EXTRA_MODULES_PATH 是用来指定要编译的扩展模块,其中包括OpenCV_contrib模块。

7、点击Generate生成配置文件,这一步应该比较快就完成了。

8、接着,在build目录下打开终端,输入

sudo make -j8

sudo make install

2)、shell指令安装

mkdir build

cd build

cmake –D OPENCV_GENERATE_PKGCONFIG=ON –D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-3.4.6 -D WITH_FFMPEG=ON –D BUILD_opencv_world=ON  -D WITH_GTK=ON ..

上面这个cmake命令很重要,尤其是OPENCV_GENERATE_PKGCONFIG=ON,这个很重要,不写安装完成后会出现很多问题。

cmake结束后,继续执行下面的命令

make -j8

make install

至此,opencv安装结束

4、环境变量配置

打开QT运行的时候,大概率报错。

error while loading shared libraries: libopencv_core.so.3.3: cannot open shared object file: No such file or directory

不要慌,还有解决方案,如下

sudo vim /etc/ld.so.conf

在include那句话下面加入

/usr/local/lib/

下面是环境变量的配置,配置环境变量需谨慎,一定要仔细,不然会导致系统瘫痪。

vim /etc/ld.so.conf.d/opencv.conf

打开文件后输入/usr/local/opencv-3.4.6/lib,并保存退出

然后在终端执行

sudo ldconfig

vim /etc/profile

在末尾加入

export PATH=$PATH:/usr/local/opencv-3.4.6/bin

export PATH=$PATH:/usr/local/opencv-3.4.6/

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

source /etc/profile

5、opencv的测试

ldconfig -v | grep opencv

输入命令:

pkg-config --cflags opencv

pkg-config --libs opencv

如果没有出错,说明安装成功

三、OpenCV使用问题

1、imshow无法使用

问题:

imshow 无法使用, 会出现如下警告. 这是因为python-opencv没有编译gtk, 网上的解决方法可能会推荐你重新编译什么的, 太过麻烦, 也不一定能解决.
cv2.error: OpenCV(4.1.0) /io/opencv/modules/highgui/src/window.cpp:627: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

解决:

卸载全部其他python版本的opencv

# 首先看看系统上是否安装了opencv

# 如果你使用了 conda 环境, 用如下命令列出全部的opencv包

conda list opencv

# 注意: conda列出来的包, 每行末尾有pypi的要通过pip卸载, 没有pypi的通过conda卸载

# 如果没有conda, 那就用pip 看一下

pip list | grep opencv

# conda list opencv 的结果如下:

# 然后就能看到装过的各种版本的opencv, 卸载这些opencv

# conda 卸载参考

conda uninstall xxx-opencv-xxx

# pip 卸载参考, 在我上面这张图中, 执行:

pip uninstall opencv-contrib-python

安装opencv,注意其他的opencv一定要先卸载干净,到之前的/usr/local/opencv-3.4.6/opencv-3.4.6/build文件夹下

make uninstall

pip3 install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple​​​​​​​

 等待下载安装,然后重新编译安装opencv。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值