- 博客(288)
- 资源 (23)
- 收藏
- 关注
原创 C++ - 跨平台在Windows、Linux系统上获取当前可执行程序路径
跨平台获取当前可执行程序路径是C++跨平台项目中会经常使用的功能,我将这个功能简单的封装成了一个。静态函数获取当前可执行程序路径,下面贴出了功能实现代码。工具类,在该类中通过。
2023-09-11 10:24:20
1413
原创 OpenCV - 图片增加透明通道,图片合并透明通道
按理来说,使用OpenCV的CUDA版本进行计算相比CPU会快很多,但是经过我对上面CPU和CUDA版本的运行时间的测试,发现最终处理的时间是差不多的,我分析这个原因是在使用CUDA版本时,需要将cpu上的图片使用。需要注意的是,Mask图片必须与原始图片具有相同的分辨率大小和相同的数据类型,比如原始图片是1920x1080,CV_8UC3的图片,那么Mask图片必须是1920x1080,CV_8UC1的图片。方法分离原始图片各个通道,然后将Mask加入到原始通道中,最后使用。合成新的通道生成最后的图片。
2023-07-12 09:41:59
3508
原创 OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换
通常情况下,在同一个opencv项目传递cv::Mat可直接通过const cv::Mat& img这种方式传递,但是如果需要进行跨语言传递,比如C++传递到C#或者C#传递到C++,那么通常这种情况下需要将cv::Mat转换为内存指针比如unsigned char指针或者float指针进行传递。我们可以将第1节中的代码进行修改,不使用动态数组,而是改用使用std::vector,这样就不用太在意内存泄漏的问题。我们可以写一个模板的方法完成cv::Mat与不同类型的std::vector之间的相互转换。
2023-06-06 11:25:47
5580
原创 我的开源项目 - 使用OnnxRuntime在CPU端部署RTMPose玩转实时2D姿态估计
好了,在本小节中会详细介绍如何使用OnnxRuntime在CPU端进行RTMDetnano+RTMPose模型的部署,在本教程中会实现基于RTMDetnano+RTMPose的一个Top-Down的2D姿态估计示例,由RTMDetnano检测人,然后根据检测框裁剪相应的图片区域喂给RTMPose进行姿态估计,进行了一个简单的跳帧检测的实时2D姿态估计的C++类,好了,就让我们愉快的开始吧。RTMPose的亮点主打的就是工业级别的推理速度和精度,这在他的论文摘要也是着重突出,可以仔细看他的论文摘要,
2023-04-28 17:32:56
3067
18
原创 C++ - 获取std::vector中的最小值、最大值以及对应的索引
普通方法就是遍历std::vector,对vector中的值进行一一对比,找出最小值、最大值及其对应的索引,示例代码如下。
2023-04-11 13:50:23
5128
原创 TensorRT - TensorRT was linked against cuBLAS/cuBLAS LT 11.6.1 but loaded cuBLAS/cuBLAS LT 11.5.4错误提
我自己以为只要是下载cuda 11.4的版本就行了,之后的小版本就没在意,所以当时下载的时候我就下载了cuda 11.4.1,但是cuda 11.4.1的cuBLAS的版本只有11.5.4.8,那么如何知道哪一个cuda版本中的cuBLAS版本呢?所以我们应该下载安装的版本是cuda 11.4.2,而不是cuda 11.4.1,所以为了避免出现问题(虽然不知道不适用对应的cuda版本会出现什么问题),还是一个版本一个版本慢慢校对,直到找到合适的cuda版本。
2023-03-03 09:17:40
885
原创 Pytorch - 使用pytorch自带的Resnet作为网络的backbone
在使用Pytorch搭建自己的神经网络框架时,经常需要使用Pytorch中内置的中的模型作为特征提取的Backbone,然后再在这个基础上进行更加复杂的网络搭建。在这里以使用Pytorch中内置的Resnet18为例,如何作为Backbone层进行使用,看以下示例代码使用上述代码,如果输入Tensor的维度为[1,3,244,244],fowward输出的Tensor的维度为[1,512,1,1],如果我们需要输出的Tensor维度为[1,512],需要squeeze相应的维度,修改后的代码如下。
2023-01-10 08:48:01
3388
原创 C++ - std::string字符串格式化方法总结
我们可以使用可变参数模板+定义一个字符串格式化函数// std::string的字符串格式化函数 template < typename . . . Args > static std :: string str_format(const std :: string & format , Args . . . args) {if(!
2022-11-17 09:38:58
48573
2
原创 C++ - 使用标准库实现事件和委托,信号和槽机制
在本文中,我们对.Net的事件和委托,Qt的信号和槽进行了简单的介绍,然后通过引入Duilib中对于事件和委托的简单实现,进而扩展了自定义的简单事件类Event,此类实现的比较简单,但是包含了事件实践的核心思想,自己对于模板类,以及变参模板的使用又有了新的体会。
2022-11-02 10:41:11
2093
原创 C++ - single header跨平台高效开源日志库Easylogging++的配置和使用
Easylogging++是一个只有单个头文件的开源跨平台日志库,拥有简单易集成,速度极快,线程安全,高效并可配置可扩展等等优点,现在也是我的主力日志库。
2022-10-26 14:51:14
1230
1
原创 ThreeJS - 修复摄像机近距离模型或者摄像机在某些观察角度3D模型部分或者全部不可见的问题
最近使用three.js在场景中显示gltf模型时候,当我使用操作摄像机想近距离观察gltf模型的时候发现一部分模型消失了,比如说假如这个模型是一匹马,当我远距离观察时可以完整的看到整匹马,但是当我想拉近摄像头近距离观察马的时候,这个时候我只能看到马的头,马的身子和脚的部分突然就消失了。我马上意识到是摄像机的视椎体出现了问题,但是我的视椎体设置的很大,如下肯定可以把这个模型完整的包含在视椎体里面,不可能会出现上述的奇怪问题。
2022-09-24 16:42:44
3635
3
原创 Pytorch - masked_fill方法参数详解与使用
输入的mask需要与当前的基础Tensor的形状一致。将mask中为True的元素对应的基础Tensor的元素设置为值value。返回填充后的Tensor。
2022-08-15 10:00:01
8078
1
原创 Pytorch - 使用torchsummary/torchsummaryX/torchinfo库打印模型结构、输出维度和参数信息
对打印Pytorch模型的模型结构、输出维度以及参数信息的方式进行了总结
2022-07-01 10:32:22
4433
2
原创 C++ - 使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳
1 使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳1.1 当前时间戳获取方法先使用std::chrono获取当前系统时间,然后将当前系统时间转换为纪元时间std::time_t类型,之后使用std::localtime对std::time_t类型转换为本地时间结构体std::tm类型,最后使用strftime对时间进行格式化输出。其中std::tm该结构包含了一个被分解为以下各部分的日历时间struct tm { int tm_sec; // 秒,范围从
2022-05-27 14:41:37
23110
6
原创 FFmpeg - ./configure编译参数全部总结和整理
1 FFmpge编译参数本文对FFmpeg4.4.1的./configure的所有编译参数进行了简要说明。在Linux系统上编译FFmpge时总是不太明白应该使用哪一些编译参数,这里以FFmpge4.4.1版本为例,对FFmpge的所有可选编译参数进行总结和整理。1.1 Help options 帮助选项参数参数作用–help打印显示帮助信息–quiet禁止显示信息输出–list-decoders显示所有可用的解码器–list-encoders显示所有可用
2022-04-29 13:29:18
9813
3
原创 Visual Studio – 借助远程Linux服务器环境在Visual Studio中编写和远程调试Linux C++程序
1 环境准备1.1 安装使用C++的Linux开发的工具集首先需要在Visual Studio Installer中安装使用C++的linux开发的工具集等待使用C++的Linux开发的工具集安装完成,并重启Visual Studio。1.2 准备可远程的Linux服务器以及在远程服务器安装远程调试环境1.2.1 明确Linux服务器的cpu架构首先需要清楚该服务器的cpu是x_86、x_64还是arm,这在之后的Visual Studio中需要选择编译平台。1.2.2 配置远程Linux服
2022-03-14 15:32:16
17744
原创 Mediapipe – 将Mediapipe HolisticTracking封装成动态链接库dll/so,实现在桌面应用中嵌入全身关节点识别、手势识别、抬手放手检测识别功能
1 Mediapipe HolisticTrackingMediapipe Holistic Tracking可对身体,面部和手部的共543个关键点进行实时跟踪检测,其中包含面部468个关节点,身体33个关键点,以及每只手分别21个关键点。所有关键点的存储顺序以及标注对照索引图可参考我的另一篇文章:https://www.stubbornhuang.com/1916/1.1 封装Mediapipe Holistic Tracking的目的之前尝试对Mediapipe的手部跟踪功能HandTrack
2022-01-20 17:27:00
4737
59
原创 书籍翻译 - Fundamentals of Computer Graphics, Fourth Edition 虎书第四版中文翻译
1 Fundamentals of Computer Graphics, Fourth Edition 中文翻译随缘翻译,不喜勿喷。第1章:Introduction 中文翻译 : https://www.stubbornhuang.com/1813/第2章:Miscellaneous Math 中文翻译:https://www.stubbornhuang.com/1821/第3章:Raster Images 中文翻译:https://www.stubbornhuang.com/1822/第4章:
2022-01-08 14:40:19
6688
3
原创 Pytorch - 一文搞懂如何使用Pytorch构建与训练自定义深度学习网络(数据集自定义与加载,模型训练,模型测试,模型保存与加载)
使用Pytorch从零训练一个深度学习网络模型,常需要经过以下步骤:自定义数据集、加载自定义数据集、网络模型结构定义、定义损失函数、定义优化器、训练模型、测试模型、保存与加载模型等步骤。下文将详细阐述如何从零构建并训练一个深度学习网络模型的必要步骤。1 自定义数据集from torch.utils.data import Datasetclass torch.utils.data.Dataset表示数据集Dataset的抽象类,所有其他自定义的数据集都应该继承Dataset类,并且强制重写_le
2021-12-22 17:25:40
3857
1
原创 C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原
1 视频中的旋转信息以及为什么会有旋转信息Android或者ios等手机上录制视频时,由于重力感应或者录制视频的摆放方式的问题会导致录制的视频拥有旋转信息。如果是横屏录制(手机逆时针旋转90度),则录制的视频时不带角度的。如果是竖屏录制(正常的拿手机的姿势),此时的录制的视频的旋转角度是90度。如果再旋转90度,此时一般音量键和关屏键朝下,此时的视频的旋转角度是180。以此类推。所以在手机上的视频一般会有4种角度的视频,播放时,要对视频资源进行旋转后再进行播放,不然视频就会出现各种反转、倾倒。在http
2021-12-07 10:35:10
1852
原创 C++11 - 构建一个符合实际应用要求的线程池
1 什么是线程池线程池从本质上可以看做是一个多生产者多消费者的多线程应用。一个线程池包括以下四个基本组成部分:线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新的工作线程,添加工作任务;工作线程:属于线程池中的线程,用于处理实际任务,在没有工作任务时等待,在任务队列不为空时主动获取任务并处理任务;任务接口:每个任务必须实现的接口,以供工作线程调度任务的执行;工作任务队列:用于存放需要处理的工作任务,采用先进先出机制;线程池根据机器性能预先创建多个工作线程,位于主线程的线
2021-11-08 14:58:19
661
原创 TensorRT - 扩展TensorRT C++API的模型输入维度,增加Dims5,Dims6,Dims7,Dims8
1 TensorRT C++ API支持的模型输入维度在TensorRT 7.0及以上版本,我们通常使用以下语句指定输入维度: const std::string input_name = "input"; const std::string output_name = "output"; const int inputIndex = m_TensorRT_Engine->getBindingIndex(input_name.c_str()); const int o
2021-10-19 22:35:46
2197
5
原创 C++ - 函数返回多个返回值的方法总结
1 C++函数如何像python一样返回多个返回值使用过python的童鞋都知道,在python单个函数中可以返回多个函数值,比如:# -*- coding: utf-8 -*-def return_muliti_value(): return 1,'helloworld',[1,2,3]if __name__ == '__main__': a,b,c = return_muliti_value() print(a) print(b) print(c)
2021-10-13 11:33:13
46725
4
原创 TensorRT - 喜大普奔,TensorRT8.2 EA起开始支持Einsum爱因斯坦求和算子
1 TensorRT 8.2 EA版本支持爱因斯坦求和算子EinsumNVIDIA在2021年10月6日发布的TensorRT新版本 8.2 Early Access版本终于开始支持爱因斯坦求和算子Einsum,这个消息真是为模型工业化部署的同学省了不少的时间。TensorRT中具体可支持的Onnx算子可参考:https://github.com/onnx/onnx-tensorrt/blob/master/docs/operators.md,但是目前Einsum也是支持大部分等式,暂不支持省略号和
2021-10-12 10:40:37
1832
原创 TensorRT - 使用torch普通算子组合替代torch.einsum爱因斯坦求和约定算子的一般性方法
1 问题:TensorRT暂时未实现einsum算子在ST-GCN中使用了爱因斯坦求和算子torch.einsum,def forward(self, x, A): assert A.size(0) == self.kernel_size x = self.conv(x) n, kc, t, v = x.size() x = x.view(n, self.kernel_size, kc//self.kernel_size, t, v)
2021-10-08 16:15:57
4232
6
原创 OpenCV - 将图片转换为深度学习模型输入格式,BGR通道转RGB,图片归一化,HWC转CHW
文章目录1 将图片转换为深度模型输入格式1.1 自行进行转换1.1.1 BGR通道转RGB通道1.1.2 图片归一化1.1.3 HWC转CHW1.2 使用cv::dnn::blobFromImage进行转换1.2.1 函数形式1.2.1 函数参数1 将图片转换为深度模型输入格式在C++进行人脸识别、目标检测的过程中,经常是以图片数据作为深度学习模型推理的输入数据的,但是从OpenCV读取的图片数据并不能直接用于深度学习模型的推理过程。首先,OpenCV读取图片默认使用的是BGR通道排列方式,而深度学
2021-09-23 10:41:27
4746
1
原创 TensorRT - 使用trtexec工具转换模型、运行模型、测试网络性能
1 转换模型1.1 Caffe模型转换为TensorRT模型将Caffe模型转换为TensorRT模型,启动所有精度以达到最佳性能trtexec --deploy=mnist.prototex --model=mnist.caffe --saveEngine=mnist.trt --best将Caffe模型转换为TensorRT模型,启动所有精度以达到最佳性能,并跳过推理性能测试trtexec --deploy=mnist.prototex --model=mnist.caffe --s
2021-09-21 10:40:37
18869
9
原创 TensorRT - 解决INVALID_ARGUMENT: getPluginCreator could not find plugin ScatterND version 1
1 问题出现最近在使用TensorRT 7.2.3.4中的自带的trtexec工具转换yolov3-spp的onnx模型为TensorRT模型文件时出现了找不到ScatterND插件的错误,错误大致如下:ModelImporter.cpp:135: No importer registered for op: ScatterND. Attempting to import as plugin.builtin_op_importers.cpp:3771: Searching for plugin: Sc
2021-09-19 09:44:17
7780
8
原创 TensorRT - 自带工具trtexec的参数使用说明
本文以TensorRT-7.2.3.4说明自带工具trtexec工具的使用参数进行说明。1 trtexec的参数使用说明=== Model Options === --uff=<file> UFF model --onnx=<file> ONNX model --model=<file> Caffe model (default = no model, random wei
2021-09-18 09:19:16
29211
6
原创 C++ - 判断本机文件是否存在的方式总结
C++ - 判断本机文件是否存在的方式总结由于C++没有像python那样方便的os.path官方库,经常面临着判断一个文件是否在本机上存在都不易用,今天就总结下C++下判断本机文件是否存在的一些方法。1 通用方法1.1 使用std::ifstream判断#include <iostream>#include <fstream>bool Is_File_Exist(const std::string& file_path){ std::ifstream fi
2021-09-15 14:25:20
3875
原创 C++11 - 委托机制的实现TinyDelegate
1 使用C++11实现委托机制1.1 TinyDelegate类1.1.1 代码TinyDelegate.hpp#ifndef TINY_DELEGATE_H#define TINY_DELEGATE_H#include <functional>#include <chrono>#include <string>#include <list>#include<algorithm>template<typename
2021-09-09 17:03:01
276
原创 Github - 使用新的Personal Access Token进行仓库认证
1 Github操作需使用新的Personal Access Token今天早上向Github推送代码的时候突然发现不能推送了,出现了以下错误:remote: Password authentication is temporarily disabled as part of a brownout. Please use a personal access token instead.remote: Please see https://github.blog/2020-07-30-token-au
2021-08-14 12:12:04
6744
2
原创 Mediapipe - 将Mediapipe handtracking封装成动态链接库dll/so,实现在桌面应用中嵌入手势识别功能
1 将Mediapipe handtracking封装成动态链接库dll/so的意义Mediapipe提供了在cpu低延时下的高性能以及丰富功能,比如人脸识别,手部跟踪与识别,全身关节跟踪与识别,如果我们能在我们的应用中加入这些功能岂不是很酷!在python环境下,我们可以通过直接安装Mediapipe包来使用Mediapipe功能,但是我们的桌面应用如果想使用Mediapipe是不是还要集成python环境下的Mediapipe,然后通过本机通讯调用呢?有没有简单的低耦合的方法?如果我们将Media
2021-08-13 14:45:00
6364
49
原创 Mediapipe - Windows10 编译Mediapipe C++版本保姆级教程
文章目录1 Windows10编译Mediapipe C++版本2 编译步骤2.1 MSYS2环境配置2.1.1 下载安装2.1.2 配置系统环境变量2.1.3 升级msys2包数据库2.1.4 升级msys2基础数据库2.1.5 下载安装必要的包:unzip2.2 Python环境配置2.3 安装VS2019和WinSDK2.4 配置Bazel2.4.1 Bazel下载2.4.2 Bazel系统环境配置2.5 设置Bazel变量2.6 下载opencv2.7 Mediapipe仓库克隆以及bazel的编译
2021-08-09 20:19:23
18070
77
原创 计算几何与计算机图形必备书单整理
文章目录计算几何与计算机图形必备书单计算机图形学书单列表计算几何书单列表计算几何与计算机图形必备书单持续更新中,本次更新时间2021年8月6日,未完待续!Github地址:https://github.com/HW140701/Book-list-of-computational-geometry-and-computer-graphics,欢迎大家star.个人网站地址:https://www.stubbornhuang.com/1256/,大家可以前往该页面进行下载.计算机图形学书单列表
2021-08-06 20:09:44
2250
原创 Alphapose - 在Alphapose中使用yolov3-tiny检测器大幅提升检测性能
1 Alphapose中使用yolov3-tiny检测器的应用场景Alphapose的官方仓库中默认使用的是yolov3-spp,根据官网公布的数据,其mAP为60.6,FPS能到20FPS。但是如果我们面临的是一个不复杂的场景,场景中人数较少,而我们有需要其性能够好,实时性能达到应用的要求或者更好,那我们为什么不适用yolov3-tiny检测器,由于简化了网络结构,根据官网的公布的数据,其FPS能达到220FPS,而mAP也有33.1,对于普通场景这种精度完全够用。2 在Alphapose中使用yo
2021-08-02 10:27:26
2737
21
原创 Python - 不依赖第三方库对类对象进行json序列化与反序列化
1 python不依赖第三方库对类对象进行json序列化与反序列化import jsonclass RequestArgs: def __init__(self,name,video_path): self.name = name self.video_path = video_path @staticmethod def fromJson(mapping): if mapping is None: ret
2021-07-30 16:18:28
254
原创 Python - 使用python-opencv裁剪原视频为与视频高同宽的视频
1 裁剪视频的原因在有些情况下,我们只需要视频中间部分的视频内容,所以需要通过裁剪去掉周围冗余的视频部分。2 代码# -*- coding: utf-8 -*-import cv2import osdef crop_video_by_width(input_video_path,out_video_path): # 判断视频是否存在 if not os.path.exists(input_video_path): print('输入的视频文件不存在')
2021-07-28 10:31:45
1085
1
原创 Python - 深度学习训练过程使用matplotlib.pyplot实时动态显示loss和acc曲线
1 深度学习训练过程中实时动态显示loss和acc曲线可参考代码如下:# -*- coding: utf-8 -*-import matplotlib.pyplot as pltif __name__ == '__main__': train_loss = 5 val_loss = 5 train_acc = 0.0 val_acc = 0.0 x = [] train_loss_list = [] val_loss_list = []
2021-07-19 13:56:44
10238
2
原创 客户端开发GUI框架对比与技术选型总结
客户端开发GUI框架对比与技术选型总结客户端开发技术日新月易,目前客户端开发的GUI框架选型大致会从以下几个技术路线中进行选择:纯系统原生GUI库第三方库基于Chromium + Node.js原生+cef以上的技术各有优缺点。我从我个人的开发以及学习经验出发,大致总结每一个GUI开发技术路线的优点和缺点,如有遗漏,请指正勘误,这里底层数据与逻辑处理以C++语言为例进行说明。1 系统纯原生开发MFC开发语言C++优点从系统底层调用API,性能好,代码执行效率高,运行速度快;
2021-06-17 23:10:19
6482
2
Audacity.exe 可以打开原始音频文件pcm
2018-11-27
Setup Screen Capturer Recorder v0.12.10.exe
2018-11-15
setup Virtual Audio Capture Grabber v0.4.6.exe
2018-11-15
FreeImage轻量级图片库3.1.0,支持32和64位
2017-12-06
OpenGL+MFC显示三维点云中每一个点的法向量,Release版本
2017-09-08
常见的三维点云数据,已经整理数据格式
2017-05-26
AccessDatabaseEngine_X64.exe
2017-05-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人