自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 资源 (1)
  • 收藏
  • 关注

原创 新装win10专业版系统opencv430+cuda10+vs2015编译记录以及相关下载(成功)

1.下载编译组件:1)显卡驱动:我的笔记本显卡是英伟达MX250,所以下载了显卡驱动451.48-notebook-win10-64bit-international-dch-whql.exe,需要根据自己显卡型号更新相应驱动。2)cuda组件:cuda_10.0.130_411.31_win10.exe3)cudnn库:cudnn-10.0-windows10-x64-v7.6.5.324)opencv源码:opencv-4.3.0-vc14_vc15.exe5)opencv拓展库源码:ope

2020-06-28 11:45:31 704

原创 Qt + MySQL 部署到新装 Windows Server 2012 问题全记录,解决

一、Qt + MySQL程序部署到非开发机器(其他机器,包括服务器系统),一般会遇到“driver not loaded”的问题。只要程序在开发机器(本机)可以正常运行不报错,就可以用以下解决方法(这里感谢前辈的贡献):1.在QApplication a(argc, argv);前增加两行代码:QString strLibPath(QDir::toNativeSeparators(QAppl...

2020-04-17 14:13:53 974

原创 opencv4.2.0 将Mat 对象通过窗口句柄 显示到Qt label

将opencv的Mat对象显示到Qt label有两种方法:1.通过把opencv的 Mat对象转为Qt 的 pixelmap,这种方法费时,不推荐。网上有很多实现方法。2.通过转换窗口的 父 句柄,把 cv::namedWindow(title,cv::WINDOW_GUI_NORMAL);的父句柄改为Qt控件label的句柄。见代码及注释#include <Windows.h...

2020-03-21 14:11:47 1832 7

原创 opencv插值算法在高精度测量中的应用

写的潦草,是写给懂的人看的。假设相机相元最小为4微米,被测物体要求精度为2微米,则需要对原图像进行插值(opencv中的resize(),使用方法网上都有介绍),在两个像素之间插入按灰度分布的若干像素,比如在240和0之间插入60,120,180,这三个像素这样每个像素之间距离就达到了1微米,可以进行测量。像素的坐标原本为(0,2)和(0,3)类型的,插值以后获得的像素为:(0,2),(0,3...

2020-03-07 18:18:38 727

原创 opencv建立椭圆边缘检测路径(四)——剔除距离过近的边缘点

接上节,线性边缘检测后,会得到若干边缘点,有些边缘点强度非常相似,但是对于这一部分边缘点又想删去一部分,留下一部分,比如剔除距离过近的边缘点。这个方法的应用在于:对于线性排列的重复物体,对其定位时,只希望检测到某个物体的一个最外层边缘,而不希望看到物体里面的边缘也被检测到,这时可以剔除距离过近的边缘点。(下班,未完待续)...

2020-03-03 19:32:14 897

原创 opencv建立椭圆边缘检测路径(三)——直线路径上的边缘检测

接上节,椭圆路径上的边缘检测实质上就是直线路径上的边缘检测。1.线路径边缘检测原理不同于对Mat对象可以用Canny,Sobel等算法进行边缘检测,直线上的边缘检测是单方向的、指定范围、指定宽度(1个像素的宽度)的边缘检测。如果说Canny的Roi是一个矩形,那么线路径的Roi是一条宽度为1像素的线段,所以在某些场景下可以大幅度提高处理速度。为了形象一下,可以看以下图片(图片出自Adapti...

2020-03-03 17:49:57 557

原创 opencv建立椭圆边缘检测路径(二)——建立一条椭圆路径

1.利用椭圆参数方程获得椭圆上等分的点上节说到获取直线上各点坐标,这节建立一个按角度等分的椭圆如图所示:这个椭圆按角度45°分为了8份,每份对应一个直线检测路径。为了获得这些直线检测路径,获得直线的首尾坐标即可(上节说了如何通过直线的首尾坐标获得直线上的各点坐标)。要获得直线首尾坐标,假设这个椭圆上有P1,P2…P8这八个点(即图中可见线段与线段交点),首尾坐标就是:P1和P2,P2和P...

2020-03-03 10:41:50 461

原创 opencv建立椭圆边缘检测路径(一)—— 建立一条直线并获得直线上各点坐标

1.首先介绍为何要用椭圆检测路径对于某些圆形物体,当其边缘存在开放缺口的时候,可以通过建立一条椭圆检测路径(实际上是若干条直线路径拼成的椭圆路径,这也是这节的主题),来检测缺口的边缘,从而从检测到的边缘点获知缺口的存在。典型应用如图所示:蓝色线为由直线路径组成的椭圆路径,橙色十字点为检测到的缺口边缘点。2.在指定直线路径上进行边缘检测的原理这节简单介绍下原理,之后再讲实现。实际上就是在一...

2020-02-28 10:44:42 953 1

原创 图像细化操作的并行优化

Windows 下使用了自带的并行库ppl,跨平台的话使用 tbb 也是可以无痛切换的。参考了https://blog.csdn.net/qianchenglenger/article/details/19332011 的文章,进行了边界和并行优化。

2023-07-27 14:47:23 173

原创 很方便的计时类 GoodClock 基于 std::chrono

在一段需要计时的代码前后加上计时代码,总是让人感觉多余、不适,如果能把要执行的代码放(编译)到一个函数里就好了,这样在感官上就很清爽、整齐。所以设计了一个函数,用类浅浅的封装了一下,封装它主要是为了给输出上锁,这样在多线程环境下也能正确输出。测试时发现 Sleep(2) 实测延时是 3ms 左右,可是我清除的记得以前在 windows 上 Sleep(n) 最小也是 10ms 有没有了解的大佬烦请告知一下。计时类的使用 test.cpp,测试了全局函数、成员函数、局部函数。

2023-05-17 13:32:55 147

原创 std::future<T> 的多线程封装

std::future<T> 只能 get 一次,有些情况是需要多个线程都获取执行结果的,所以浅封装一下方便使用。

2023-04-27 18:08:58 162

原创 三十行代码说清 std::ref 的用法

如题

2023-04-25 17:55:15 164

原创 std::condition_variable::wait_for 的几个细节

std::condition_variable::wait_for 的两种重载用法(以下简称上篇)直观上介绍了 std::condition_variable::wait_for 的使用效果,这篇对没解释清楚的注释、执行结果进行解释。

2023-04-17 10:04:54 2534

原创 std::condition_variable::wait_for 的两种重载用法

分两种测试情况,一是 temp_noticed 初始化为 true,这种情况下 wait_func 无需等待唤醒,即可结束等待;二是 temp_noticed 初始化为 false,这种情况下 wait_func 必须等待唤醒(即temp_noticed 被设为 true 时)才能结束等待。解释: wake_and_wait 启动一个线程,里面进行 wait_for,超时时间是 wait_time_out;究其原因是 wait_for(wait 同理)内部判断谓词为真时即退出等待,即使没有被唤醒。

2023-04-14 17:03:18 917

原创 对象的互斥包装

当一个对象可能被多个线程修改、读取数据时,需要给相应的数据加锁,尤其是堆上的大块数据。锁的来源应该是来自于共享对象,这样才能保证其内部数据同一时间只被一个线程访问。要修改对象的数据时,可以获取锁的引用来加锁,但是这样容易忽略需要加锁的要求,所以设计了一个类,提供统一的接口来使用互斥量,减少失误。测试发现不会输出 Error,证明 th1 和 th2 对 f 的操作是互斥的。

2023-04-13 18:10:20 46

原创 std::shared_ptr 的一个简单实现

提供了std::shared_ptr 的一个简单实现,和push-pop测试。可以用来学习智能指针的实现方法,后面还要更新。工程中还是使用 std::shared_ptr 和 weak_ptr。

2023-04-11 18:24:52 101

原创 std::vector 与 std::move 配合使用

含有堆上数据(data 和 value)的类D实现了移动构造函数 D(D&& other) 后,与std::vector 的 push_back 和 emplace_back 配合使用,特定条件下可以提高效率。从测试结果来看移动构造由于节省了很多拷贝 data 的时间, push_back 和 emplace_back 得到了速度上的优化,其他 std 容器类比一下应该具有同样特性。的一点是以下代码不能获得这种优化,在 emplace_back(push_back)时,调用的还是拷贝构造函数。

2023-04-10 15:23:05 589

原创 解决win10快捷键打开程序延时问题

解决win10快捷键打开程序延时问题

2022-08-30 08:41:55 655

原创 JSON for Modern C++(原 nlohmann json)再封装之toJson

JSON for Modern C++可以说是非常摩登的一个C++ json 库了,支持容器化操作(push_back等操作),支持从 stl 容器(vector ,map)创建 json。具体用法就不赘述了,打开文章开头的链接自行查看即可,非常简单。这篇文章主要是通过自定义树形结构,对这个库进行进一步封装,以期待实现动态的 json 序列化和反序列化。树形结构擅于组织具有节点关系的动态数据,也适合递归,和 json 的结构不能说很像,只能说非常适合json,所以用它来做与 json 交互的数据结.

2022-04-16 18:08:47 1321

原创 英伟达各版本CUDA地址以及与驱动对应关系

各版本CUDA下载地址:CUDA Toolkit Archive | NVIDIA Developerhttps://developer.nvidia.com/cuda-toolkit-archiveCUDA Toolkit and Corresponding Driver Versions:Release Notes :: CUDA Toolkit Documentation (nvidia.com)https://docs.nvidia.com/cuda/cuda-toolkit-release-n

2022-04-15 16:57:30 5093

原创 基于IntelliJ IDEA - Gradle - JavaFX 的 jar 包发布和命令行运行全攻略

为什么说是攻略呢,打包运行一个可执行文件不是点点鼠标的事吗?因为我习惯了Visual Studio C++ 编程,用了一下 IntelliJ IDEA ,感觉也不过如此,没有传说中的那么神乎其神,比如 JavaFX 工程导出 Jar 包并运行就比较麻烦。图像处理方面, Java因为他跨平台的特性,配合 jni 调用 C++ 算法,还是很有前景的,所以如果有同事看到我写这个博文不要觉得不务正业。1.用IntelliJ IDEA建立一个javafx工程,并打包jar建立工程:File =>

2022-03-29 11:07:29 2752 3

原创 reinterpret_cast的一个用法

reinterpret_cast可以用来跨模块分享一个指针(不安全,后果自负)。int main() { char* p = new char[200]; int64_t i64 = reinterpret_cast<int64_t>(p); char buffer[25]; _ui64toa_s(i64,buffer,25,10); string str(buffer);}把 str 和它的长度包装成 json ,传给其他模块即可;其他模块解析时先

2022-02-25 18:28:53 915

原创 Qt 重叠同级 Widget 定制化穿透点击

Qt 重叠同级 Widget 定制化穿透点击

2021-12-25 13:50:02 1419

原创 动态树型对象的拷贝构造

进行UI开发的过程中,考虑到用户可能会动态的向一个对象添加属性,或其他对象,可以通过树形结构来组织这个对象,所有可进行添加的对象都应该继承自一个父类。由于树形结构具有无限拓展的特性,拷贝树形对象变得麻烦,所以可以通过递归树来拷贝一个树形对象。具体实现demo见代码:#include <iostream>#include <vector>using namespace std;//树形基类class Node {public: Node() {} /

2021-10-31 17:58:14 213

原创 拷贝父类对象,父类对象调用子类实现的方法

有时会有这样的需求,需要拷贝一个对象时,不知道对象的确切类型,只知道他的父类类型。如果只希望获得未知对象对父类方法的实现,可以在构造对象的时候把对象的指针传给父类对象。应用在一些动态、泛型的场合,比如动态加载了一个DLL,里面子类的类型是不知道的,但是知道他实现了父类的方法,就可以调用它。代码:#include <iostream>class BaseFoo {public: BaseFoo* childfoo = nullptr; void setChil

2021-10-22 18:35:57 602

原创 C++对象析构时报错的一种情况:子类弑父

#include <iostream>using namespace std;class base;base* b = nullptr;class base {public: base* m_b = nullptr; base() { m_b = this; b = this; } ~base() { cout << "base 被析构\n"; }};class child :p..

2021-10-19 21:56:03 185

原创 “避开”std::map自动排序

说是 “避开”,其实是利用他排序的特性: map<string, string> mymap; mymap.insert(pair<string, string>("5.321648.k", "5")); mymap.insert(pair<string, string>("3.a21313", "3")); mymap.insert(pair<string, string>("2.sx adqw", "2"));

2021-10-17 18:29:06 1276 2

原创 std::vector 交换容器内元素 避免构造

std::vector 没有提供容器内元素相互交换的方法,可以自己写一个://交换对象的指针,要求传入的是指针//不会构造新的对象,只临时声明一个指针template<typename T> void Swap(T* &a, T* &b) { T* temp = a; a = b; b = temp;}//交换对象的内容,要求传入的是对象//需要构造一个新的 T 类型的 temp 来存放 atemplate<typename T

2021-10-17 16:26:02 659

原创 C++ Qt 构建树形结构 树形结构生成XML

树形数据结构是一类重要的非线性数据结构。树形数据结构可以表示数据表素之间一对多的关系。其中以树与二叉树最为常用,直观看来,树是以分支关系定义的层次结构。树形数据结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形数据结构来形象表示。树形结构具有无限拓展的特性,因此非常适合组织节点深度不定的数据,其基本实现方式是一个对象通过保存父对象和子对象的指针,来实现 A-B-C。实现步骤:1.定义基类class BaseNode{private: //父节点的指针..

2021-10-15 17:13:37 2030

原创 Qt 手撸setWidget(QWidget* widget)

Qt中自带setWidget(QWidget* widget)方法的控件有 悬浮窗口、滚动窗口等,这些控件有时附加功能太多有时反而不够方便,比如滚动窗口的 setWidget(QWidget* widget) 会导致之前set的widget被删除:void QScrollArea::setWidget(QWidget *widget)Sets the scroll area's widget.The widget becomes a child of the scroll ar...

2021-10-13 13:38:57 3520 1

原创 Qt NMAKE : fatal error U1073: don‘t know how to make ‘xxxx‘的一种原因

原因:*.pro文件里有不存在的路径或文件,导致nmake找不到文件所以报错解决:删掉*.pro文件里不存在的路径或文件,或者制定正确的路径或文件。

2021-10-12 09:21:27 5571

原创 static_cast 父类子类互转情况(见代码注释)

class BaseFoo {public: BaseFoo() {}};class ChildFoo :public BaseFoo {public: string m_name = "Name of ChildFoo"; ChildFoo() { cout << "ChildFoo constructed\n"; } void print() { cout << "I am ChildFoo\n" .

2021-09-01 16:00:51 1070

原创 复现 OpenCV Qt源码之:滚轮缩放移动图像像素级显示

参考了OpenCV源码highgui 的 Qt 部分,在 QtCreater 中 复现了滚轮缩放移动图像像素级显示。把这个功能封装成了一个类,可以随意使用。见代码:#ifndef MYZOOMVIEW_H#define MYZOOMVIEW_H#include <QImage>#include <QPainter>#include <QGraphicsView>#include <opencv2/opencv.hpp>#include

2021-08-20 11:51:48 1064 1

原创 windows socket 封装 DLL 示例以及注意事项

见socketmethod.h 和socketmethod.cpp代码以及注释,Visual Studio新建一个控制台程序,加入这两个文件,配置类型选为动态库(.dll),编译即可。socketmethod.h/*This file provides basic windows socket methods*/#pragma once#ifdef _DLL_EXPORTS#define DLL_API _declspec(dllexport)#else#define DLL_API..

2021-08-16 16:52:18 748

原创 C++智能指针与线程配合使用方法,附测试代码

当智能指针 shared_ptr 在类里使用时,他的释放是在析构函数中内容执行完之后。当使用shared_ptr 开启了一个线程,这个线程也会在析构函数中内容执行完之后被释放,也就是被delete掉,如果线程尚未 join 的话就会报错,所以要先在析构函数里join线程。见测试代码。这样管理堆上的线程是不是很优雅?#include <thread>#include <iostream>#include <memory>#include <at.

2021-08-16 10:53:21 1366

原创 win10电源选项选“平衡”可解决CPU占用永远为100%的问题

如题

2021-08-09 09:10:04 1194

原创 shared_ptr与数组(结构体封装,注意事项)

struct MyStruct{ int *p = new int[2000000]; MyStruct() { p[10] = 900; } //不写析构的话,智能指针不会释放结构体、类里申请的内存 ~MyStruct(){ delete p; p = nullptr; }};std::queue<std::shared_ptr<MyStruct>>spQueue;void push() .

2021-08-06 17:40:54 1677

原创 MSVC2015编译器 + QtCreater 环境搭建常见问题解决

1. cl.exe 和 rc.exe 无法运行cl.exe是微软vs的编译程序,用来生成obj文件,cl.exe无法运行的话,自然不能编译程序。解决方法是添加相应的环境变量。添加方法有两种:一是直接在path里添加C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;二是新建一个环境变量比如QTVS2015CLKIT,赋值为C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\

2021-07-07 13:57:35 440 1

原创 封装指针来监测指针是否被释放——曲线救渣

为什么会有 “监测指针是否被释放” 的需求? //声明一个int指针 int *p1 = new int; //给指向的值赋值 *p1 = 255; //声明一个int指针的数组,数组大小为1 int**pArray = new int*[1]; //把 p1 指针的值拷贝到 pArray[0] memmove(&pArray[0], &p1, sizeof(p1)); //输出:address: 000001F49D79B1F0 value : 255,正常 cout

2021-07-02 16:01:31 383

原创 char数组输出结尾乱码问题

有道是天道有轮回,果然底层处理字符串是躲不开的: char* cmd1 = (char*)malloc(20); memset(cmd1, '1', 20); char* cmd2 = (char*)malloc(20); memset(cmd2, '2', 20); char* cmd3 = (char*)malloc(20); memset(cmd3, '3', 20); char* cmd4 = (char*)malloc(20); memset(cmd4, '4', 20); ch

2021-06-23 17:35:05 2034

tcpSqlTest.zip

架构和实现:每当有一个新的入库请求时,服务器新建一个线程,线程内new一个QTcpSocket用来接收终端的数据,线程内新建一个数据库连接。在服务器内实现互不干扰,独立入库的功能。 线程安全,工业信息采集实际项目代码,单终端每秒500条类似“22 33 44 55”格式的数据,多终端则倍增,最大速度受制于处理器。

2020-04-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除