一、银河麒麟下安装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下载链接
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。