Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

今天需要在嵌入式设备端运行C的程序,里面有依赖OpenCV的部分,这就需要编译安装好OpenCV才行,这个对于我来说还是比较陌生的,我很少用C,所以这里面也没少折腾,一路上遇上了很多的报错,这里我将完整的安装实践记录下来备忘,也希望帮到有需要的人。

首先是下载所需要的源码数据:

OpenCV项目仓库在这里,首页截图如下所示:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

很火的项目了。

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

网速比较好的话可以使用下面的命令:

git clone https://github.com/opencv/opencv.git

我是使用git下载老是提示下载失败,所以我是直接在页面端下载项目,之后上传的。

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

下载完成如下:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

接下来下载另一个项目opencv_contrib,地址在这里,首页截图如下所示:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

网络好的话可以使用如下命令:

git clone https://github.com/opencv/opencv_contrib.git

同样我还是直接选择了页面端下载项目,如下:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

下载完成如下:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

之后上传到Linux环境下,选择自己想要安装的路径,进入该路径,执行:

mkdir opencv_build && cd opencv_build

这里创建opencv_build目录用于存放OpenCV相关的项目。

首先安装一下所需要的基础环境:

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install ffmpeg

在查资料的过程中了解到其实OpenCV编译基本都会报错的,最先的报错就是缺少各种各样的文件,所以这里我选择将一些常见报错所需要的文件提前下载下来传到对应目录下,文件在这里

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

接下来解压缩:

#解压缩
unzip opencv-4.x.zip
unzip opencv_contrib-4.x.zip
#重命名
mv opencv-4.x opencv
mv opencv_contrib-4.x opencv_contrib
#复制移动
cp -r opencv_contrib opencv

之后进入OpenCV目录,执行:

mkdir build & cd build

接下来基于cmake命令来生成makefile文件,我这里直接给出来最终成功好用的命令,避免重走弯路:

cmake -D ENABLE_PRECOMPILED_HEADERS=OFF -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/root/opencv_build/opencv/opencv_contrib/modules/ ..

这里面的OPENCV_EXTRA_MODULES_PATH是需要自己根据自己的安装路径进行调整的,比如我这里的安装路径是:/root/opencv_build/,仿照着替换自己的即可。

这个过程需要的时间比较久,根据自己的硬件条件大家所需要的时间也是不一样的,静静等待即可,执行完成后执行如下命令启动编译:

make -j8

这里我就遇上了一个报错如下:

c++: internal compiler error: Killed (program cc1plus) Please submit a full bug report, with preproc

查资料发现:这是因为编译安装时所需要的内存不够了,解决这个问题最简单直接有效的办法就是不载指定多核编译,直接make即可,这样的缺点就是速度比较慢,不过只要不报错就行了,等待编译完成之后即可安装了。

make install

输出如下:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

这里我其实也遇到了一个报错:

CMake Error at lib/cmake_install.cmake:48 (file):
  file INSTALL cannot copy file
  "/cmake/t3/build/lib/libhello.so.1.2" to
  "/usr/lib/libhello.so.1.2".

查询网上给的解决方案说的是权限不足,但是我本身就是root权限执行操作的,不可能是权限不足的问题,这个问题网上清一色的答案全部都是说权限不足,搞得我很苦恼,实在找不到解决办法的时候我突然想到是否可以手动复制一下这个文件到指定的目录里面去呢?

结果我手动执行cp命令之后就发现真正的问题所在了,原来是我的磁盘满了,导致没有多余的空间可以复制文件了!多么白痴的原因啊,我赶紧删除了压缩包和一些其他的文件数据腾出来了一定的磁盘空间,重新执行make install这次终于成功安装完成了。

最后我查看版本信息:

pkg-config --modversion opencv4

结果又报错了:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

详情如下:

Package opencv4 was not found in the pkg-config search path.

Perhaps you should add the directory containing opencv4.pc'
to the PKG_CONFIG_PATH environment variable
</code></pre>
<p>关于这个报错,网上的资料也挺多,但是很多讲的很杂乱,不利于新手学习解决,这里我找到了一个比较好的文章,就是按照这个步骤直接解决了,文章在<a href="https://github.com/hybridgroup/gocv/issues/363" title="这里">这里</a>。</p>
<p><img alt="Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230619/f7aa2c4d545b48ffaab12613f395b387.png" /></p>
<p>这里是解决方案:</p>
<p><img alt="Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230619/d4237778db464ed89b1ae16502811647.png" /></p>
<p>核心思想就是要自己在这个pkgconfig目录下创建opencv.pc文件,并将相应的信息写入opencv.pc中,报错pkgconfig可以读取到,我发现本地连pkgconfig这个目录都没有,就直接手动创建了这个目录:</p>
<pre><code class="language-python">mkdir pkgconfig
cd pkgconfig
vim opencv.pc
</code></pre>
<p>然后将下面的信息写入:</p>
<pre><code class="language-python">prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: opencv
Description: The opencv library
Version:4.x
Cflags: -I${includedir}/opencv4
Libs: -L${libdir} -lopencv_stitching -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
</code></pre>
<p>最后一步就是修改环境变量:</p>
<pre><code class="language-python">export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
</code></pre>
<p><img alt="Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230619/537191c120674848b6ea131a6b4773ba.png" /></p>
<p>到这里OpenCV的编译安装就结束了。</p>
<p>我这里安装OpenCV是做目标检测使用的,所以这里简单拿一个样例跑一下看看:</p>
<pre><code class="language-cpp">#include "yolo-fastestv2.h"

int main()
{
    static const char* class_names[] = {
        "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
        "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
        "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
        "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
        "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
        "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
        "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
        "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
        "hair drier", "toothbrush"
    };

    yoloFastestv2 api;

    api.loadModel("./model/yolo-fastestv2-opt.param",
                  "./model/yolo-fastestv2-opt.bin");

    cv::Mat cvImg = cv::imread("test.jpg");

    std::vector boxes;
    api.detection(cvImg, boxes);

    for (int i = 0; i < boxes.size(); i++) {
        std::cout< cvImg.cols)
            x = cvImg.cols - label_size.width;

        cv::rectangle(cvImg, cv::Rect(cv::Point(x, y), cv::Size(label_size.width, label_size.height + baseLine)),
                      cv::Scalar(255, 255, 255), -1);

        cv::putText(cvImg, text, cv::Point(x, y + label_size.height),
                    cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));

        cv::rectangle (cvImg, cv::Point(boxes[i].x1, boxes[i].y1),
                       cv::Point(boxes[i].x2, boxes[i].y2), cv::Scalar(255, 255, 0), 2, 2, 0);
    }

    cv::imwrite("output.png", cvImg);

    return 0;
}
</code></pre>
<p>编译命令如下:</p>
<pre><code class="language-python">g++ -g -o demo demo.cpp src/yolo-fastestv2.cpp -I src/include -I include/ncnn lib/libncnn.a -config --libs --cflags opencv` -fopenmp

执行完成后生成可执行文件:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

执行报错:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

详情如下:

error while loading shared libraries: libopencv_imgcodecs.so.406: cannot ope

报错本质不难理解就是文件找不到了,这里实在是不想折腾配置了就采用一个简单的办法来解决,不是找不到吗?你找不到我就把这个文件所在目录加到路径路面去让你能找到不就行了,执行:

export LD_LIBRARY_PATH=/root/opencv_build/opencv/build/lib/:$LD_LIBRARY_PATH

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

重新执行demo,结果如下:

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

可以看到:已经能够正常计算输出了,我们看下原始数据和结果数据。

test.jpg

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

output.png

Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

到这里OpenCV源码编译安装、深度学习检测项目实例运行就已经全部结束了,记录一下。

Original: https://blog.csdn.net/Together_CZ/article/details/126588000
Author: Together_CZ
Title: Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/681781/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球