ubuntu clion从0开始搭建一个风格转换ONNX推理网络 opencv cuda::dnn::net
系统搭建
- 系统搭建
OpenCV的安装
cmake
sudo apt-get install cmake
其他环境以来
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
- 不安装会报这个错误
OpenCV(4.6.0) /home/dell/下载/opencv-4.6.0/modules/highgui/src/window.cpp:1250: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'
error
- E: 无法定位软件包 libjasper-dev
解决(换源重新安装)
- http://mirrors.ustc.edu.cn/help/ubuntu.html
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
- 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6AC
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5 3B4FE6ACC0B21F32
下载源码
https://github.com/opencv/opencv/releases
增强模块 https://github.com/opencv/opencv_contrib/tags
安装
unzip opencv-4.6.0.zip
unzip opencv_contrib-4.6.0.zip
cd opencv-4.6.0/
sudo mkdir build
cd build
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local
或sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH= **/opencv_contrib-4.6.0/modules/ ..
error
- 如果报错
CMake Error: The source directory "/home/dell/下载/opencv-4.6.0/build" does not appear to contain CMakeLists.txt.
使用sudo cmake /home/dell/下载/opencv-4.6.0/ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
sudo make
或sudo make -j4
j为变异是使用的核心数量,这一步非常满sudo make install
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_profileface.xml
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_silverware.xml
-- Installing: /usr/local/bin/opencv_annotation
-- Set runtime path of "/usr/local/bin/opencv_annotation" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_visualisation
-- Set runtime path of "/usr/local/bin/opencv_visualisation" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_interactive-calibration
-- Set runtime path of "/usr/local/bin/opencv_interactive-calibration" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_version
-- Set runtime path of "/usr/local/bin/opencv_version" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_model_diagnostics
-- Set runtime path of "/usr/local/bin/opencv_model_diagnostics" to "/usr/local/lib"
环境变量
sudo vim /etc/ld.so.conf.d/opencv.conf
i/usr/local/lib
+ esc + :wq + enter
sudo ldconfig
sudo vim /etc/bash.bashrc
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
sudo updatedb
或者按照这种方式配置
测试
cmake_minimum_required(VERSION 3.15)
project(untitled)
set(CMAKE_CXX_STANDARD 14)MESSAGE(STATUS "Project: untitled") #打印相关消息消息
find_package(OpenCV REQUIRED)# 通过find_package引入非官方的库(该方式只对支持cmake编译安装的库有效)
set(SOURCE_FILES main.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})add_executable(untitled main.cpp)
target_link_libraries(untitled ${OpenCV_LIBS})
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main() {string path = "/home/dell/下载/a.png";Mat src = imread(path);namedWindow("img");imshow("img",src);waitKey(0);return 0;
}
- 重启一下就ok了
- 结果
onnx
效果风格转换
网络的论文和ONNX下载
- 下载地址
blobFromImages(blobFromImage) + imagesFromBlob
处理图像到blob,[0, 255] ->[0, 1],大小,RGB->BGR和转换forward的blob到图像。
网络传播整体代码
cmake_minimum_required(VERSION 3.15)
project(untitled)
set(CMAKE_CXX_STANDARD 14)MESSAGE(STATUS "Project: untitled")
find_package(OpenCV REQUIRED)
set(SOURCE_FILES main.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})add_executable(untitled main.cpp)
target_link_libraries(untitled ${OpenCV_LIBS})
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
#include <fstream>using namespace cv;
using namespace cv::dnn;
using namespace std;// 图像处理 标准化处理
void PreProcess(const Mat& image, Mat& image_blob)
{Mat input;image.copyTo(input);//数据处理 标准化std::vector<Mat> channels, channel_p;split(input, channels);Mat R, G, B;B = channels.at(0);G = channels.at(1);R = channels.at(2);B = (B / 255. - 0.406) / 0.225;G = (G / 255. - 0.456) / 0.224;R = (R / 255. - 0.485) / 0.229;channel_p.push_back(R);channel_p.push_back(G);channel_p.push_back(B);Mat outt;merge(channel_p, outt);image_blob = outt;
}String bin_model = "/home/dell/CLionProjects/untitled/mosaic-9.onnx";
int main(int argc, char** argv) {//数据处理Mat test = Mat::zeros(10,10, CV_64FC1 );Mat image1 = imread("/home/dell/下载/a.png");resize(image1, image1, Size(256, 256), INTER_AREA);image1.convertTo(image1, CV_32FC3);// convertTo()数据类型CV_32FC3PreProcess(image1, image1);vector<Mat> images;images.push_back(image1);images.push_back(image1);int w = 224;int h = 224;// 加载网络cv::dnn::Net net = cv::dnn::readNetFromONNX(bin_model); // 加载训练好的识别模型 net = cv2.dnn.readNetFromONNX('**.onnx')net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);if (net.empty()) {printf("read onnx model data failure...\n");return -1;}Mat inputBlob = blobFromImages(images, 1.0, Size(w, h), Scalar(0, 0, 0), false, true);net.setInput(inputBlob);cv::Mat prob = net.forward(); // 推理出结果 cols,rows 矩阵的行数,列数【注意,在图像中行数对应的是高度,列数对应的是宽度】,当维数大于2时,均为-1; std::vector<cv::Mat> predTmp;cv::dnn::imagesFromBlob(prob, predTmp);imshow("show Image", images[0]);cv::waitKey(0);imshow("Image mosaic", predTmp[0]);cv::waitKey(0);vector<double> times;double time = net.getPerfProfile(times);float ms = (time * 1000) / getTickFrequency();printf("current inference time : %.2f ms \n", ms);return 0;
}
CG
- clion中debug不生效
代码 onnx+ opdncv+vgg16
// https://blog.csdn.net/qq_44747572/article/details/121467657
// /home/dell/下载/opencv-4.6.0/samples/data/dnn/classification_classes_ILSVRC2012.txt#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
#include <fstream>using namespace cv;
using namespace cv::dnn;
using namespace std;// 图像处理 标准化处理
void PreProcess(const Mat& image, Mat& image_blob)
{Mat input;image.copyTo(input);//数据处理 标准化std::vector<Mat> channels, channel_p;split(input, channels);Mat R, G, B;B = channels.at(0);G = channels.at(1);R = channels.at(2);B = (B / 255. - 0.406) / 0.225;G = (G / 255. - 0.456) / 0.224;R = (R / 255. - 0.485) / 0.229;channel_p.push_back(R);channel_p.push_back(G);channel_p.push_back(B);Mat outt;merge(channel_p, outt);image_blob = outt;
}std::vector<String> readClassNames(string labels_txt_file)
{std::vector<String> classNames;std::ifstream fp(labels_txt_file);if (!fp.is_open()){printf("could not open file...\n");exit(-1);}std::string name;while (!fp.eof()){std::getline(fp, name);if (name.length())classNames.push_back(name);}fp.close();return classNames;
}String bin_model = "/home/dell/下载/vgg16.onnx";
String labels_txt_file = "/home/dell/下载/opencv-4.6.0/samples/data/dnn/classification_classes_ILSVRC2012.txt";
vector<String> readClassNames(); // string对象作为vector对象
int main(int argc, char** argv) {Mat image1 = imread("/home/dell/下载/a.png");//用于显示vector<Mat>Showimages;Showimages.push_back(image1);//处理image1resize(image1, image1, Size(256, 256), INTER_AREA);image1.convertTo(image1, CV_32FC3);PreProcess(image1, image1); //标准化处理//将image1和image2合并到imagesvector<Mat> images;images.push_back(image1);images.push_back(image1);vector<String> labels = readClassNames(labels_txt_file);int w = 224;int h = 224;// 加载网络cv::dnn::Net net = cv::dnn::readNetFromONNX(bin_model); // 加载训练好的识别模型if (net.empty()) {printf("read onnx model data failure...\n");return -1;}Mat inputBlob = blobFromImages(images, 1.0, Size(w, h), Scalar(0, 0, 0), false, true);// 执行图像分类net.setInput(inputBlob);cv::Mat prob = net.forward(); // 推理出结果cout << prob.cols<< endl;vector<double> times;double time = net.getPerfProfile(times);float ms = (time * 1000) / getTickFrequency();printf("current inference time : %.2f ms \n", ms);// 得到最可能分类输出for (int n = 0; n < prob.rows; n++) {Point classNumber;double classProb;Mat probMat = prob(Rect(0, n, 1000, 1)).clone();Mat result = probMat.reshape(1, 1);minMaxLoc(result, NULL, &classProb, NULL, &classNumber);int classidx = classNumber.x;printf("\n current image classification : %s, possible : %.2f\n", labels.at(classidx).c_str(), classProb);// 显示文本putText(Showimages[n], labels.at(classidx), Point(10, 20), FONT_HERSHEY_SIMPLEX, 0.6, Scalar(0, 0, 255), 1, 1);imshow("Image Classification", Showimages[n]);waitKey(0);}return 0;
}
相关文章:

ubuntu clion从0开始搭建一个风格转换ONNX推理网络 opencv cuda::dnn::net
系统搭建 系统搭建 OpenCV的安装 cmake sudo apt-get install cmake其他环境以来 sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev 不安装会报这个错误 OpenCV(4.6.0) /hom…...
1.十大排序算法
1.什么是排序算法? 在梳理十大排序算法之前,虽然知道排序算法是将数字或字母按增序排列的算法,但该理解过于片面,那排序算法的权威定义是什么呢。 一个排序算法(英语:Sorting algorithm)是一种…...

算法导论—SAT、NP、NPC、NP-Hard问题
算法导论—SAT、NP、NP-Hard、NPC问题SAT 问题基本定义问题复杂性P、NP、NP-Hard、NP-Complete(NPC)证明NP-Hard关系图NP问题的概念约化的定义NPC问题NP-Hard问题SAT 问题基本定义 SAT 问题 (Boolean satisfiability problem, 布尔可满足性问题,SAT): 给…...

linux入门---基础指令(上)
这里写目录标题前言ls指令pwd指令cd指令touch指令mkdirrmdirrmman指令cp指令mv指令前言 我们平时使用电脑主要是通过鼠标键盘以及操作系统中自带的图形来对电脑执行相应的命令,比如说我想打开D盘中的cctalk这个文件: 我就可以先用鼠标左键单击这个文件…...

大数据Kylin(一):基础概念和Kylin简介
文章目录 基础概念和Kylin简介 一、OLTP与OLAP 1、OLTP 2、OLAP 3、OLTP与OLAP的关系 二、数据分析模型 1、星型模型 2、雪花模型 …...

推进行业生态发展完善,中国信通院第八批RPA评测工作正式启动
随着人工智能、云计算、大数据等新兴数字技术的高速发展,数字劳动力应用实践步伐加快,以数字生产力、数字创造力为基础的数字经济占比逐年上升。近年来,机器人流程自动化(Robotic Process Automation,RPA)成…...
DOM编程-获取下拉列表选中项的value
<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>获取下拉列表选中项的value</title> </head> <body> <script type"text/javascript"> …...

认证服务-----技术点及亮点
大技术Nacos做注册中心把新建的微服务注册到Nacos上去两个步骤 在配置文件中配置应用名称、nacos的发现注册ip地址,端口号在启动类上用EnableDiscoveryClient注解开启注册功能使用Redis存验证码信息加入依赖配置地址和端口号即可直接注入StringRedisTemplate模板类用…...

6个常见的 PHP 安全性攻击
了解常见的PHP应用程序安全威胁,可以确保你的PHP应用程序不受攻击。因此,本文将列出 6个常见的 PHP 安全性攻击,欢迎大家来阅读和学习。 1、SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执…...

三大基础排序算法——冒泡排序、选择排序、插入排序
目录前言一、排序简介二、冒泡排序三、选择排序四、插入排序五、对比References前言 在此之前,我们已经介绍了十大排序算法中的:归并排序、快速排序、堆排序(还不知道的小伙伴们可以参考我的 「数据结构与算法」 专栏)࿰…...

负载均衡上传webshell+apache换行解析漏洞
目录一、负载均衡反向代理下的webshell上传1、nginx负载均衡2、负载均衡下webshell上传的四大难点难点一:需要在每一台节点的相同位置上传相同内容的webshell难点二:无法预测下一次请求是哪一台机器去执行难点三:当我们需要上传一些工具时&am…...
【ESP 保姆级教程】玩转emqx数据集成篇③ ——消息重发布
忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-10 ❤️❤️ 本篇更新记录 2023-02-10 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...

支持分布式部署的主流方式 - Session 持久化到 Redis
1.为什么要将 Session 存储在 Redis 中如果我们不将 Session 存储在 MySQL 或者 Redis 中, 那么做出来的项目就只能支持单机部署, 不支持分布式部署. 因为之前我们只是将 Session 存储在当前电脑的内存里面. 当张三去登录的时候, 将 Session 信息存储在 A 服务器, 这个时候负载…...

计算机网络|第二章 物理层|湖科大课程|从零开始的计网学习——物理层(计网入门就看这篇!)
图片来源于胡科大计算机网络课程,https://www.bilibili.com/video/BV1c4411d7jb?p20&vd_sourcedeb12d86dce7e419744a73045bc66364。文章非盈利商业用途,供博主与大家学习参考,如有侵权,请联系我删除!2.1物理层的基…...

【微服务】RabbitMQSpringAMQP消息队列
🚩本文已收录至专栏:微服务探索之旅 👍希望您能有所收获 一.初识MQ (1) 引入 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,可以立即得到响应,但是你却不能跟多个人同时通话。 异…...

jenkins +docker+python接口自动化之docker下安装jenkins(一)
jenkins dockerpython接口自动化之docker下安装jenkins(一) 目录:导读 1、下载jenkins 2、启动jenkins 3、访问jenkins 4.浏览器直接访问http://ip/:8080 5.然后粘贴到输入框中,之后新手入门中先安装默认的插件即可,完成后出…...

SpringBoot——Banner介绍
一、什么是BannerBanner即横幅标语,我们在启动SpringBoot项目时会将Banner信息打印至控制台。我们可以输出一些图形、SpringBoot版本信息等内容。默认情况下是通过实现类SpringBootBanner输出的Banner内容,默认的输出内容如下。二、自定义Banner如果不想…...

【STL】综述
STL,一文即可知 文章目录一、STL基本知识概述容器二、序列式容器详述数组容器array向量容器vector双端队列容器deque链式容器list正向链容器forward_list二、关联式容器详述红黑树RB-Tree哈希表参考博客😊点此到文末惊喜↩︎ 一、STL基本知识 概述 STL…...
C++中编译的静态库与动态库
1.什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载…...
JS对象到原始值的转换
JS对象到原始值转换的复杂性 主要由于某些对象类型存在不止一种原始值的表示 对象到原始值转换的三种基本算法 在解释三种算法前需要了解toString valueOf这两个方法 toString 返回对象的字符串表示Array类的toString方法会将每个元素转换为字符串,再使用逗号作为…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...