![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 62
鸿儒517
积跬步以至千里,积小流以成江海!
展开
-
C++多线程编程(第四章 案例1:base16编码,C++11和C++17 多核并行计算样例)
release版本优化的比较多,之所以C++17耗时较长原因是进入多线程次数远远大于C++11,C++11只进入了12次,而C++17采用lambda表达式函数,进入了TestNumber次。原创 2023-10-16 18:52:00 · 221 阅读 · 0 评论 -
GDAL Linux离线源码编译(附源码及编译步骤)
参考链接:gdal-3.1.2 linux(Ubuntu) 编译 附SQLite3 PROJ6编译工作中经常会进行程序部署,软硬件系统变化程序都需要重新编译进行适配:armCPU、X86CPU 、Ubuntu系统、Redhat、CentOS系统等等都需要重新编译库安装包源码下载点击【这里(免积分下载)】包含:1、sqlite-autoconf-3360000.tar.gz2、tiff-4.2.0.tar.gz3、curl-7.71.1.tar.gz4、proj-7.1.0.tar.gz5、原创 2023-09-26 17:19:01 · 486 阅读 · 0 评论 -
C++多线程编程(第四章 多线程future相关)
ackaged_task包装函数为一个对象,用于异步调用,其返回值能通过std::future对象访问。C++11 异步运行一个函数,并返回保有其结果的std::future。与bind的区别,可以不调用,函数访问和获取返回值分开调用。std::future提供访问异步操作结果的机制。promise用于异步传输变量。下面代码中还包含了是否超时判断。原创 2023-09-08 18:12:07 · 133 阅读 · 0 评论 -
C++多线程编程(第三章 案例3:把案例1改装成案例2的条件变量多线程方式)
由于案例1采用等待循环方式进行写入,如果更换成案例2的条件多线程方式,效率会大大增加,下面开始写出新的代码吧。原创 2023-09-08 17:49:10 · 367 阅读 · 0 评论 -
C++多线程编程(第三章 案例2,条件变量,生产者-消费者模型)
1、获取std::mutex(常用std::unique_lock)消费者阻塞等待信号,获取信号后消费产品(取出list队列中数据)期间出差了一个月,没有时间学习,今天开始又继续学习和做笔记了…上工作的std::condition_variable。等待中,增加了时延和开销,用条件变量就很快及时处理。生产者和消费者共享资源变量(list队列);生产者生产一个产品,通知消费者消费;只在std::unique_lock。2、在获取锁时进行修改;3、释放锁并通知读取线程。原创 2023-09-08 08:59:18 · 474 阅读 · 0 评论 -
C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)
代码包含了XThread类(基类)、XMsgSever类(消息)、测试主程序。3、通过Unique_lock和mutex互斥方位list 消息队列。主线程和子线程进行list通信,要用到互斥锁,避免同时操作。2、模拟消息服务器线程,接收字符串消息,并模拟处理;1、封装线程基类XThread控制线程启动和停止;4、主线程定时发送消息给子线程;原创 2023-07-28 10:58:40 · 920 阅读 · 0 评论 -
C++多线程编程(第三章 利用栈特性自动释放锁RALL,锁管理器、控制器)
RALL(resource Acquisition Is Initialization )C++ 之父Bjarne Stroustrup 提出;使用局部对象来管理资源的技术称为资源获取即初始化;它的生命周期是由操作系统来管理的,无需人工介入;资源的销毁容易忘记,造成死锁或者内存泄漏。原创 2023-07-28 10:01:50 · 329 阅读 · 0 评论 -
C++多线程编程(第二章 多线程通信和同步)
阻塞(Blocked):该线程被阻塞挂起,Blocked状态包括:pend(锁、事件、信号量等阻塞)、suspend(主动pend)、delay(延时阻塞)、pendtime(因为锁、事件、信号量时间等超时等待)共享锁中包含了共享锁和互斥锁,当互斥锁被锁定,所有共享锁都进不去;共享锁中的共享锁,只要在没有锁定共享锁中的互斥锁,共享锁中的共享锁都能进入;可以记录锁获取情况,多次超时,可以记录日志,获取错误情况。解锁后等待1毫秒,让其他线程可以获取到锁,运行结果如下。运行(Running):该线程正在运行;原创 2023-07-27 09:08:09 · 103 阅读 · 0 评论 -
C++多线程编程(第一章 多线程基本使用)
C++ 11;C++ 14;C++ 17;C++ 20;代码主要为:第一章01~07内容。原创 2023-07-26 12:13:01 · 93 阅读 · 0 评论 -
C++ 优先级队列的vector实现
队列大家很熟悉,可以用vector数据结构存储,优先队列可能新手不怎么熟悉(老兵可以略过本文)原创 2023-01-13 10:10:25 · 996 阅读 · 0 评论 -
C++ map 非常量引用得初始值必须为左值
具体原因没有深究,但由于该错误发生了两次,为了长记性,特此记录!——辉 2022.12.8。解决方案:将属性 -> C/C++ -> 符合模式 -> 否。原创 2022-12-08 15:45:40 · 327 阅读 · 1 评论 -
编译支持JPEG2000压缩格式的GDAL(ECW库、OpenJPEG)
默认编译的GDAL不能解析JPG2000格式的影像,由于工作需要,我们的程序需要支持*.jp2格式,需要使用其他库来编译到GDAL里面进行辅助解析原创 2022-11-10 18:07:32 · 2096 阅读 · 2 评论 -
C++ Linux安装gdal及测试demo注意的问题
根据上面的参考链接进行安装gdal没有啥问题,编译后可以输出可执行程序,但是在运行的时候出现提示libgdal.so没有找到。原创 2022-09-05 13:21:34 · 854 阅读 · 0 评论 -
C++ string replace操作
C++ string replace操作本来网上有很多,但是按其操作有坑,编译提示语法错误。原创 2022-08-05 13:08:17 · 4743 阅读 · 0 评论 -
C++ 二分法算法查找返回Array最近的值
使用二分法进行查找返回Array最近值,支持float类型、int类型等各种数据类型。原创 2022-07-22 17:01:41 · 620 阅读 · 0 评论 -
HDF5 windows编译 release版本、Debug版本
由于最近急需的一个项目,需要hdf5库,误打误撞,编译成功。特此记录官网下载地址:https://portal.hdfgroup.org/display/support/HDF5+1.12.2#files找到如下地址,本人电脑有cmake软件,我下载了Cmake版本和源代码版本同时进行了,事实上我也下载了源码进行cmake手工编译,但是不如直接下载CMake版本的来的方便,所以这里我直接记录了Cmake版本的编译方法如果下载不了,可以通过该链接进行下载如果不想看怎么编译,可以从这里下载我编译好的库1、下原创 2022-07-10 15:16:52 · 899 阅读 · 0 评论 -
直方图均衡化算法、直方图匹配算法 C++ 代码
这两天一直在研究云光匀色算法才了解到了直方图匹配算法,想要了解这个算法又要先了解直方图均衡化算法,通过网上查找了很多资料,没有现成C++代码,经过仔细思考和实验后大概复现了该算法。特此记录,以备查阅参考链接如下:1、匀光匀色–直方图匹配算法实现与应用2、基于OpenCV的直方图匹配3、直方图均衡化的数学原理先介绍一下基本概念原始数据底图影像直方图匹配匀光匀色效果从上图可以看出原始影像与模板颜色不一致,经过直方图匹配匀光匀色后颜色一致性较好。先看看直方图均衡算法原理知识:先在根据上原创 2022-06-18 17:31:51 · 2940 阅读 · 4 评论 -
已知四角经纬度判断是否有重叠(不用geos库)
已知四角经纬度判断是否有重叠。本来以前有一个依赖geos库的代码,但是现在用的gdal又没有geos库,无赖之下网上搜索了一些资料重新写了一个。四角经纬度的多边形可以分为两种类型:1、四角为矩形,这个判断比较简单;2、四角不为矩形,可能是平行四边形或者其他形状的四边形;两个四角为平行四边形或者其他多边形,判断是否重叠这里我参考了一个链接:判断两条线段是否相交以及点是否在四边形内的C++算法上面文章里面有判断线是否有相交算法、点是否在面内算法。据此我整理了一下下面代码是上面博客的核心代码,我增加了一个.原创 2022-06-08 16:44:15 · 681 阅读 · 0 评论 -
使用OpenCV Mat对图片低频信息、高频信息提取及无损还原(高斯模糊、做差、求和)
为了还原一篇论文。里面用到了提取图像的低频信息、高频信息、及还原技术。现在使用opencv进行复现,里面有一些注意事项特此记录参考链接:OpenCV中对Mat矩阵加、减、乘、除、转置等操作的总结OpenCV两个Mat相减的隐藏秘密opencv学习笔记(四)——模糊(均值,高斯,双边)其实提取一张图像的低频、高频信息原理比较简单,但是不注意的时候还原出来的影像总有一些像素值对不上(特别是边缘像素)。影像的低频和高频信息可用如下数学模型表述:I=L+H其中I表示影像,L和H分别表示影像对应的低频原创 2022-05-19 11:21:20 · 3468 阅读 · 0 评论 -
利用gdal的RasterIO进行最近邻、双线性、三次卷积重采样的重采样
下面是根据《GDAL源码剖析与开发指南》上面对RasterIO的常规用法,该书使用的gdal版本比较老,新版的gdal版本已经可以支持RasterIO进行最近邻、双线性、三次卷积重采样的重采样(具体从哪个版本改的我也不知道),具体方法在文末。先根据该书介绍gdal常规的做法:根据上面描述,我们进行第七个参数和第八个参数的更改则可以进行调整输出影像大小,如果不设置算法参数,我测试也可以输出大影像,但是效果不是很好。但是怎么指定是使用最近邻、双线性、三次卷积重采样在新版本是有方法的,具体如下:1、定义原创 2022-05-11 10:04:54 · 2255 阅读 · 0 评论 -
gdal、geos的 windows编译 openCL加速
由于最近在使用gdal的纠正功能,发现自带方法特别慢,经过研究发现以前的编译没有使用OpenGL的GPU加速功能,不得己重新编译一次完整的gdal库,特此记录。gdal官方下载地址:http://download.osgeo.原创 2022-05-04 22:00:10 · 1696 阅读 · 0 评论 -
C++中关于宏定义函数需注意的
C++ 中宏定义函数使用比较方便,主要优点:代码量少,执行速度快,其原理就是用所定义的数字进行替换得到,看下面例子#include <stdio.h>#define pow2(x) x*x#define pow3(x) (x)*(x)int main(){ printf("4的平方:%d\n", pow2(4)); printf("3+1的平方:%d\n", pow2(3+1)); printf("3+1的平方:%d\n", pow3(3+1));}运行结果:如果原创 2022-03-13 17:04:58 · 847 阅读 · 0 评论 -
C++ string获取文件路径文件名、文件路径、文件后缀(两种方式)
windows路径有两种方式,一种正斜杠,一种反斜杠都可以表示路径,该方法可以支持这两种表达方法string path1 = "D:/datas/FusionTestData/datas/GF6_PMS_E111.2_N27.6_20180719_L1A1119837939-PAN.tiff"string path2 = "D:\datas\FusionTestData\datas\GF6_PMS_E111.2_N27.6_20180719_L1A1119837939-PAN.tiff"stri原创 2022-02-23 18:28:38 · 9761 阅读 · 1 评论 -
CUDA编程上的OpenMP异步
CU文件上的openMP 设置原创 2022-02-23 15:14:49 · 331 阅读 · 0 评论 -
CUDA编程学习<2>——归约算法的7种优化方法详解
参考链接:CUDA学习(归约算法)根据上面文章中的PPT链接,进行了深入研究。原文章只介绍了归约算法的一般形式,而PPT中则对比了几种归约算法,但是PPT写的不够完整,不便于系统的运行起来。为了学习CUDA及其优化技巧,特此整理Nvidia官网归约ppt (英文)中文PPT关于代码核函数的部分可以参阅我的博客:CUDA编程学习——关于核函数ID获取公式硬件信息实验机器硬件:通过硬件信息可以看出几个重要信息:理论带宽(bandwidth):192GB/s此显卡每秒渲染像素数量(Pixe原创 2022-02-16 11:05:31 · 1342 阅读 · 5 评论 -
CUDA编程学习——关于核函数ID获取公式
最近在学习CUDA编程,主要阅读了下面一些文章1、CUDA编程十篇(重要的看前八篇就差不多了)2、cuda从入门到精通(三)之核函数和参数配置3、CUDA 线程ID 计算方式通过第一个链接的学习,可以简单写出CUDA代码,但其ID号只是一维的。在实战方面,多用三维,所以为了整理清ID的意思,为此看下面两个链接。现在根据我自己的理解和测试,进行了整理核函数的线程定义方式1、1维核函数ID定义方式1.1、核函数定义及调用:hello_from_gpu << <2, 4 >原创 2022-01-11 14:32:05 · 624 阅读 · 0 评论 -
C++关注内存及硬盘占用情况
今天测试多线程异步处理数据,发现程序很容易崩溃掉。主要原因事在异步的时候加载数据,加载的总数据量远远大于本身内存导致的。所以搜索找到一些关注内存占用的代码,以后在处理多线程的时候可能用到条件锁,防止爆内存情况代码如下:#include<windows.h>BOOL CheckResource(){ MEMORYSTATUSEX statex; statex.dwLength = sizeof(statex); GlobalMemoryStatusEx(&statex);原创 2021-12-22 16:16:06 · 664 阅读 · 0 评论 -
C++ Dll导出及python调用C++ DLL
目录1、C++ Dll 编译导出1.1、VS工程属性更改1.2、代码更改1.3、导出dll2、python 调用Dll样例2.1 代码简单调用2.2 调用的时候传参方式2.3改装代码1:2.3改装代码2:缘由:由于在使用gdal的时候作矢量求交输出的时候python没用对应api,所以用C++对应的函数编译成dll,用python进行调用。使用环境:1、Visual Studio 20172、Pycharm参考链接:1、Python 调用DLL动态链接库——ctypes使用2、python 调原创 2021-11-16 10:09:05 · 2553 阅读 · 0 评论 -
C3017 OpenMP“for“语句中的终止测试格式不正确
记录一个OpenMP中的异常这里增加一个并行,编译出现下面错误原因分析:网上查了很多资料都没有,一直没有注意到CellRect.height()返回的是double类型,后来拆开才是下面代码,然后进一步测试解决改问题。问题解决:解决方案只用将终止条件的CellRect_H 改为int类型即可解决改问题。更改前:更改后问题解决:特此记录 2021.8.26...原创 2021-08-26 11:34:57 · 1064 阅读 · 0 评论 -
替代GDA中的获取rpc函数poDataset->GetMetadata(“RPC“)
使用gdal获取经纬度可以通过API this->poDataset->GetMetadata(“RPC”)来自动实现定位rpc文件,并且将内容读入到char** papszRPC变量中。如果用这个API则显得僵化,灵活度不够,要提前初始化变量poDataset(打开输入的影像),再进行下面的经纬度转换。这个函数是避免一系列操作,特殊时候,如:一个rpc对应多张影像得时候就非常实用//gdal要解析经纬度一般操作 char** papszRPC = this->poDataset-原创 2021-06-10 11:45:29 · 790 阅读 · 4 评论 -
遥感影像生成tfw文件
输入一个带仿射六参数的影像,生成tfw文件。#include <iostream>#include <gdal.h>#include <gdal_priv.h>#include <streambuf>#include <fstream>#include <iomanip>bool createTFW(char* imagePath);//创建tfw文件程序int main(int argc,char*argv[]){原创 2021-06-09 15:52:36 · 1418 阅读 · 0 评论 -
opencv像素遍历的三种方法
参考链接:OpenCV中高效的像素遍历方法,写出工程级像素遍历代码(贾志刚老师)测试图片:测试代码:功能:遍历测试图片每个像素,对它求反向图,即 255-pix#include <sstream>#include <stdio.h>#include <iostream> #include<opencv2\opencv.hpp>using namespace cv;using namespace std;void method_1(M原创 2021-04-27 10:10:44 · 1017 阅读 · 0 评论 -
Linux系统(离线或者在线)编译opencv4.0.1、opencv4.0.1 contrib及匹配测试代码
目的:编译匹配模块1、编译前准备,下载好安装包文件:1.1安装包1、cmake工具包,查看我以前写的另一篇帖子2、opencv4.0.1安装包3、opencv4.0.1 contrib安装包,链接:https://github.com/opencv/opencv_contrib/releases?after=3.4.94、原contrib缺少的文件,见参考链接1,可以通过原作者下载链接,或者百度网盘下载链接:https://pan.baidu.com/s/1BeYF8kqEZLAJYQj-Mvx原创 2021-02-24 00:31:38 · 1246 阅读 · 2 评论 -
QT中文编译出错
在学习QT使用,加载老师代码,编译运行出错。定位发现使用了中文,将中文替换成英文字母,可以编译通过。摘取代码如下,编译出错w.setWindowTitle(QString("主要看气质")); //设置标题将这一段更改为下面:w.setWindowTitle(QString("test")); //设置标题编译通过。通过网上查找资料,按照如下设置即可。工具-》选项-》文本编辑器-》UTF-8 BOM 栏设置为“如果编码是UTF-8则添加”如下图所示,设置完后可以编译通过但是有个毛病原创 2020-12-23 12:49:06 · 605 阅读 · 0 评论 -
泊松盘采样在匹配上的应用
先了解泊松分布,参考链接如下:1、泊松分布 (Poisson-Disc)算法2、泊松分布算法图解3、有人知道泊松盘采样算法吗?看了几天没看懂?概要先说明一下功能,这个算法主要是将所有的点采样分布均匀(大概如下图),仔细看了很久理论,没太清楚(可能主要是文字的东西,理解费劲),然后看着那个动画看,直至把动画全看完了,才理解其精髓泊松盘采样原理看看下面泊松采样展示的,是不是像个盘子,里面圆半径为r,外面圆半径为2r。然后随机取一个中心点,然后在r和2r范围内进行采样形成的采样点,采样点有红色、原创 2020-12-17 10:52:54 · 1067 阅读 · 0 评论 -
vector操作-依次从vector的中间向两边取数
从vector中间依次向两边取值,记录存之代码如下:#include <vector>#include <iostream>using namespace std;int main(){ vector<int> temp{ 0,1,2,3,4,5,6,7,8,9 }; int midle = temp.size() / 2; int midle2 = midle + 1; for (int i = 0; i < temp.size(); i+原创 2020-11-03 16:24:48 · 513 阅读 · 0 评论 -
vector操作-均匀取出任意K个值
vector中均匀取出任意K个值,核心思想是使用使用double类型的步长来避免误差不断扩大#include <vector>#include <iostream>using namespace std;bool compare(int a, int b){ return a < b; //升序排列}int main() {//取出K个值,均匀分布在vector里面 vector<int> temp{ 5,1,6,3,4,0,2,7,8,原创 2020-11-03 16:04:30 · 389 阅读 · 0 评论 -
C++ vector中删除元素
vector中删除指定元素 //删除指定元素 vector<int> v = {1,2,3,4,5,6,7,8,9,10,5,5,5}; printf("v size:%d\n", v.size()); //单独使用remove只代表移除元素,vector总大小还是原来大小,5、6为要删除的元素 //remove(v.begin(), v.end(), 5); //remove(v.begin(), v.end(), 6); //erase配合remove使用是真真的删除元素,v原创 2020-10-16 14:29:15 · 2987 阅读 · 0 评论 -
Linux cmake系统学习
更深入学习cmake后感觉收获颇丰,以前的两个帖子只针对opencv项目的小项目编译,如果针对一个项目中有很多cpp文件需要编译,另外如果有些CPP不在一个目录下,在多个子目录下的情况的解决方案。B站上的学习学习资料2学习资料3首先对于很多项目需要编译g++已经不适用了(如果不嫌麻烦也可以用),这里用到的是更简单的编译方法,利用cmake来编译现在介绍在一个C++项目编译中常用的语句多子文件夹的编译思路是对子文件夹中的所有cpp进行编译成动态库或者静态库#对子文件夹中编译静态库AUX_SOU原创 2020-09-07 18:44:00 · 244 阅读 · 0 评论 -
Linux下cmake 编译opencv demo 2种方法及其注意事项
首先上demo主程序代码,另存位opencv_demo.cpp#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;int main(void){ Mat src_image_ = imread("test.jpg"); // 读取当前目录下的test.jpg图片 imshow("src_image_", src_image_); /原创 2020-08-08 22:52:53 · 1986 阅读 · 0 评论