0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在JetsonNano上编译OpenCV源码与OpenCV C++ YOLOv5程序演示

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-11-10 11:28 次阅读

编译OpenCV最新4.5.x版本

Jetson Nano自带的OpenCV版本比较低,Jetpack4.6对应的OpenCV版本为4.1的,有图为证:

5c9093c8-6012-11ed-8abf-dac502259ad0.png

OpenCV当前最新版本已经到了4.5跟4.6了,4.5.x中OpenCV DNN支持了很多新的模型推理跟新的特性都无法在OpenCV4.1上演示,所以我决定从源码编译OpenCV升级版本到 4.5.4,然后我发一个非常好的网站,提供了完整的脚本,于是我直接运行了该脚本就完成了安装,整个安装过程需要等待几个小时,耐心点。这个完整的脚本下载地址如下:

https://github.com/Qengineering/Install-OpenCV-Jetson-Nano
关于脚本每一个步骤的解释与说明如下:
https://qengineering.eu/install-opencv-4.5-on-jetson-nano.html
这里我也搬运了一下,选择OpenCV4.5.4版本完成编译与安装,对应完整的脚本如下:
#!/bin/bash
set-e

echo"InstallingOpenCV4.5.4onyourJetsonNano"
echo"Itwilltake2.5hours!"

#revealtheCUDAlocation
cd~
sudosh-c"echo'/usr/local/cuda/lib64'>>/etc/ld.so.conf.d/nvidia-tegra.conf"
sudoldconfig

#installthedependencies
sudoapt-getinstall-ybuild-essentialcmakegitunzippkg-configzlib1g-dev
sudoapt-getinstall-ylibjpeg-devlibjpeg8-devlibjpeg-turbo8-devlibpng-devlibtiff-dev
sudoapt-getinstall-ylibavcodec-devlibavformat-devlibswscale-devlibglew-dev
sudoapt-getinstall-ylibgtk2.0-devlibgtk-3-devlibcanberra-gtk*
sudoapt-getinstall-ypython-devpython-numpypython-pip
sudoapt-getinstall-ypython3-devpython3-numpypython3-pip
sudoapt-getinstall-ylibxvidcore-devlibx264-devlibgtk-3-dev
sudoapt-getinstall-ylibtbb2libtbb-devlibdc1394-22-devlibxine2-dev
sudoapt-getinstall-ygstreamer1.0-toolslibv4l-devv4l-utilsqv4l2
sudoapt-getinstall-ylibgstreamer-plugins-base1.0-devlibgstreamer-plugins-good1.0-dev
sudoapt-getinstall-ylibavresample-devlibvorbis-devlibxine2-devlibtesseract-dev
sudoapt-getinstall-ylibfaac-devlibmp3lame-devlibtheora-devlibpostproc-dev
sudoapt-getinstall-ylibopencore-amrnb-devlibopencore-amrwb-dev
sudoapt-getinstall-ylibopenblas-devlibatlas-base-devlibblas-dev
sudoapt-getinstall-yliblapack-devliblapacke-devlibeigen3-devgfortran
sudoapt-getinstall-ylibhdf5-devprotobuf-compiler
sudoapt-getinstall-ylibprotobuf-devlibgoogle-glog-devlibgflags-dev

#removeoldversionsorpreviousbuilds
cd~
sudorm-rfopencv*
#downloadthelatestversion
wget-Oopencv.ziphttps://github.com/opencv/opencv/archive/4.5.4.zip
wget-Oopencv_contrib.ziphttps://github.com/opencv/opencv_contrib/archive/4.5.4.zip
#unpack
unzipopencv.zip
unzipopencv_contrib.zip
#someadministrationtomakeliveeasierlateron
mvopencv-4.5.4opencv
mvopencv_contrib-4.5.4opencv_contrib
#cleanupthezipfiles
rmopencv.zip
rmopencv_contrib.zip

#setinstalldir
cd~/opencv
mkdirbuild
cdbuild

#runcmake
cmake-DCMAKE_BUILD_TYPE=RELEASE
-DCMAKE_INSTALL_PREFIX=/usr
-DOPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules
-DEIGEN_INCLUDE_PATH=/usr/include/eigen3
-DWITH_OPENCL=OFF
-DWITH_CUDA=ON
-DCUDA_ARCH_BIN=5.3
-DCUDA_ARCH_PTX=""
-DWITH_CUDNN=ON
-DWITH_CUBLAS=ON
-DENABLE_FAST_MATH=ON
-DCUDA_FAST_MATH=ON
-DOPENCV_DNN_CUDA=ON
-DENABLE_NEON=ON
-DWITH_QT=OFF
-DWITH_OPENMP=ON
-DBUILD_TIFF=ON
-DWITH_FFMPEG=ON
-DWITH_GSTREAMER=ON
-DWITH_TBB=ON
-DBUILD_TBB=ON
-DBUILD_TESTS=OFF
-DWITH_EIGEN=ON
-DWITH_V4L=ON
-DWITH_LIBV4L=ON
-DOPENCV_ENABLE_NONFREE=ON
-DINSTALL_C_EXAMPLES=OFF
-DINSTALL_PYTHON_EXAMPLES=OFF
-DBUILD_opencv_python3=TRUE
-DOPENCV_GENERATE_PKGCONFIG=ON
-DBUILD_EXAMPLES=OFF..

#runmake
FREE_MEM="$(free-m|awk'/^Swap/{print$2}')"
#Use"-j4"onlyswapspaceislargerthan5.5GB
if[["FREE_MEM"-gt"5500"]];then
NO_JOB=4
else
echo"Duetolimitedswap,makeonlyuses1core"
NO_JOB=1
fi
make-j${NO_JOB}

sudorm-r/usr/include/opencv4/opencv2
sudomakeinstall
sudoldconfig

#cleaning(frees300MB)
makeclean
sudoapt-getupdate

echo"Congratulations!"
echo"You'vesuccessfullyinstalledOpenCV4.5.4onyourJetsonNano"

直接在终端命令行中执行下载下来得脚本文件就可以完成安装了。我安装完整之后得显示如下:

5cad7a1a-6012-11ed-8abf-dac502259ad0.png

验证与导入安装好之后的OpenCV4.5.4版本

5ccff90a-6012-11ed-8abf-dac502259ad0.png

OpenCV C++程序编译与演示

OpenCV YOLOv5跟人脸检测的演示C++程序是我以前写好的,直接拿过来,然后构建了一个项目目录如下:

5cf4b2a4-6012-11ed-8abf-dac502259ad0.png

拷贝到jetson的home目录下,cmake编译

5d0a8eda-6012-11ed-8abf-dac502259ad0.png

然后make生成执行文件:

5d45d0c6-6012-11ed-8abf-dac502259ad0.png

运行target

5d699920-6012-11ed-8abf-dac502259ad0.png

显示运行界面如下:

5dabfe00-6012-11ed-8abf-dac502259ad0.png

5dc7b172-6012-11ed-8abf-dac502259ad0.png

OpenCV DNN人脸检测演示:

5e0d3bca-6012-11ed-8abf-dac502259ad0.png

CMakeLists.txt文件里面得内容如下:

cmake_minimum_required(VERSION2.8)

#声明一个cmake工程
project(yolov5_opencv_demo)

#设置编译模式
#set(CMAKE_BUILD_TYPE"Debug")

#添加OPENCV库
#指定OpenCV版本,代码如下
#find_package(OpenCV4.5.4REQUIRED)
#如果不需要指定OpenCV版本,代码如下
find_package(OpenCVREQUIRED)

include_directories(
./src/)


#添加OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})

#显示OpenCV_INCLUDE_DIRS的值
message(${OpenCV_INCLUDE_DIRS})

FILE(GLOB_RECURSETEST_SRC
src/*.cpp
)

#添加一个可执行程序
#语法:add_executable(程序名源代码文件)
add_executable(targetyolov5_opencv.cpp${TEST_SRC})

#将库文件链接到可执行程序上
target_link_libraries(target${OpenCV_LIBS})

OpenCV+ YOLOv5,CUDA加速支持的源码

#include
#include
#include

std::stringlabel_map="classes.txt";
intmain(intargc,char**argv){
std::vectorclassNames;
std::ifstreamfp(label_map);
std::stringname;
while(!fp.eof()){
getline(fp,name);
if(name.length()){
classNames.push_back(name);
}
}
fp.close();
std::vectorcolors;
colors.push_back(cv::Scalar(0,255,0));
colors.push_back(cv::Scalar(0,255,255));
colors.push_back(cv::Scalar(255,255,0));
colors.push_back(cv::Scalar(255,0,0));
colors.push_back(cv::Scalar(0,0,255));

std::stringonnxpath="yolov5s.onnx";
autonet=cv::readNetFromONNX(onnxpath);
net.setPreferableBackend(cv::DNN_BACKEND_CUDA);
net.setPreferableTarget(cv::DNN_TARGET_CUDA);
cv::VideoCapturecapture("example_dsh.mp4");
cv::Matframe;
while(true){
boolret=capture.read(frame);
if(frame.empty()){
break;
}
int64start=cv::getTickCount();
//图象预处理-格式化操作
intw=frame.cols;
inth=frame.rows;
int_max=std::max(h,w);
cv::Matimage=cv::Size(_max,_max),CV_8UC3);
cv::Rectroi(0,0,w,h);
frame.copyTo(image(roi));

floatx_factor=image.cols/640.0f;
floaty_factor=image.rows/640.0f;

//推理
cv::Matblob=cv::blobFromImage(image,1/255.0,cv::Size(640,640),cv::Scalar(0,0,0),true,false);
net.setInput(blob);
cv::Matpreds=net.forward();

//后处理,1x25200x85
cv::Matdet_output(preds.size[1],preds.size[2],CV_32F,preds.ptr());
floatconfidence_threshold=0.5;
std::vectorboxes;
std::vectorclassIds;
std::vectorconfidences;
for(inti=0;i< det_output.rows; i++) {
            float confidence = det_output.at(i,4);
if(confidence< 0.25) {
                continue;
            }
            cv::Mat classes_scores = det_output.row(i).colRange(5, preds.size[2]);
            cv::Point classIdPoint;
            double score;
            minMaxLoc(classes_scores, 0, &score, 0, &classIdPoint);

            // 置信度 0~1之间
            if (score >0.25)
{
floatcx=det_output.at(i,0);
floatcy=det_output.at(i,1);
floatow=det_output.at(i,2);
floatoh=det_output.at(i,3);
intx=static_cast((cx-0.5*ow)*x_factor);
inty=static_cast((cy-0.5*oh)*y_factor);
intwidth=static_cast(ow*x_factor);
intheight=static_cast(oh*y_factor);
cv::Rectbox;
box.x=x;
box.y=y;
box.width=width;
box.height=height;

boxes.push_back(box);
classIds.push_back(classIdPoint.x);
confidences.push_back(score);
}
}

//NMS
std::vectorindexes;
cv::NMSBoxes(boxes,confidences,0.25,0.50,indexes);
for(size_ti=0;i< indexes.size(); i++) {
            int index = indexes[i];
            int idx = classIds[index];
            cv::rectangle(frame, boxes[index], colors[idx%5], 2, 8);
            cv::rectangle(frame, cv::Point(boxes[index].tl().x, boxes[index].tl().y - 20),
                cv::Point(boxes[index].br().x, boxes[index].tl().y), cv::Scalar(255, 255, 255), -1);
            cv::putText(frame, classNames[idx], cv::Point(boxes[index].tl().x, boxes[index].tl().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(0, 0, 0));
        }

        float t = (cv::getTickCount() - start) / static_cast(cv::getTickFrequency());
putText(frame,cv::format("FPS:%.2f",1.0/t),cv::Point(20,40),cv::FONT_HERSHEY_PLAIN,2.0,cv::Scalar(255,0,0),2,8);

charc=cv::waitKey(1);
if(c==27){
break;
}
cv::imshow("OpenCV4.5.4CUDA+YOLOv5",frame);
}
cv::waitKey(0);
cv::destroyAllWindows();
return0;
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    640

    浏览量

    29198
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73638
  • OpenCV
    +关注

    关注

    31

    文章

    635

    浏览量

    41343

原文标题:在JetsonNano上编译OpenCV源码与OpenCV C++ YOLOv5程序演示

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenCV+CUDA编译实现YOLOv5能加速

    对比一下,加速效果真得是杠杠滴!所以值得编译OpenCV+CUDA支持,因为它不光加速深度学习模型推理,对传统图像处理均有加速!
    的头像 发表于 07-18 10:27 2599次阅读
    <b class='flag-5'>OpenCV</b>+CUDA<b class='flag-5'>编译</b>实现<b class='flag-5'>YOLOv5</b>能加速

    Ubuntu系统下编译OpenCV4.8源码记录

    Jetson开发板编译OpenCV源码编译运行OpenCV
    的头像 发表于 10-27 16:07 1646次阅读
    Ubuntu系统下<b class='flag-5'>编译</b><b class='flag-5'>OpenCV</b>4.8<b class='flag-5'>源码</b>记录

    RK3568教学实验箱实现基于YOLOV5的算法物体识别案例详解

    安装了所有必要的依赖。这通常包括 torch、torchvision 和 opencv-python。 (2)下载预训练模型 YOLOv5 提供了多个预训练模型,可以从官方仓库或相关资源中下载。 (3
    发表于 12-03 14:56

    【WRTnode2R试用体验】OpenCV交叉编译,开发OpenCV C++程序

    。sudo apt-get install cmake cmake-qt-guicmake-gui选好源码的目录,这里我桌面上创建了一个目录叫opencv-mipsel,用来存放编译
    发表于 10-26 20:25

    【Raspberry Pi 3试用体验】+编译opencv

    的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口
    发表于 05-05 18:13

    求大佬分享RK3399运行瑞芯微官方yolov5 C++代码

    求大佬分享RK3399运行瑞芯微官方yolov5 C++代码
    发表于 03-07 06:33

    怎样使用PyTorch Hub去加载YOLOv5模型

    显示了PIL和OpenCV图像源的批量推理。可以打印到控制台,保存到,支持的环境中显示到屏幕,并以张量或pandas数据帧的形式返回。对于所有推理选项,请参阅 YOLOv5Auto
    发表于 07-22 16:02

    OpenCV C++程序编译演示

    1、JetsonNano编译OpenCV源码OpenC
    发表于 11-10 16:42

    如何使用Borland C++ Builder6.0来开发OpenCV程序

    本文档的主要内容详细介绍的是如何使用Borland C++ Builder6.0来开发OpenCV程序
    发表于 05-26 17:32 14次下载
    如何使用Borland <b class='flag-5'>C++</b> Builder6.0来开发<b class='flag-5'>OpenCV</b>的<b class='flag-5'>程序</b>

    YOLOv5OpenCV的推理程序

    YOLOv5官方给出的YOLOv5OpenCV推理的程序相对来说是比较通俗易懂的,条理清晰,
    的头像 发表于 11-02 10:16 1913次阅读

    C++中使用OpenVINO工具包部署YOLOv5模型

    下载并转换YOLOv5预训练模型的详细步骤,请参考:《基于OpenVINO™2022.2和蝰蛇峡谷优化并部署YOLOv5模型》,本文所使用的OpenVINO是2022.3 LTS版。
    的头像 发表于 02-15 16:53 4654次阅读

    OpenCV4.8+YOLOv8对象检测C++推理演示

    自从YOLOv5更新成7.0版本,YOLOv8推出以后,OpenCV4.6以前的版本都无法再加载导出ONNX格式模型了,只有OpenCV4.7以上版本才可以支持最新版本
    的头像 发表于 09-27 11:07 1544次阅读
    <b class='flag-5'>OpenCV4.8+YOLOv</b>8对象检测<b class='flag-5'>C++</b>推理<b class='flag-5'>演示</b>

    RK3568OpenCV编译移植

    算法丰富多样,ARM嵌入式平台上也适用于做算法的移植。本系统选择将OpenCV3.2.0编译移植到开发板,开发环境是虚拟机上安装的Ubuntu16.04。由于
    发表于 12-20 10:08 68次下载

    基于QT5+OpenCV+OpenVINO C++的应用打包过程

    我用QT C++写了一个YOLOv5模型推理演示应用。
    的头像 发表于 01-26 10:17 1257次阅读
    基于QT<b class='flag-5'>5+OpenCV</b>+OpenVINO <b class='flag-5'>C++</b>的应用打包过程

    OpenCV图像识别C++代码

    的头文件 您的C++代码中,包含以下必要的头文件: # include # include # include # include # include # include # include 读取图像
    的头像 发表于 07-16 10:42 1989次阅读