Dragon

树莓派在Raspberry Pi 4上安装OpenCV 4.4.0

2021-02-06 21:54 213 抢沙发 小逸博客

本文可以帮助你在32位的Raspberry Pi 4上安装OpenCV4.4.0,尽管是为Raspberry Pi 4写的但是这个教程可以不加更改的使用于Raspberry 3或2,你可以在OpenCV的官方GitHub上看到关于4.4.0版本的发行说明,本文就不作赘述了。

操作系统

为Raspberry Pi 4使用快速SD存储卡。100MB/s和32 GB的存储容量比较合适。树莓派官方对于SD储存卡的最低要求是高于class4标准,但是您大可不必担心,class4标准的卡可能已经成为古董了
希望您的卡格式化为Raspberry Pi的正确ext4,推荐使用balenaEtcher作为烧录工具。具体烧录教程如下文章,当然烧录工具也可以在此下载!

如何给树莓派安装系统-BG
如何给树莓派安装系统

如何给树莓派安装系统

新的树莓派拿到手中,你迫不及待的想要玩,先别急,这可不是你的macbook拿回来就可以开机,想要把玩树莓派,你还需要给它安装系统? 准备一台能用的电脑 下载一个树莓派支持的操作系统 准备一张...

物理RAM芯片,由CPU和GPU使用两者。在Raspberry Pi 2或3上,默认为GPU分配64 MB。Raspberry Pi 4具有76 MB的GPU内存大小。对于视觉项目来说,它可能有点小,最好现在将其更改为128 MB。要增加GPU的内存量,请使用以下菜单。执行此操作后,系统要重启,才可生效!

EEPROM

全新的Raspbian操作系统烧录后,检查EEPROM软件版本。Raspberry Pi 3在SD卡上具有所有操作软件。另一方面,Raspberry Pi 4也从两个EEPROM部分启动。这些EEPROM在工厂组装好PCB之后进行编程。Raspberry Pi基金会最近为这些EEPROM发布了新的改进软件。这与OpenCV无关,而与散热有关。在我们的一种视觉应用中,只需更新EEPROM的内容,CPU的热量就会从65°C(149°F)降至48°C(118°F)。而且,如你所知,较低的CPU温度将延长Pi的使用寿命。
使用以下命令检查EEPROM(如果需要更新)。

#获取当前版本
$ sudo rpi-eeprom-update
#如果需要,以更新固件
$ sudo rpi-eeprom-update -a
$ sudo reboot


第二张图片则是需要你用用命令更新你的eeprom

一些警告

不要使用 pip 在Raspberry Pi上安装OpenCV。首先,由于缺少头文件,因此pip安装不支持C ++。如果您想像我们一样用C ++编写代码,请不要使用pip。其次,在撰写本文时(2020年4月),将通过pip安装OpenCV 4.1.1版本。此版本取决于原子库。尽管可用,但Raspbian操作系统仅在强制使用时才使用此库。这可以通过 LD_PRELOAD 技巧完成。具有这种显式依赖关系的便捷方法。最后,使用 NOOBS 3.1.1 ,您将被拖到libQTtest等缺少的依赖项中。

同样的情况适用于sudo apt-get install python3-opencv 。已安装的OpenCV版本(当前为3.2.0)均不支持C ++。另一个可能的陷阱可能是存储库。一旦使用新版本更新了该生态系统,诸如sudo apt-get upgrade之类的简单命令将自动安装与3系列不兼容的4.0.0或更高版本。除非您已将 OpenCV 隔离在虚拟环境中,否则您将面对旧项目上的一些耗时的修复工作。最重要的是,甚至更糟的是,安装的版本并未针对Raspberry Pi的 NEON-ARM 内核进行优化。因此,如果按照以下步骤手动安装该库,最终可能会更快。

该命令和apt-get install libopencv-dev的安装是另一个不那么好主意。它会生成一组适用于C ++编码的文件。但是,Python无法识别此OpenCV软件包。安装的版本仍然是老式的3.2.0。一旦生态系统被更新,就有一个sudo apt-get upgrade命令将其替换为不兼容的4.0.0版本的风险。

版本检查

在Raspberry Pi 4上安装OpenCV之前,是时候进行最终版本检查了。许多读者只是跳入本指南,而忽略了介绍,这通常是因为他们已经在使用操作系统。对于这些,请给命令uname -a并检查您的版本。

您是否有32位版本armv7l,请继续。如果您的版本是64位aarch64,则可以按照 此页面 上的说明进行操作。

依赖关系

OpenCV软件使用其他第三方软件库。这些必须首先安装。有些是随Raspbian操作系统提供的,有些可能是随着时间的推移而收集的,但是要安全起来总比遗憾好,所以这里是完整列表。该过程仅安装最新的软件包。
如果您身处 中国大陆 建议您更换软件源,它会影响您的下载速度,如果您想了解点击这里.

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install cmake gfortran
$ sudo apt-get install libjpeg-dev libtiff-dev libgif-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install libgtk2.0-dev libcanberra-gtk*
$ sudo apt-get install libxvidcore-dev libx264-dev libgtk-3-dev
$ sudo apt-get install libtbb2 libtbb-dev libdc1394-22-dev libv4l-dev
$ sudo apt-get install libopenblas-dev libatlas-base-dev libblas-dev
$ sudo apt-get install libjasper-dev liblapack-dev libhdf5-dev
$ sudo apt-get install gcc-arm* protobuf-compiler

下载OpenCV

安装所有第三方软件后,即可下载OpenCV本身。需要两个包;基本版本和其他贡献。在通过https://opencv.org/releases/下载最新版本之前进行检查。如有必要,请根据最新版本更改zip文件的名称。下载后,您可以解压缩文件。请注意文本框中的换行。这两个命令以 wget 开头,以 zip 结尾。

$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zip

$ unzip opencv.zip
$ unzip opencv_contrib.zip

建议使用更方便的名称(如 opencv 和 opencv_contrib )重命名目录。这使得以后的工作更加轻松。

$ mv opencv-4.4.0 opencv
$ mv opencv_contrib-4.4.0 opencv_contrib

虚拟环境

决定是否为OpenCV安装使用虚拟环境,应用虚拟环境的主要原因之一是保护您的项目免受软件包版本之间的不兼容性。假设您在Raspberry Pi上安装了OpenCV 2.4.13和OpenCV 4.4.0,并在 Python 3 中给出了>> import cv2 的命令。Python将采用哪个版本?将版本放在单独的环境中是解决此问题的方法。(本篇不做赘述,如果有读者需要请留言,作者再更教程)

Build Make

在开始实际构建库之前,必须创建一个目录,可以在其中找到所有构建文件。

$ cd ~/opencv/
$ mkdir build
$ cd build

在这里,您告诉CMake在Raspberry上制作OpenCV的内容,位置和方法。有很多标志。您将认识到的最多。我们通过排除任何(Python)示例或测试来节省空间。-D标志之前只有空白,没有制表符。顺便说一句,最后两个点不是错字。它告诉CMake在哪里可以找到其CMakeLists.txt(大配方文件);一个目录。

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
        -D ENABLE_NEON=ON \
        -D ENABLE_VFPV3=ON \
        -D WITH_OPENMP=ON \
        -D BUILD_TIFF=ON \
        -D WITH_FFMPEG=ON \
        -D WITH_TBB=ON \
        -D BUILD_TBB=ON \
        -D BUILD_TESTS=OFF \
        -D WITH_EIGEN=OFF \
        -D WITH_V4L=ON \
        -D WITH_LIBV4L=ON \
        -D WITH_VTK=OFF \
        -D WITH_QT=OFF \
        -D OPENCV_ENABLE_NONFREE=ON \
        -D INSTALL_C_EXAMPLES=OFF \
        -D INSTALL_PYTHON_EXAMPLES=OFF \
        -D BUILD_NEW_PYTHON_SUPPORT=ON \
        -D BUILD_opencv_python3=TRUE \
        -D OPENCV_GENERATE_PKGCONFIG=ON \
        -D BUILD_EXAMPLES=OFF ..

如果一切顺利,CMake会生成一个看起来像这样的报告(出于可读性目的,我们省略了大多数行)。Python部分非常关键。如果缺少这些内容,OpenCV将不会安装正确的Python库。在这种情况下,通常CMake找不到Python文件夹。当从操作系统中删除太多软件包时,我们遇到了这些问题。还必须启用NEON和VFPV3支持。

-- General configuration for OpenCV 4.4.0 =====================================
--   Version control:               unknown
--
--   Extra modules:
--     Location (extra):            /home/pi/opencv_contrib/modules
--     Version control (extra):     unknown
--
--   Platform:
--     Timestamp:                   2020-07-29T12:40:57Z
--     Host:                        Linux 4.19.75-v7l+ armv7l
--     CMake:                       3.13.4
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               RELEASE
--
--   CPU/HW features:
--     Baseline:                    VFPV3 NEON
--       requested:                 DETECT
--       required:                  VFPV3 NEON
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /usr/bin/c++  (ver 8.3.0)
***********************
--     C Compiler:                  /usr/bin/cc
***********************
--     Documentation:               NO
--     Non-free algorithms:         YES
***********************
--   Video I/O:
--   DC1394:                      YES (2.2.5)
--   FFMPEG:                      YES
--     avcodec:                   YES (58.35.100)
--     avformat:                  YES (58.20.100)
--     avutil:                    YES (56.22.100)
--     swscale:                   YES (5.3.100)
--     avresample:                NO
--   GStreamer:                   NO
--   v4l/v4l2:                    YES (linux/videodev2.h)
--
--   Parallel framework:            TBB (ver 2020.2 interface 11102)
***********************
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.16)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.16)
--     numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.16.2)
--     install path:                lib/python2.7/dist-packages/cv2/python-2.7
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.7.3)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.7m.so (ver 3.7.3)
--     numpy:                       /usr/lib/python3/dist-packages/numpy/core/include (ver 1.16.2)
--     install path:                lib/python3.7/dist-packages/cv2/python-3.7
--
--   Python (for build):            /usr/bin/python2.7
--
--   Java:                          
--     ant:                         /usr/bin/ant (ver 1.10.5)
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
--
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv/build

遇到的另一个问题是缺少c ++编译器。CMake在下面生成了屏幕转储。只需再次给Cmake命令,就解决了问题。在极少数情况下,我们必须sudo apt-get update 和 upgrade 系统,然后CMake才能找到c ++编译器。

-- The CXX compiler identification is GNU 8.3.0
-- The C compiler identification is GNU 8.3.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- broken
CMake Error at /usr/share/cmake-3.13/Modules/CMakeTestCXXCompiler.cmake:45 (message):
 The C++ compiler

   "/usr/bin/c++"

 is not able to compile a simple test program.
***********************
-- Configuring incomplete, errors occurred!
See also "/home/pi/opencv/build/CMakeFiles/CMakeOutput.log".
See also "/home/pi/opencv/build/CMakeFiles/CMakeError.log".

开始实际构建之前,需要扩大内存交换空间。对于日常使用,100 MB的交换内存 swap 就足够了。但是,由于要使用大量构建,因此额外的存储空间至关重要。使用以下命令扩大交换空间 swap。

$ sudo nano /etc/dphys-swapfile

此命令将打开 Nan o,这是一个非常轻巧的文本编辑器,带有系统文件 dphys-swapfile 。使用箭头键,可以将光标移动到 CONF_SWAPSIZE 行,可以在其中输入新值 2048 。接下来,使用Ctrl + O组合键保存。使用Ctrl + X退出会话。

在新的扩大交换空间处于活动状态之前,需要两个附加命令。

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

编译

现在一切都准备好了。这需要很多时间。保持耐心是这里唯一的建议。如果您的构建似乎在99%崩溃了,请不要感到惊讶。那是“正常”的行为。即使您的CPU使用率监控器给出了极低的额定值 (例如 7% )。实际上,您的CPU工作非常辛苦,没有足够的时间正确更新这些使用情况编号。
您可以通过同时运行四个内核 ( make -j4 ) 来加快处理速度。在Raspberry Pi 4上,构建整个库只需要一个多小时。有时,系统完全没有任何原因以 99% 甚至 100% 崩溃。在这种情况下,请按照本页面末尾的说明从头重新开始,然后使用 make -j1 进行重建。
可能在制作过程中会收到很多警告。不要太在意它。由于版本差异很小,它们是由模板重载函数中的细微差异生成的。因此,点上香烛心中默念阿门😉,然后输入下面命令开始构建。

$ make -j4

这个环节是发挥你树莓派性能的时候,希望你的编译和下面一样成功!

现在要是完成了,请使用以下命令将所有生成的软件包安装到系统的数据库中。

$ sudo make install
$ sudo ldconfig
# 清理 (释放 300 KB)
$ make clean
$ sudo apt-get update

在您的Raspberry Pi 4上完成OpenCV 4.4的安装之前,还有一件事情要做。那就是将交换空间 swap 重置回其原来的100 MB。闪存只能写入有限数量的内容。最后,它将耗尽您的SD卡。因此,将内存交换 swap 保持在最低水平是合理的。此外,它还会减慢您的应用程序的速度。最后的命令是删除现在无用的 zip 文件并重新启动系统,以实现所有更改。。

$ sudo nano /etc/dphys-swapfile

set CONF_SWAPSIZE=100 with the Nano text editor

$ cd ~
$ rm opencv.zip
$ rm opencv_contrib.zip
$ sudo reboot

现在是时候检查您在Python中的安装了。您可以使用以下屏幕转储所示的命令。

在极少数情况下,Python找不到OpenCV软件包。它带有消息:“没有名为cv2的模块”。

可能有很多原因,但是很可能是您在 CMake 命令 (libpython 3.7 m.so) 中使用错误的库名称版本号开始构建的。另一个常见原因是 CMake 找不到两个 Python 版本。为此,请参阅您的 CMake 关系。您也可以查看您的OpenCV目录并将文件手动复制到正确的位置。

# Python 2
$ cd ~/opencv/build/lib/
$ sudo cp cv2.so /usr/local/lib/python2.7/dist-packages/cv2/python-2.7

# Python 3
$ cd ~/opencv/build/lib/python3
$ sudo cp cv2.cpython-37m-arm-linux-gnueabihf.so \
 /usr/local/lib/python3.7/dist-packages/cv2/python-3.7

总是有可能在CMake中更改某些-D开关并重建软件包。保留已构建的模块,仅生成新的模块。当然,最后,当所有内容都必须链接到一个大的Python文件中时,您可能仍然面临漫长的等待。如果您想要干净的,请通过以下单个命令删除完整的构建目录及其所有子目录。接下来,创建一个具有相同名称的新目录,然后重新开始。

$ cd ~/opencv
$ sudo rm -r build

生成信息

如果您将来想知道OpenCV版本中包含哪些软件模块,则始终可以使用以下Python命令找到你想要的。

$ python
>>> import cv2
>>> print cv2.getBuildInformation()

或使用下面的C ++代码示例。

#include <opencv2/opencv.hpp>

int main(void)
{
    std::cout << "OpenCV version : " << cv::CV_VERSION << endl;
    std::cout << "Major version : " << cv::CV_MAJOR_VERSION << endl;
    std::cout << "Minor version : " << cv::CV_MINOR_VERSION << endl;
    std::cout << "Subminor version : " << cv::CV_SUBMINOR_VERSION << endl;
    std::cout << cv::getBuildInformation() << std::endl;
}

然后您得到下面结果

General configuration for OpenCV 4.4.0 =====================================
 Version control:               unknown

 Extra modules:
   Location (extra):            /home/pi/opencv_contrib/modules
   Version control (extra):     unknown

 Platform:
   Timestamp:                   2020-07-29T12:40:57Z
   Host:                        Linux 5.4.51-v7l+ armv7l
   CMake:                       3.13.4
   CMake generator:             Unix Makefiles
   CMake build tool:            /usr/bin/make
   Configuration:               RELEASE

 CPU/HW features:
   Baseline:                    VFPV3 NEON
     requested:                 DETECT
     required:                  VFPV3 NEON

 C/C++:
   Built as dynamic libs?:      YES
   C++ standard:                11
   C++ Compiler:                /usr/bin/c++  (ver 8.3.0)
   C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -fopenmp -O3 -DNDEBUG  -DNDEBUG
   C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -fopenmp -g  -O0 -DDEBUG -D_DEBUG
   C Compiler:                  /usr/bin/cc
   C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fopenmp -O3 -DNDEBUG  -DNDEBUG
   C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fopenmp -g  -O0 -DDEBUG -D_DEBUG
   Linker flags (Release):      -Wl,--gc-sections -Wl,--as-needed  
   Linker flags (Debug):        -Wl,--gc-sections -Wl,--as-needed  
   ccache:                      NO
   Precompiled headers:         NO
   Extra dependencies:          dl m pthread rt
   3rdparty dependencies:

 OpenCV modules:
   To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hdf hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor ml objdetect optflow phase_unwrapping photo plot python2 python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
   Disabled:                    world
   Disabled by dependency:      -
   Unavailable:                 alphamat cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv java js julia matlab ovis sfm viz
   Applications:                perf_tests apps
   Documentation:               NO
   Non-free algorithms:         YES

 GUI:
   GTK+:                        YES (ver 3.24.5)
     GThread :                  YES (ver 2.58.3)
     GtkGlExt:                  NO

 Media I/O:
   ZLib:                        /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.11)
   JPEG:                        /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver 62)
   WEBP:                        build (ver encoder: 0x020f)
   PNG:                         /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.6.36)
   TIFF:                        build (ver 42 - 4.0.10)
   JPEG 2000:                   /usr/lib/arm-linux-gnueabihf/libjasper.so (ver 1.900.1)
   OpenEXR:                     build (ver 2.3.0)
   HDR:                         YES
   SUNRASTER:                   YES
   PXM:                         YES
   PFM:                         YES

 Video I/O:
   DC1394:                      YES (2.2.5)
   FFMPEG:                      YES
     avcodec:                   YES (58.35.100)
     avformat:                  YES (58.20.100)
     avutil:                    YES (56.22.100)
     swscale:                   YES (5.3.100)
     avresample:                NO
   GStreamer:                   NO
   v4l/v4l2:                    YES (linux/videodev2.h)

 Parallel framework:            TBB (ver 2020.2 interface 11102)

 Trace:                         YES (with Intel ITT)

 Other third-party libraries:
   Tengine:                     YES (/home/pi/tengine/core/lib/libtengine.a)
   Lapack:                      NO
   Custom HAL:                  YES (carotene (ver 0.0.1))
   Protobuf:                    build (3.5.1)

 OpenCL:                        YES (no extra features)
   Include path:                /home/pi/opencv/3rdparty/include/opencl/1.2
   Link libraries:              Dynamic load

 Python 2:
   Interpreter:                 /usr/bin/python2.7 (ver 2.7.16)
   Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.16)
   numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.16.2)
   install path:                lib/python2.7/dist-packages/cv2/python-2.7

 Python 3:
   Interpreter:                 /usr/bin/python3 (ver 3.7.3)
   Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.7m.so (ver 3.7.3)
   numpy:                       /usr/lib/python3/dist-packages/numpy/core/include (ver 1.16.2)
   install path:                lib/python3.7/dist-packages/cv2/python-3.7

 Python (for build):            /usr/bin/python2.7

 Java:                          
   ant:                         NO
   JNI:                         NO
   Java wrappers:               NO
   Java tests:                  NO

 Install to:                    /usr/local
-----------------------------------------------------------------
「点点赞赏,手留余香」

1人已赞赏

  • w1149797685

    W1149797685

    ¥ 100.00
Mr-XiaoYi给Mr-XiaoYi打赏
×
予人玫瑰,手有余香
  • 2
  • 5
  • 10
  • 20
  • 50
2
支付

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

2021-02-02

2021-02-07

发表评论

表情 贴图 链接 私密 格式 签到
扫一扫二维码分享