一、编译环境和源码包
-
宿主机:Ubuntu18.04 x64(vpm)
-
目标平台:rv1126_rv1109,arm
-
交叉编译工具链:arm-linux-gnueabihf
-
依赖关系:
opencv(3.4.3) (opencv版本不能太高(选择4.0以下),否则交叉编译无法编译过去)
|--------zlib(1.2.13)
|--------ffmpeg(4.4.2)
|--------libx264 (20181217 (2245-stable))
|--------libxvidcore(1.3.3)
二、前期准备
首先,在opencv所在文件夹(/home/vpm/tjh/rv1126/opencv/opencv-3.4.3)下创建rk_opencv_depend文件夹
cd /home/vpm/tjh/rv1126/opencv/opencv-3.4.3
mkdir rk_opencv_depend
其次,配置开发机环境变量:
(1)sudo su
(2)vim /etc/profile
在最后一行加上以下命令
export PATH=/opt/rockchip/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH (添加工具链路径)
export OPENCVDIR=/home/vpm/tjh/rv1126/opencv/opencv-3.4.3 (设置opencv文件夹所在路径)
export PATH= O P E N C V D I R / r k o p e n c v d e p e n d / b i n : OPENCVDIR/rk_opencv_depend/bin: OPENCVDIR/rkopencvdepend/bin:PATH
export LD_LIBRARY_PATH= O P E N C V D I R / r k o p e n c v d e p e n d / l i b : OPENCVDIR/rk_opencv_depend/lib: OPENCVDIR/rkopencvdepend/lib:LD_LIBRARY_PATH
export PATH= O P E N C V D I R / i n s t a l l / b i n : OPENCVDIR/install/bin: OPENCVDIR/install/bin:PATH
export LD_LIBRARY_PATH= O P E N C V D I R / i n s t a l l / l i b : OPENCVDIR/install/lib: OPENCVDIR/install/lib:LD_LIBRARY_PATH
(3)source /etc/profile
(4)arm+tab, 如果能够自动补齐出arm-linux-gnueabihf-*则说明环境变量设置成功
三、源码包的交叉编译
1.zlib交叉编译
(1)./configure --prefix=$OPENCVDIR/rk_opencv_depend //指定安装目录
(2)对Makefile文件进行修改,修改内容如下:
CC=arm-linux-gnueabihf-gcc
LDSHARED=arm-linux-gnueabihf-gcc -shared -Wl,-soname,libz.so.1,–version-script,zlib.map
AR=arm-linux-gnueabihf-ar
RANLIB=arm-linux-gnueabihf-ranlib
(3)make
(4)make install
- libx264交叉编译
(1)./configure --prefix=$OPENCVDIR/rk_opencv_depend --enable-shared --disable-asm --host=arm-linux
(2)打开config.mak进行修改:
CC=arm-linux-gnueabihf-gcc
LD=arm-linux-gnueabihf-gcc -o (末尾需要添加空格,否则会出问题)
LDSHARED=arm-linux-gnueabihf-gcc -shared -Wl,-soname,libz.so.1,–version-script,zlib.map
AR=arm-linux-gnueabihf-ar rc (末尾需要添加空格,否则会出问题)
RANLIB=arm-linux-gnueabihf-ranlib
(3)make
(4)make install
3.libxvidcore交叉编译
(1)cd xvidcore-1.3.3/build/generic
(2)
CC=arm-linux-gnueabihf-gcc ./configure --prefix=$OPENCVDIR/rk_opencv_depend --host=arm-linux --disable-assembly
(3)make
(4)make install
4.ffmpeg交叉编译
编写启动脚本autoffmpegconfig.sh,内容如下:
#!/bin/bash
./configure --prefix=
O
P
E
N
C
V
D
I
R
/
r
k
o
p
e
n
c
v
d
e
p
e
n
d
−
−
d
i
s
a
b
l
e
−
a
s
m
−
−
d
i
s
a
b
l
e
−
x
86
a
s
m
−
−
e
n
a
b
l
e
−
p
r
o
t
o
c
o
l
=
t
c
p
−
−
e
n
a
b
l
e
−
n
e
t
w
o
r
k
−
−
e
n
a
b
l
e
−
p
r
o
t
o
c
o
l
=
u
d
p
−
−
e
n
a
b
l
e
−
d
e
m
u
x
e
r
=
r
t
s
p
−
−
e
n
a
b
l
e
−
d
e
m
u
x
e
r
=
r
t
p
−
−
d
i
s
a
b
l
e
−
d
o
c
−
−
e
n
a
b
l
e
−
s
h
a
r
e
d
−
−
e
n
a
b
l
e
−
g
p
l
−
−
e
n
a
b
l
e
−
c
r
o
s
s
−
c
o
m
p
i
l
e
−
−
a
r
c
h
=
a
r
m
−
−
d
i
s
a
b
l
e
−
s
t
r
i
p
p
i
n
g
−
−
t
a
r
g
e
t
−
o
s
=
l
i
n
u
x
−
−
e
n
a
b
l
e
−
l
i
b
x
264
−
−
e
n
a
b
l
e
−
l
i
b
x
v
i
d
−
−
e
n
a
b
l
e
−
a
v
r
e
s
a
m
p
l
e
−
−
e
n
a
b
l
e
−
g
p
l
−
−
e
n
a
b
l
e
−
s
m
a
l
l
−
−
d
i
s
a
b
l
e
−
f
f
p
r
o
b
e
−
−
d
i
s
a
b
l
e
−
f
f
p
l
a
y
−
−
d
i
s
a
b
l
e
−
d
e
b
u
g
−
−
c
c
=
a
r
m
−
l
i
n
u
x
−
g
n
u
e
a
b
i
h
f
−
g
c
c
−
−
e
n
a
b
l
e
−
s
w
s
c
a
l
e
−
−
e
x
t
r
a
−
l
d
f
l
a
g
s
=
−
L
OPENCVDIR/rk_opencv_depend --disable-asm --disable-x86asm --enable-protocol=tcp --enable-network --enable-protocol=udp --enable-demuxer=rtsp --enable-demuxer=rtp --disable-doc --enable-shared --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --enable-avresample --enable-gpl --enable-small --disable-ffprobe --disable-ffplay --disable-debug --cc=arm-linux-gnueabihf-gcc --enable-swscale --extra-ldflags=-L
OPENCVDIR/rkopencvdepend−−disable−asm−−disable−x86asm−−enable−protocol=tcp−−enable−network−−enable−protocol=udp−−enable−demuxer=rtsp−−enable−demuxer=rtp−−disable−doc−−enable−shared−−enable−gpl−−enable−cross−compile−−arch=arm−−disable−stripping−−target−os=linux−−enable−libx264−−enable−libxvid−−enable−avresample−−enable−gpl−−enable−small−−disable−ffprobe−−disable−ffplay−−disable−debug−−cc=arm−linux−gnueabihf−gcc−−enable−swscale−−extra−ldflags=−LOPENCVDIR/rk_opencv_depend/lib --extra-cflags=-I$OPENCVDIR/rk_opencv_depend/include --ar=arm-linux-gnueabihf-ar --ranlib=arm-linux-gnueabihf-ranlib
./autoffmpegconfig.sh
make clean
make
make install
5.opencv交叉编译
1.mkdir release
2.cd release
3.编写cmake文件toolchain.cmake
###########user defined#############
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(OPENCV_ENABLE_PKG_CONFIG ON)
###########user defined#############
set(CMAKE_FIND_ROOT_PATH “/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend”)#这个地方需调整rk_opencv_depend路径
set(FFMPEG_INCLUDE_DIR “/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/include”)#这个地方需调整rk_opencv_depend路径
set(FFMPEG_LIB_DIR “/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/lib”)#这个地方需调整rk_opencv_depend路径
set(CMAKE_C_FLAGS “-Wl,-rpath-link=/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/lib”)#这个地方需调整rk_opencv_depend路径
set(CMAKE_CXX_FLAGS “-Wl,-rpath-link=/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/lib”)#这个地方需调整rk_opencv_depend路径
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
4.编写启动脚本autoopencvconfig.sh
#!/bin/bash
cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake -D BUILD_opencv_python3=yes -D BUILD_opencv_python2=no -D PYTHON3_EXECUTABLE=/usr/bin/python3.5m -D PYTHON3_INCLUDE_DIR=/usr/include/python3.5m -D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so -D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3.5m -D CMAKE_BUILD_TYPE=Release -D PKG_CONFIG_FOUND=ON -D CMAKE_INSTALL_PREFIX=
O
P
E
N
C
V
D
I
R
/
i
n
s
t
a
l
l
−
D
B
U
I
L
D
Z
L
I
B
=
O
N
−
D
B
U
I
L
D
J
P
E
G
=
O
N
−
D
B
U
I
L
D
P
N
G
=
O
N
−
D
B
U
I
L
D
T
I
F
F
=
O
N
−
D
E
N
A
B
L
E
C
X
X
11
=
O
N
−
D
W
I
T
H
F
F
M
P
E
G
=
O
N
−
D
W
I
T
H
O
P
E
N
C
L
=
O
N
−
D
W
I
T
H
G
T
K
=
O
F
F
−
D
W
I
T
H
O
P
E
N
G
L
=
O
N
−
D
W
I
T
H
O
P
E
N
M
P
=
O
N
−
D
W
I
T
H
P
N
G
=
O
N
−
D
O
P
E
N
C
V
E
N
A
B
L
E
N
O
N
F
R
E
E
=
Y
E
S
−
D
O
P
E
N
C
V
E
X
T
R
A
M
O
D
U
L
E
S
P
A
T
H
=
OPENCVDIR/install -D BUILD_ZLIB=ON -D BUILD_JPEG=ON -D BUILD_PNG=ON -D BUILD_TIFF=ON -D ENABLE_CXX11=ON -D WITH_FFMPEG=ON -D WITH_OPENCL=ON -D WITH_GTK=OFF -D WITH_OPENGL=ON -D WITH_OPENMP=ON -D WITH_PNG=ON -D OPENCV_ENABLE_NONFREE=YES -D OPENCV_EXTRA_MODULES_PATH=
OPENCVDIR/install−DBUILDZLIB=ON−DBUILDJPEG=ON−DBUILDPNG=ON−DBUILDTIFF=ON−DENABLECXX11=ON−DWITHFFMPEG=ON−DWITHOPENCL=ON−DWITHGTK=OFF−DWITHOPENGL=ON−DWITHOPENMP=ON−DWITHPNG=ON−DOPENCVENABLENONFREE=YES−DOPENCVEXTRAMODULESPATH=OPENCVDIR/opencv_contrib-3.4.3/modules/ … (红色文字为加入contrib模块,目前contrib模块在此平台编译还有问题,先不加)
- export PKG_CONFIG_PATH= P K G C O N F I G P A T H : PKG_CONFIG_PATH: PKGCONFIGPATH:OPENCVDIR/rk_opencv_depend/lib/pkgconfig
6…/autoopencvconfig.sh (执行脚本会存在问题" does not exist.source directory "/home/vpm/tjh/rv1126/opencv/opencv-3.4.3/release/…,将脚本里面的语句拿出来直接执行即可)
当FFMPEG项为YES时继续执行以下命令:
-
make
-
make install
四、针对ffmpeg始终为NO的解决方法
1.修改cmake/OpenCVFindLibsVideo.cmake,找到关于ffmpeg的段落进行如下修改
— FFMPEG —
ocv_clear_vars(HAVE_FFMPEG)
if(WITH_FFMPEG) # try FFmpeg autodetection
if(OPENCV_FFMPEG_USE_FIND_PACKAGE)
if(OPENCV_FFMPEG_USE_FIND_PACKAGE STREQUAL “1” OR OPENCV_FFMPEG_USE_FIND_PACKAGE STREQUAL “ON”)
set(OPENCV_FFMPEG_USE_FIND_PACKAGE “FFMPEG”)
endif()
find_package(${OPENCV_FFMPEG_USE_FIND_PACKAGE}) # Required components: AVCODEC AVFORMAT AVUTIL SWSCALE
if(FFMPEG_FOUND OR FFmpeg_FOUND)
set(HAVE_FFMPEG TRUE)
else()
message(STATUS “Can’t find FFmpeg via find_package(${OPENCV_FFMPEG_USE_FIND_PACKAGE})”)
endif()
elseif(WIN32 AND NOT ARM AND NOT OPENCV_FFMPEG_SKIP_DOWNLOAD)
include(“${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg.cmake”)
download_win_ffmpeg(FFMPEG_CMAKE_SCRIPT)
if(FFMPEG_CMAKE_SCRIPT)
set(HAVE_FFMPEG TRUE)
set(HAVE_FFMPEG_WRAPPER 1)
include(“${FFMPEG_CMAKE_SCRIPT}”)
endif()
elseif(PKG_CONFIG_FOUND)
set(HAVE_FFMPEG TRUE)
ocv_check_modules(FFMPEG libavcodec libavformat libavutil libswscale)
ocv_check_modules(FFMPEG_libavresample libavresample)
if(FFMPEG_libavresample_FOUND)
ocv_append_build_options(FFMPEG FFMPEG_libavresample)
endif()
else()
message(STATUS “Can’t find ffmpeg - ‘pkg-config’ utility is missing”)
endif()
endif()
if(HAVE_FFMPEG
AND NOT HAVE_FFMPEG_WRAPPER
)
set(HAVE_FFMPEG TRUE)
set(FFMPEG_INCLUDE_DIRS /home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/include) #这个地方需调整rk_opencv_depend路径
set(FFMPEG_LIBRARY_DIRS /home/vpm/tjh/rv1126/opencv/opencv-3.4.3/rk_opencv_depend/lib) #这个地方需调整rk_opencv_depend路径
set(FFMPEG_LIBRARIES avcodec avformat avutil swscale z)
message(STATUS “FFMPEG_INCLUDE_DIR: ${FFMPEG_INCLUDE_DIRS}”)
message(STATUS “FFMPEG_LIBRARY_DIRS: ${FFMPEG_LIBRARY_DIRS}”)
message(STATUS “FFMPEG_LIBRARIES: ${FFMPEG_LIBRARIES}”)
try_compile(__VALID_FFMPEG
“${OpenCV_BINARY_DIR}”
“${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp”
CMAKE_FLAGS “-DINCLUDE_DIRECTORIES:STRING=${FFMPEG_INCLUDE_DIRS}”
“-DLINK_DIRECTORIES:STRING=${FFMPEG_LIBRARY_DIRS}”
“-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}”
OUTPUT_VARIABLE TRY_OUT
)
if(False)
#message(FATAL_ERROR “FFMPEG: test check build log:\n${TRY_OUT}”)
message(STATUS “WARNING: Can’t build ffmpeg test code”)
set(HAVE_FFMPEG FALSE)
else()
ocv_append_build_options(VIDEOIO FFMPEG)
endif()
endif()
2.修改CMakeVars.txt,找到关于FFMPEG_INCLUDE_DIR=的段落进行修改
FFMPEG_INCLUDE_DIR=/opt/arm_opencv/rk_opencv_depend/include
FFMPEG_INCLUDE_DIRS=/opt/arm_opencv/rk_opencv_depend/include
五、测试代码
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include
using namespace std;
using namespace cv;
int main()
{
string video_address = “rtsp://admin:admin@192.168.8.189”;
Mat frame;
VideoCapture cap;
int ret;
ret = cap.open(video_address, cv::CAP_FFMPEG);
if (ret == 0){
cerr << “ERROR! Unable to open camera!\n”;
return -1;
}
cout << "successfully opened camera ! " << endl;
cap.read(frame);
if (!frame.empty()){
cout << “pic size:” << frame.channels() << “" << frame.cols << "” << frame.rows << endl;
}
string image_address = “./new_image.jpg”;
imwrite(image_address, frame);
cap.release();
return 0;
}
六、注意事项
板端的目录结构和电脑端的目录结构尽量保持一致
原文链接:https://blog.csdn.net/m0_56851289/article/details/125302004