编译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%
热电偶校验仪工作原理_热电偶校验仪使用注意事项