python、C++与C#实践
文章平均质量分 83
一些在图像处理算法软件在python实现和C++与C#部署上可能会用到的功能代码集合
万里鹏程转瞬至
一名热爱深度学习算法实践的算法工程师,工作日长期活动在线,有项目研发技术问题均可私聊。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
使用自己训练的superpoint与superglue模型进行图像配准
基于官方团队发布的预训练模型,使用SuperPoint与SuperGlue实现图像配准,可以参考基于官方团队发布的代码训练自己的模型,可以参考进行实现,训练出的模型不能直接参考上述博客进行部署,为此发布使用代码。本博文实现基于进行改进。原创 2024-04-04 20:50:22 · 6853 阅读 · 20 评论 -
win10下wsl2使用记录(系统迁移到D盘、配置国内源、安装conda环境、配置pip源、安装pytorch-gpu环境、安装paddle-gpu环境)
步骤二:将·/usr/local/cuda/targets/x86_64-linux/lib/添加到系统环境变量中。这个可以在/etc/profile文件中增加环境变量,将/usr/local/cuda/bin添加到path中,具体操作如下所示。在使用nvcc命令时,可能也会存在报错。,找到其路径为·/usr/local/cuda/targets/x86_64-linux/lib/原创 2024-02-17 10:00:03 · 6446 阅读 · 2 评论 -
实现目标检测中的数据格式自由(labelme json、voc、coco、yolo格式的相互转换)
在进行目标检测任务中,存在labelme json、voc、coco、yolo等格式。labelme json是由anylabeling、labelme等软件生成的标注格式、voc是通用目标检测框(mmdetection、paddledetection)所支持的格式,coco是通用目标检测框(mmdetection、paddledetection)所支持的格式,yolo格式是yolo系列项目中所支持的格式。在进行实际项目中,通常不会局限于一个检测框架,故而数据格式也不会局限于一种。原创 2024-01-07 22:00:59 · 3548 阅读 · 0 评论 -
在win10上cuda12+tensorrt8.6+vs2019环境下编译paddle2.6生成python包与c++推理库
paddle infer官方目前没有发布基于cuda12的c++库,为此参考实现cuda12的编译安装,不料博主才边缘好自己的paddle2.6,paddle官方已经发布了cuda12.0的paddle2.6框架。但安装官网教程进行编译是有很多bug需要解决的,故此分享一下经验。原创 2024-01-04 16:27:44 · 1761 阅读 · 6 评论 -
在win10上cuda12.1+tensorrt8.6+vs2019环境下编译onnxruntime1.17(在3060显卡上对yolov8s fp32部署fps达到142.8)
onnxruntime官方在cuda12出来一年后都没有发布支持cuda12的onnxruntime版本,故此博主在win10上cuda12.1+tensorrt8.6+vs2019环境下自行编译onnxruntime-gpu 1.17版本,可以生成python包与c++库。当在cuda12环境上运行onnxruntime-gpu时总会出现以下报错使用博主编译的库后,基于python对yolov8s以fp32进行部署,含nsm推理为11ms,不含预计为7ms,fps可达142.8。进行下载。原创 2023-12-25 22:15:27 · 3618 阅读 · 7 评论 -
基于ffmpeg给视频添加时间字幕
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕,字幕的内容为视频所播放的时间(故需要安装ffmpeg,具体可以的1.1进行安装配置)。所涉及到的知识主要为字幕文件格式。原创 2023-10-09 22:44:21 · 4827 阅读 · 1 评论 -
基于pyqt5+opencv实现16位tif影像转jpg
现在大部分图像软件都支持tiff影像的浏览,但都是仅限于8位的影像,对应CV16U类型的tiff影像并不支持(这需要专业的gis软件才可进行操作)。为了便捷操作,故此基于pyqt5+opencv实现16位tif影像转jpg的软件。本博文涉及基于ui文件直接构建界面、实现文件拖拽打开、按钮组状态切换、点击图像弹出文件对话框功能。原创 2023-07-07 22:53:16 · 2036 阅读 · 0 评论 -
基于C#实现自己的webapi调用软件
博主前面讲述到可以通过python下的flask框架部署自己的模型,也讲述过通过aistudio部署自己的paddle模型(可以参考),然后通过web请求实现调用。这里的webapi调用软件主要针对aistudio部署平台的webapi进行请求调用,如果是自己部署的服务,也可以参考该教程(仅需求修改解析结果json的部分即可)。先说一下软件设计的特性:1、支持对webapi的url进行加密解密,避免站点和参数信息直接暴露给用户2、支持webapi的结果为图片或者字符串。...原创 2022-09-01 10:14:29 · 2091 阅读 · 0 评论 -
使用c#实现一个简单绘图软件(绘制矩形、多边形,画笔、橡皮擦功能)的完整教程
开发绘图软件需要用到的桌面控件有:按钮(Button)、文本框(Label)、下拉列表(ComboBox)、进度条(trackBar)、图片显示控件(PictureBox)等。博主使用以上控件实现了下图的操作界面,这里需要补充的是博主使用button来显示颜色(设置button的文本为空,然后修改了它的颜色),如果点击该按钮则会弹出颜色选择框。除了上述的控件外,还有一些对话框,如颜色对话框(用于选择颜色),文件选择框(用于选择文件)。这里定义了一些绘图颜色、线宽相关的变量。原创 2022-10-18 13:25:04 · 16871 阅读 · 1 评论 -
C#中窗体继承自定义的AutoSizeForm实现自动等比例调整窗体
先存储原始窗体中的所有控件的size信息和location信息,在窗体大小发生变化时计算出new_size相对于原来size的变化比例(共有两个比例值,scale_width,scale_height),然后将size信息和location信息分别乘以scale_width,scale_height后重新赋值给控件即可。这中状态不符合日常见到的软件的风格,正常的软件,控件的大小是可以跟随窗口大小的变化而变化的。2、然后实现以下类(可以自动调整Form中控件大小的类)原创 2022-10-22 22:58:40 · 1615 阅读 · 0 评论 -
libtorch显存管理示例
在使用libtorch进行部署时,会面临显存不够用的情况。因此需要对显存的利用进行管理,对此研究libtorch的api,尝试进行显存管理。libtorch运行程序时,显存占用可以分为3块:模型参数占用显存、输入输出tensor占用显存、模型forword过程临时变量占用显存。使用cudaFree(tensor.data_ptr())可以释放掉tensor所占用的显存,也可以使用该函数释放掉模型参数所占用的显存。使用CUDACachingAllocator::emptyCache函数可以释放掉模型在forw原创 2022-06-21 10:08:17 · 3598 阅读 · 6 评论 -
python下openVINO使用遇到from .ie_api import * ImportError: DLL load failed的终极解决方案
参考了以下博客,通过修改os.environ['Path']来临时调整,个人认为不是长久之计关于openVINO的python api使用遇到from .ie_api import * ImportError: DLL load failed: 找不到指定的模块的解决方法_qq_40731687的博客-CSDN博客调整代码如下所示,请注意C:\\Program Files (x86)\\Intel\\openvino_2021是博主的安装目录,要换成自己的。os.environ['Path'] .原创 2022-01-13 16:43:13 · 1927 阅读 · 0 评论 -
基于SuperPoint与SuperGlue实现图像配准
基于SuperPoint与SuperGlue实现图像配准,项目地址https://github.com/magicleap/SuperGluePretrainedNetwork,使用到了特殊算子grid_sample,在转onnx时要求opset_version为16及以上(即pytorch版本为1.9以上)。原创 2023-02-17 20:14:24 · 15358 阅读 · 98 评论 -
C++下轻量化websocket客户端库——easywsclient的使用
easywsclient项目核心代码为"easywsclient.hpp"和"easywsclient.cpp",仅需将这两个文件拷贝到自己项目下即可使用WebSocket客户端通信了。其关键接口函数有以下4个,send函数用于发送文本信息,sendBinary函数用于发送二进制信息,dispatch用于设置信息接收处理的函数ws->poll();原创 2023-06-10 07:49:32 · 8182 阅读 · 12 评论 -
C++ ubuntu环境下安装编译部署环境,用onnxruntime部署ppyoloe_r模型
在新安装的ubuntu环境下修改源、安装gcc和cmake,编译安装opencv,安装onnxruntime环境。并编写cmakelist文件,编译与运行ppyoloe_r模型。windows环境下onnx部署ppyoloe_r模型的代码可以参考 https://blog.csdn.net/a486259/article/details/128151738,这里基于该代码进行linux适配,最终成功实现部署。原创 2023-04-19 22:00:00 · 5333 阅读 · 2 评论 -
C++文件加密篇(基于char数组进行可逆加密)
严格意义上的加密算法有对称加密算法和非对称加密算法,对称加密算法是指加密与解密的key相同,而非对称加密算法是指加密(使用公钥,所有人都可以获取)与解密(使用私钥,只有指定方有私钥)的key不相同。这种严格的加密算法依赖于矩阵乘法进行数据加密,运算量较大,通常适用于短信息的加密,而针对于长信息(较大的文件)则不适用(具体可以参考压缩文件的加密)。加密的本质就是对信息进行混淆,使拿到数据的人无法有效的识别出原始信息;而解密则是将混淆后的信息进行还原。因此,可以基于对信息的混淆进行数据加密。进行本工作前,博主进原创 2023-04-08 23:26:47 · 2847 阅读 · 0 评论 -
C++下针对web开发的mysql线程池操作整理
C++下面向web的mysql操作与一般软件不同,web站点会面向较多的用户,需要在服务器响应一个http请求时建立一个mysql连续;而一般软件面向的用户较少,且都是C/S架构,在Client软件初始化后一个数据库连接即可完成绝大部分业务。而作为web服务器,时常面临着浏览器端的业务请求,这就需要用到线程池来缓解压力。原创 2023-02-24 19:22:32 · 644 阅读 · 0 评论 -
C++中的非常规关键字使用的总结
C++中的非常规关键字(在一般小项目编程中不会刻意用到的关键字)有很多,使用这些非常规的关键字,目的就是三点:一、使代码变的更加灵活(如指针、template关键字、宏语法);二、使代码变得更加严谨(如const、static、explicit、virtual等,可消除在代码互动中的歧义和误改动,约束程序员对代码的用法,并消除在代码执行期间的bug);三、是代码执行更高效(如final、noexcept、constexpr等),让编译器在编译代码时可根据代码关键字进行优化。原创 2023-02-22 19:33:43 · 565 阅读 · 0 评论 -
C++下基于std标准库实现配置文件的读取
在一般应用程序中,配置文件的格式有json、yaml、xml、ini等格式。这些格式对变量类型支持较为丰富,如int、string、double、array等。但使用这些格式的配置文件通常需要导入一些其他的外部库,如json、yaml、xml等格式;ini格式是windows系统内置的,但是放到liunx平台上就不支持;这些需要库依赖。采用使用的配置文件(json、yaml、xml、ini)支持域嵌套,但这在中小型程序中是非必须的,在以string做为key的配置文件中完全可以使用前缀(如 section.原创 2022-06-29 11:15:06 · 2792 阅读 · 1 评论 -
C++下GDAL的详细使用案例(含项目配置、tif读取为cv::Mat、Mat保存为tif)
直接到下列链接下载即可,按照说明,将lib目录添加的系统环境变量中即可windows下GDAL322的库-深度学习文档类资源-CSDN下载包含目录中设置include目录 库目录中设置lib的路径 附加依赖项中设置gdal_i.lib GDAL读取数钱需要注册一下驱动(用于编码解码图像的驱动),同时可以设置一下支持中文路径。加载数据时需要注意,GA_Update和GA_ReadOnly两种模式。2.1 获取图像的尺寸这里所有的波段的size都是一样的2.2 获取图像的通道数2.3原创 2022-06-10 19:31:51 · 14776 阅读 · 33 评论 -
C++字符串操作案例(字符串拼接、替换、分割、类型转换、截取)
在C++中string操作较为麻烦,为此整理了一些常用的操作代码,包括字符串拼接、替换、分割、类型转换、截取等等。1、字符串初始化 std::string str1; std::string str2 = "hello word"; std::string str3("c++ code");2、字符串输入输出 //std::string str1;//定义一个字符串str std::cin >> str1; //使用cin对字符串进行赋值原创 2022-05-25 14:57:21 · 6049 阅读 · 3 评论 -
C++搭建websocket服务器并与浏览器js通信
记录并分享一下在c++下搭建websocket服务器,并实现与浏览器js的通信过程1、下载websocketpp库websocketpp是一个c++的websocket库,github地址为:https://github.com/zaphoyd/websocketpp/其使用文档可以参考http://docs.websocketpp.org/。下载解压后得到一下目录结构,其中websocketpp就是我们所要用到的库文件,examples下有一些websocket的基本使用案例。2、下2、原创 2022-05-20 19:19:03 · 3600 阅读 · 3 评论 -
C++下实现目录的遍历、创建及删除
全部代码如下所示,实现了目录的创建,遍历、删除#include <iostream> #include <assert.h>#include <vector>#include <io.h>#include <stdlib.h>#include <stdio.h>#include <windows.h>#include <iostream>#include <cstring>#原创 2022-02-16 19:23:00 · 1913 阅读 · 1 评论 -
win10环境下基于face_recognition搭建自己的人脸识别软件
在win10环境下安装face_recognition,了解face_recognition中api的使用,如人脸截取、人脸矫正、人脸特征提取、人脸关键点提取、人脸mask获取、人脸特征比对等功能。最后构建自己的人脸数据库,使用knn实现人脸识别软件。原创 2022-12-24 16:12:41 · 2353 阅读 · 0 评论 -
win10用cmake3.22与vs2019编译curl库源码并调用
curl是一个利用URL语法在命令行下工作的文件传输工具,支持很多种http请求操作,详情可以参考Linux curl命令最全详解_Angel_CG的博客-CSDN博客_curl命令。curl现在在linux与win10都是有内置的,在命令行中可以直接使用curl指令。博主一开始找了很久,都没有看到适用于vs的curl win10库,因此自己找到了curl库的源码进行了编译,并通过了命令行调用与c++调用。curl库的源码下载地址:https://github.com/curl/curl博主编译环境:vs2原创 2022-06-28 16:32:41 · 2247 阅读 · 3 评论 -
win10下安装配置openvino教程
首先不得不说的是openvino的官网上关于各种系统环境安装openvino的教程是十分丰富完整的。喜欢原版教程的看客请直接访问官网地址,这里只进行最简单的安装教程说明。Install and Configure Intel® Distribution of OpenVINO™ toolkit for Windows* 10 — OpenVINO™ documentation进行安装前,补充一个前置说明,需要安装vs2019及以上,安装cmake3.14及以上,安装python环境(anaconda里有原创 2022-01-07 10:22:51 · 4493 阅读 · 6 评论 -
Opencv 基本操作九 图像特征点提取
opencv中提取图像特征点的方式比较多,有ORB、FastFeatureDetector、BRISK、MSER、MSDDetector、KAZE、AKAZE、AgastFeatureDetector、GFTTDetector、SURF、SIFT等具体可以参考。以下代码中Mattool.hpp的内容为 https://hpg123.blog.csdn.net/article/details/126427923 博文中代码。这里针对每个方法提取的特征点进行对比(包括点数、执行时间和可视化效果)原创 2023-04-21 22:00:00 · 1223 阅读 · 0 评论 -
Opencv 基本操作八 不均匀光照下的图像二值化探讨
在进行图像二值化时总是存在一些明部、暗部的干扰,单一的使用opencv提供的原始二值化方法很难做到预期效果。一般我们都会采用分块二值化(将图像切为多个局部进行二值化)、对比度提升(对值域进行线性或者非线性变换、直方图均衡化)、局部二值化(Bernsen 算法、 Niblack 算法、Sauvola算法、 Chow 和 Kaneko 算法等)的方式进行二值化。这些手段限制了思路的发挥,不一定适用于所有场景。这里对可搜集的二值化方法进行汇总。共统计出4种二值化方法:1、颜色空间转换,2、多次二值化,3、背景光补原创 2023-04-20 23:10:06 · 5153 阅读 · 0 评论 -
Opencv 基本操作七 提取两幅图像的重叠区域
使用opencv提取连个图像的重叠区域,其本质就是提取两个图像的特征点,然后对两个图像的特征点进行匹配,根据匹配的特征点计算出透视变换矩阵H,然后根据H即可提取出两个图像的重叠区域。这里要注意的是,普通的opencv库没有包含opencv-contrib,无法使用xfeatures2d.hpp里面的SURF、SIFT算法提取图像的特征点。故此,需要自行编译opencv(将opencv-contrib加到动态库中),或者下载别人编译好的opencv。原创 2023-01-02 11:35:59 · 9213 阅读 · 11 评论 -
Opencv 基本操作六 使用基于dnn模块部署onnx语义分割模型(实现argmax函数)
Opencv中的深度学习模块(DNN)为模型部署提供了基础能力支持,支持tf、pytorch、onnx模型的部署方式,其中onnx是一种深度学习模型的开放式格式。tf模型、pytorch模型和paddle模型都可以转换为onnx格式。为此本博文专注于使用opencv的dnn模块部署onnx模型,实现了应用于语义分割的argmax函数。原创 2022-12-11 16:40:11 · 2861 阅读 · 0 评论 -
Opencv 基本操作五 各种连通域处理方法
在深度学习中,尤其是语义分割模型部署的结果后处理中,离不开各类形态学处理方法,其中以连通域处理为主;同时在一些传统的图像处理算法中,也需要一些形态学、连通域处理方法。为此,整理了一些常用的连通域处理函数:查找图像中最大的连通域、删除图像中小面积的连通域、删除图像中的黑色连通域、获取形状的骨架。原创 2022-12-10 16:54:36 · 10548 阅读 · 1 评论 -
Opencv 基本操作四 指针数组、vector与Mat之间的相互转换 | Mat切片成Vector<mat>并还原
在深度学习模型部署中通常存在读取图像为mat,然后将mat转换为float指针传入模型的操作。为了快捷开发,因此对指针数组、vector与Mat之间的相互转换进行整理。实现了指针数组、vector之间的相互转换;vector与Mat之间的相互转换(含单通道图像和多通道图像)。vector转mat主要应用在语义分割结果的处理中。原创 2022-09-14 11:44:07 · 12410 阅读 · 1 评论 -
Opencv 基本操作三 实现各个形态学处理并实现多图展示
opencv中包含的形态学操作共有腐蚀、膨胀、闭运算、开运算、形态学梯度、顶帽运算、黑帽运算、hitmiss运算8中。其中,腐蚀、膨胀运算是所有形态学运算基础。本文将对这些形态学操作的效果进行展示。,即用模板对目标像素的领域进行匹配,如果邻域信息与模板完全匹配,则将像素点置255,否则置0。因为图形边缘区域的像素点是较难完全匹配模块的,所以通过该操作后图形边缘的像素点被删除,因此称该操作为腐蚀。,即用模板对目标像素的领域进行匹配,如果邻域信息与模板中任意一个像素匹配,则将像素点置255,否则置0。原创 2022-08-19 17:03:44 · 1470 阅读 · 2 评论 -
Opencv 基本操作二 实现label2rgb,将灰度图转化为彩色图
语义分割得到的图片都是灰度图,不利于查看分割效果,通过对label值进行三次线性变化,可以分别得到关于R、G、B三个通道的伪彩色,然后生成一副伪彩色图像。具体代码如下所示:针对不同class_num的label数据集,只需要调整代码里面的class_num即可cv::Mat set_color(cv::Mat label) { int class_num = 8;//一个有8个类别 int color_setp = int(255 / class_num); cv::Mat原创 2022-02-15 16:34:18 · 6105 阅读 · 0 评论 -
Opencv 基本操作一 c++的常用数组运算方法
包含各类对于opencv矩阵的运算操作,包含通道的分离与合并,mat值域的按范围截取,各种类型mat的取值赋值原创 2021-11-27 11:22:04 · 3577 阅读 · 1 评论 -
NumCpp 使用示例二 与std::vector及cv::Mat之间的相互转换
以读取图片为例,实现NumCPP数组与std::vector、std::array、cv::Mat等数组之间的相互类型转换一、std::array转NdArray std::array<double, 3> a_std = { 1, 2, 3 }; //参数false表示拷贝地址(浅拷贝),而非拷贝值(深拷贝) auto a_np = nc::NdArray<double>(a_std, false); //修改a_std的值 a_st原创 2022-02-14 16:26:26 · 3741 阅读 · 4 评论 -
NumCpp 使用示例一 环境配置与基本api使用
1、下载 https://github.com/dpilger26/NumCpp ,保留include目录就行2、下载下载Boost库 并按照下列链接C++ Boost库的编译及使用 - mingzhang - 博客园进行编译3、在vs项目中配置numcpp和boost,其中boost的vs配置如下图所示4、进行测试特别需要注意的是nc::random::randInt<int>({ 3, 4 }, 0, 10);这与官网发布的使用方法不一致#includ...原创 2021-11-15 15:52:36 · 2900 阅读 · 6 评论
分享