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

编译opencv最新4.5.x版本
jetson nano自带的opencv版本比较低,jetpack4.6对应的opencv版本为4.1的,有图为证:
而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/bashset -eecho installing opencv 4.5.4 on your jetson nanoecho it will take 2.5 hours !# reveal the cuda locationcd ~sudo sh -c echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf.d/nvidia-tegra.confsudo ldconfig# install the dependenciessudo apt-get install -y build-essential cmake git unzip pkg-config zlib1g-devsudo apt-get install -y libjpeg-dev libjpeg8-dev libjpeg-turbo8-dev libpng-dev libtiff-devsudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libglew-devsudo apt-get install -y libgtk2.0-dev libgtk-3-dev libcanberra-gtk*sudo apt-get install -y python-dev python-numpy python-pipsudo apt-get install -y python3-dev python3-numpy python3-pipsudo apt-get install -y libxvidcore-dev libx264-dev libgtk-3-devsudo apt-get install -y libtbb2 libtbb-dev libdc1394-22-dev libxine2-devsudo apt-get install -y gstreamer1.0-tools libv4l-dev v4l-utils qv4l2 sudo apt-get install -y libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-devsudo apt-get install -y libavresample-dev libvorbis-dev libxine2-dev libtesseract-devsudo apt-get install -y libfaac-dev libmp3lame-dev libtheora-dev libpostproc-devsudo apt-get install -y libopencore-amrnb-dev libopencore-amrwb-devsudo apt-get install -y libopenblas-dev libatlas-base-dev libblas-devsudo apt-get install -y liblapack-dev liblapacke-dev libeigen3-dev gfortransudo apt-get install -y libhdf5-dev protobuf-compilersudo apt-get install -y libprotobuf-dev libgoogle-glog-dev libgflags-dev# remove old versions or previous buildscd ~ sudo rm -rf opencv*# download the latest versionwget -o opencv.zip https://github.com/opencv/opencv/archive/4.5.4.zip wget -o opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.4.zip # unpackunzip opencv.zip unzip opencv_contrib.zip # some administration to make live easier later onmv opencv-4.5.4 opencvmv opencv_contrib-4.5.4 opencv_contrib# clean up the zip filesrm opencv.ziprm opencv_contrib.zip# set install dircd ~/opencvmkdir buildcd build# run cmakecmake -d cmake_build_type=release -d cmake_install_prefix=/usr -d opencv_extra_modules_path=~/opencv_contrib/modules -d eigen_include_path=/usr/include/eigen3 -d with_opencl=off -d with_cuda=on -d cuda_arch_bin=5.3 -d cuda_arch_ptx= -d with_cudnn=on -d with_cublas=on -d enable_fast_math=on -d cuda_fast_math=on -d opencv_dnn_cuda=on -d enable_neon=on -d with_qt=off -d with_openmp=on -d build_tiff=on -d with_ffmpeg=on -d with_gstreamer=on -d with_tbb=on -d build_tbb=on -d build_tests=off -d with_eigen=on -d with_v4l=on -d with_libv4l=on -d opencv_enable_nonfree=on -d install_c_examples=off -d install_python_examples=off -d build_opencv_python3=true -d opencv_generate_pkgconfig=on -d build_examples=off ..# run makefree_mem=$(free -m | awk '/^swap/ {print $2}')# use -j 4 only swap space is larger than 5.5gbif [[ free_mem -gt 5500 ]]; then  no_job=4else  echo due to limited swap, make only uses 1 core  no_job=1fimake -j ${no_job} sudo rm -r /usr/include/opencv4/opencv2sudo make installsudo ldconfig# cleaning (frees 300 mb)make cleansudo apt-get updateecho congratulations!echo you've successfully installed opencv 4.5.4 on your jetson nano  
直接在终端命令行中执行下载下来得脚本文件就可以完成安装了。我安装完整之后得显示如下:
验证与导入安装好之后的opencv4.5.4版本
opencv c++程序编译与演示
opencv yolov5跟人脸检测的演示c++程序是我以前写好的,直接拿过来,然后构建了一个项目目录如下:
拷贝到jetson的home目录下,cmake编译
然后make生成执行文件:
运行target
显示运行界面如下:
opencv dnn人脸检测演示:
cmakelists.txt文件里面得内容如下:
cmake_minimum_required( version 2.8 )# 声明一个 cmake 工程project(yolov5_opencv_demo)# 设置编译模式#set( cmake_build_type debug )#添加opencv库#指定opencv版本,代码如下#find_package(opencv 4.5.4 required)#如果不需要指定opencv版本,代码如下find_package(opencv required)include_directories(    ./src/)#添加opencv头文件include_directories(${opencv_include_dirs})#显示opencv_include_dirs的值message(${opencv_include_dirs})file(glob_recurse test_src    src/*.cpp    )# 添加一个可执行程序# 语法:add_executable( 程序名 源代码文件 )add_executable(target yolov5_opencv.cpp ${test_src})# 将库文件链接到可执行程序上target_link_libraries(target  ${opencv_libs})  
opencv + yolov5,cuda加速支持的源码
#include #include #include std::string label_map = classes.txt;int main(int argc, char** argv) {    std::vector classnames;    std::ifstream fp(label_map);    std::string name;    while (!fp.eof()) {        getline(fp, name);        if (name.length()) {            classnames.push_back(name);        }    }    fp.close();    std::vector colors;    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::string onnxpath = yolov5s.onnx;    auto net = cv::readnetfromonnx(onnxpath);    net.setpreferablebackend(cv::dnn_backend_cuda);    net.setpreferabletarget(cv::dnn_target_cuda);    cv::videocapture capture(example_dsh.mp4);    cv::mat frame;    while (true) {        bool ret = capture.read(frame);        if (frame.empty()) {            break;        }        int64 start = cv::gettickcount();        // 图象预处理 - 格式化操作        int w = frame.cols;        int h = frame.rows;        int _max = std::max(h, w);        cv::mat image = cv::size(_max, _max), cv_8uc3);        cv::rect roi(0, 0, w, h);        frame.copyto(image(roi));        float x_factor = image.cols / 640.0f;        float y_factor = image.rows / 640.0f;        // 推理        cv::mat blob = cv::blobfromimage(image, 1 / 255.0, cv::size(640, 640), cv::scalar(0, 0, 0), true, false);        net.setinput(blob);        cv::mat preds = net.forward();        // 后处理, 1x25200x85        cv::mat det_output(preds.size[1], preds.size[2], cv_32f, preds.ptr());        float confidence_threshold = 0.5;        std::vector boxes;        std::vector classids;        std::vector confidences;        for (int i = 0; i < det_output.rows; i++) {            float confidence = det_output.at(i, 4);            if (confidence  0.25)            {                float cx = det_output.at(i, 0);                float cy = det_output.at(i, 1);                float ow = det_output.at(i, 2);                float oh = det_output.at(i, 3);                int x = static_cast((cx - 0.5 * ow) * x_factor);                int y = static_cast((cy - 0.5 * oh) * y_factor);                int width = static_cast(ow * x_factor);                int height = static_cast(oh * y_factor);                cv::rect box;                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::vector indexes;        cv::nmsboxes(boxes, confidences, 0.25, 0.50, indexes);        for (size_t i = 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);        char c = cv::waitkey(1);        if (c == 27) {            break;        }        cv::imshow(opencv4.5.4 cuda + yolov5, frame);    }    cv::waitkey(0);    cv::destroyallwindows();    return 0;}


Wi-Fi 7相对于之前的Wi-Fi技术有哪些新的技术革新?
嵌入式系统中安全性的重要性与开发设计
巧用DSP在电源设计中的应用
升压式DC/DC变换器应用参考电路
西北大学研究小组用“压缩块”方法,解开了比特币的可扩展性问题
在JetsonNano上编译OpenCV源码与OpenCV C++ YOLOv5程序演示
PCB阻抗不连续解决方法分析
DO-218AB封装Z5W27V系列TVS产品介绍
收购万达百货后,苏宁时尚百货总裁首度发声
找方案 | 世平集团基于 NXP LPC845 的 BLDC 高速电机无感方波驱动方案
卫星宽带通信系统,卫星宽带通信系统是什么意思
用1.8V供电可输出5V的升压电路(TPS60109升压电源),TPS60109 step-up power supply
人体感应灯如何检测人的存在?
电液比例溢流阀的原理及设计
大华“喜提”56亿战略投资,中国移动能为它带来啥?
重塑企业网络安全边界,零极分布式可信云构筑企业安全“护城河”!
LED显示幕选择指南
基于兆芯开先KX-6000系列通用处理器打造的HZC-7710通讯网关机平台
锌碘单液流电池概念提出 利用率将达到近100%
热电偶校验仪工作原理_热电偶校验仪使用注意事项