C++
文章平均质量分 70
FL1768317420
这个作者很懒,什么都没留下…
展开
-
[C++]OpenCV基于帧差法的运动检测
最简单的帧差法就是二帧差分法,将视频流中的前后两帧图像转换为灰度图像,再经过高斯模糊消除噪声干扰,然后将两帧图像进行相减操作得到两帧图像之间的差异区域,再对差异图像进行二值分割把差异区域作为前景、不变区域作为背景,并且进行开运算操作来消除一些微小干扰。可见三帧差分法的性能是要优于二帧差分法的,而且由于帧差法本身的运算规模并不算特别庞大,所以运行速度还是比较理想的,对于二帧差和三帧差之间的运行速度虽然有差距,但是在视频播放过程中均没有出现明显的卡顿现象。原创 2024-04-05 12:20:10 · 803 阅读 · 0 评论 -
[opencv]detectMultiScale做检测时候很慢
2、将scale_factor的值从1.1更改为1.2;(它提高了2倍的性能),如果还是很慢可以改5试试。1、增加最少的人脸的尺寸大小,从(30,30),尺寸(50,50)(它提高了2-3倍的性能)。探测器代替Haar探测器(它的速度更快2-3倍)。4、检查编译器选项(可能是您使用调试模式)。detectMultiScale调用。转载 2024-04-03 07:12:15 · 22 阅读 · 0 评论 -
[C++][opencv]opencv填充透明色到不规则polygon区域
大家用yolov5-seg分割都知道官方演示分割结果会把分割区域半透明填充到原图里面,那么C++如何实现呢。由于分割点是变动的,所以我们需要用变量控制分割点数。参考文章写的很不错,但是有个毛病,他这个是5点必须是常量,分割时候不一定是5个点,有可能是N个。上面5你可以换成变量进行操作,源码已经在VS2013+opencv3.4.4测试通过。注意C++new对象后需要及时释放资源不然可能会导致。转载 2024-04-03 07:11:18 · 13 阅读 · 0 评论 -
[C++]C语言读取写入CSV文件 [三] 进阶篇读取CSV文件
本系列介绍了如何利用C语言读取写入CSV文件,本篇是系列的第二篇,介绍了利用C语言读取CSV文件的进阶内容,包括如何处理读取得到的数据、利用结构体保存数据、识别被包裹的字段、处理字段开头和结尾处的空格和制表符、应对其他分隔符、和介绍了现有的一个支持读取CSV的库。本系列文章目录。原创 2024-04-02 14:18:37 · 464 阅读 · 0 评论 -
[C++]C语言读取写入CSV文件 [二]进阶篇写入CSV文件
包裹。原创 2024-04-02 14:18:01 · 828 阅读 · 0 评论 -
[C++]C语言读取写入CSV文件 [一]基础篇
CSV 是一种以纯文本形式存储的表格数据,具体介绍如下(来自维基百科逗号分隔值CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。原创 2024-04-02 14:17:19 · 1207 阅读 · 0 评论 -
[C++]C/C++中读写.csv文件
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。原创 2024-04-02 14:15:06 · 481 阅读 · 0 评论 -
[C++]c++开源库opencsv用法
跨平台多线程设计!使用C++分析大数据的时候,数据按CSV格式导出,可以用Excel分析数据。OpenCSV非常简单易用。原创 2024-04-02 14:12:54 · 186 阅读 · 0 评论 -
cuda环境变量的添加和cudnn安装
环境变量的添加:9.0版本9.2版本10.0版本10.1版本10.2版本11.0版本11.1版本11.2版本11.3版本cudnn安装:或者cudnn适配cuda12.2安装:转载 2024-04-02 14:08:54 · 132 阅读 · 0 评论 -
[C++]静态链接和静态库实践指北
近期的搬砖日常中涉及到了一些对于静态库和动态库的处理,在这个过程中刚好需要捋一捋自己对于C++静态链接和静态库的理解,正好有段时间没写东西了,这次记录下自己的困惑以及思考,方便以后遇到类似的问题可以快速查找;还是那句话,写,既是一种输出,也是一种输入。2023年第一篇,好好写写,希望自己和各位读者都能有收获。关于静态链接和静态库,可能你和我一样,感觉既熟悉又陌生,那么看完这篇文章后,相信你至少在应用层面,对于静态链接和静态库的理解会更清晰些。原创 2024-03-24 16:15:28 · 716 阅读 · 0 评论 -
[C++]学习C/C++中的静态
动态绑定也被称为后期绑定或运行时绑定,在运行时根据指针或引用所指向的对象类型来选择调用哪个函数,从而实现动态多态性。静态成员函数可以作为工具类函数,用于执行一些通用的操作,如字符串处理、数学计算等,不需要实例化对象即可使用。静态数据成员可以作为成员函数的默认形参,而普通数据成员则不可以。函数重载是指在声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序、类型不同,但是不能靠返回类型来判断。函数用static,意味着作用域被限制在定义它们的程序文件中(即别的程序文件不能用这个函数),比如。原创 2024-03-23 07:30:01 · 335 阅读 · 0 评论 -
[C++]学习C/C++中的const
函数后加const,一般只出现在类的成员函数定义中,这意味着这些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数。3.const修饰指针类型的返回值,能防止指针指向的值或者指针本身被修改。1.const修饰一般类型的返回值,修饰与不修饰返回值作用一样。2.const修饰引用类型的返回值,能防止引用的变量被修改。(3)指针和指针指向的内容都为不可变。(2)不能改变指针指向的内容。这里有一个有趣的用法。使用规则与变量类似。原创 2024-03-23 07:29:23 · 194 阅读 · 0 评论 -
[C++]学习pragma
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。#pragma warning( push )保存所有警告信息的现有的警告状态。参数在头文件(*.h)的开头使用,目的是防止该文件被包含(原创 2024-03-23 07:28:31 · 257 阅读 · 0 评论 -
[C++]C++中的public/protected/private/friend
如果想这么做,那么必须把类的成员都设置为public,然而这样带来的问题就是任何外部函数都可以访问它。C++提供friend修饰符,可以让一些你设定的函数能够访问保护和私有成员,避免把类成员全部设置成public,最大限度地保护数据成员的安全。总结:父类private中的成员不会被子类继承,父类public和protected中的成员,结合继承时父类的成员访问修饰符,访问范围两者中取小。一个类的成员函数函数也可以是另一个类的友元。友类的每个成员函数都可以访问另一个类的所有成员。(1)对受访范围的影响。原创 2024-03-23 07:27:42 · 385 阅读 · 0 评论 -
[C++]C++ 的getline()函数怎么使用
其中,第一种语法格式用于从文件输入流缓冲区中读取 bufSize-1 个字符到 buf,或遇到 \n 为止(哪个条件先满足就按哪个执行),该方法会自动在 buf 中读入数据的结尾添加 '\0'。类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。当文件流对象调用 getline() 方法时,该方法的功能就变成了从指定文件中读取一行字符串。我们知道,getline() 方法定义在 istream 类中,而 fstream 和。原创 2024-03-23 07:25:09 · 245 阅读 · 0 评论 -
[C++]c++如何实现反射功能
发展,网络带宽也大幅提高,万维网验证了纯文本的http协议是一个简单、易理解的通讯协议,这时软件工程的主要矛盾已不是需求与硬件之间矛盾,而是开发者与不断变更的需求、逐渐多元化的系统之间矛盾,这时开发者需要一个不受语言制约、可读性强、易调试的通讯协议。的地址等信息)编译到程序文件中,当程序运行时将这些信息加载到内存中去,做到运行时只根据对象的地址或引用就可以获取到对象的类型信息,从而利用这些信息达到修改或重建对象的目标。反射机制就说到这里,上面代码很简单,有兴趣的同学可以查看我的完整代码。原创 2024-03-22 07:33:00 · 887 阅读 · 1 评论 -
[C++]C++ 原始指针、shared_ptr、unique_ptr分别在什么场景下使用
在需要使用指针的地方,如果可以用std::unique_ptr,那么可以多用。因为unique_ptr很多时候是zero cost,它的局限性就是一次只能一次被一个变量持有,但是实际上这种场景其实很多,另外一些看似不能用unique_ptr的场景,稍微优化一下代码也可以改成unique_ptr。首先,需要用原始指针的地方,应该优先用引用。不能用引用的地方,才考虑原始指针,例如某些函数的返回值,可能需要空值的情况,引用不好表示空值,这时候就可以用指针。如果你感觉你需要用指针,先看看能不能用引用而不用指针;原创 2024-03-22 07:31:11 · 320 阅读 · 0 评论 -
[C++]c++ 将指针转换为 void* 后转换为怎么判断原指针类型
替代方案,在各种常可以让你存储任意类型的指针,且指针的类型不会丢失。既然不会丢失,就不存在指鹿为马,程序员的精神负担轻了不止一点点。的遗毒,存储指针的时候爽歪歪,取指针的时候就要完全靠程序员来保证类型是否正确,如果搞错了就是。但是mempool的代码可以隔离在固定的几个文件中,做好测试以后很少需要改动。C++的better C提现之一就是有多种类型安全的。,any可以存储任何指针,包括。的代码,其它的地方可以完全不用。就会少很多奇奇怪怪的bug。我自己的体验就是除了少数。原创 2024-03-22 07:30:34 · 256 阅读 · 0 评论 -
[C++]C++17怎么判断类型T是std::vector
stackoverflow 上看到的,直接一步到位,判断一个类是不是另一个模板类的特化类型。原创 2024-03-22 07:29:42 · 175 阅读 · 0 评论 -
[C++]C++的NULL,0,nullptr
我知道,如果我们一开始就有bar的这两个重载函数的话,我们会在一开始就想办法避免这个问题(不使用重载)或者我们写出正确的调用代码,然而后面的这个重载函数或许是我们几个月或者很长一段时间后加上的话,那我们出错的可能性就会加大了不少。这个时候危险了,a.cpp和b.cpp中的调用代码这个时候就不能按照期望的运行了。当bar的重载函数在后面加上来了之后,我们会发现出错了,但是出错的时候,我们找到b.cpp中的调用代码也很快可能忽略过去了,因为我们用的是NULL空指针啊,应该是调用的void。原创 2024-03-21 07:35:04 · 607 阅读 · 0 评论 -
[C++]C语言悬空指针和野指针
C语言中的指针可以指向一块内存,如果这块内存稍后被操作系统回收(被释放),但是指针仍然指向这块内存,那么,此时该指针就是“悬空指针”。这么做的好处是一旦再次使用被释放的指针 p,就会立刻引发“段错误”,程序员也就能立刻知道应该修改C语言代码了。最难调试的 bug 总是不能轻易复现的 bug,对不?上面我们讲的“悬空指针”是指向被释放内存的指针,// 现在 p 是“悬空指针”// 此时 p 是“野指针”// 避免“悬空指针”原创 2024-03-21 07:32:12 · 381 阅读 · 0 评论 -
[C++]用STL数据结构和算法来生成斐波那契数列
int fibFP(void) // 表示斐波那契数列三个元素之间的相互关系。OutputIterator可以是容器迭代器,也可以是输出流迭代器。// 利用静态变量在多次调用时形成记忆。STL算法通常是对一段容器区间(用两个迭代器表示两个端点)的操作。原创 2024-03-21 07:30:45 · 303 阅读 · 0 评论 -
[C++]C++函数返回值使用指针的两种方法
/申请10个整数的内存。int* add2(int a, int b) {//第二种:使用静态变量,返回静态变量地址。int * add1(int a, int b) {//第一种:开内存存数,返回地址。在使用delete释放的时候需要注意的是定义数组动态内存释放的时候需要加上运算符[]int * a=NULL;//初始化为NULL的指针;//为变量申请内存;原创 2024-03-21 07:29:55 · 193 阅读 · 0 评论 -
[C++]C++与C中const关键字有什么区别
但是,千万不要写这样的代码!与C语言中const关键字不同的是,C++中使用const关键字定义的b变量的值在被改变时会被检测。另外它们的作用也是一样的,声明一个只读变量,不希望被修改,一旦被修改,编译器将会报错。正因如此,const修饰成员函数不与static关键字同用,因为static修饰的静态成员函数不能实例化,也就没有实例的成员变量一说,自然不存在修改成员变量。同样的,修饰函数返回值时,修饰内置类型与不加const修饰是一样的,但对于自定义类型,不能对返回值进行修改,即返回的是常量。原创 2024-03-21 07:29:14 · 477 阅读 · 0 评论 -
[C++]new和delete C++动态分配和释放内存
其中,T 是任意类型名,p 是类型为 T* 的指针,N 代表“元素个数”,可以是任何值为正整数的表达式,表达式中可以包含变量、函数调用等。但是在实际的编程中,往往会出现所需的内存空间大小取决于实际要处理的数据多少,而实际要处理的数据数量在编程时无法确定的情况。如果动态分配了一个数组,但是却用delete p的方式释放,没有用[],则编译时没有问题,运行时也一般不会发生错误,但实际上会导致动态分配的数组没有被完全释放。同样地,要求被释放的指针 p 必须是指向动态分配的内存空间的指针,否则会出错。原创 2024-03-21 07:28:36 · 624 阅读 · 0 评论 -
[C++]visualStudio中C++ dll的配置
需要注意的是,并非所有的编译器都完全支持最新的C标准版本,因此需要确保使用的编译器能够兼容所选的标准版本。需要注意的是,并非所有的编译器都完全支持最新的C标准版本,因此需要确保使用的编译器能够兼容所选的标准版本。在 Visual Studio 中,“公共语言支持”(Common Language Support,简称CLS)是一项针对.NET平台的规范,它确保不同编程语言编写的代码可以相互交互和调用,以实现跨语言的开发和组件复用。建议根据项目的特殊需求和目标平台的字符集支持,选择适当的字符集设置。原创 2024-03-20 07:47:29 · 928 阅读 · 0 评论 -
[C++]C++动态链接库(DLL)的创建和调用
我们在编写C/C++等语言程序的时候,经常会遇到很多反复使用的或者常用的部分,如果没次都重新编写代码是一件十分麻烦且无意义的事情,会严重影响我们的工作效率以及代码的可读性,并且无法在其他项目重复使用我们的代码。2>>隐式链接采用静态加载的方式,需要将创建的.dll文件以及.lib文件还有定义的.h头文件,拷贝至我们需要测试的新项目的目录下。现在我们头文件中一个用于加法和减法的函数并加上宏定义的修饰符,以及声明一个需要导出的类的函数。在我们创建的.cpp文件中包含我们的.h头文件并且实现我们的函数。原创 2024-03-20 07:46:46 · 1104 阅读 · 0 评论 -
[C++]C++ 调用python
检查Python 安装目录下已经包含头文件( 就是c++里 需要include 的目录)和库文件 ( Windows 下为 python27.lib)。主流方法将python程序编程文本形式的动态链接库,在c/c++程序中调用其中定义的函数。以下是测试用的python脚本文件,功能是输出命令行参数:sample.py。以下是测试用的c程序文件:test.c。这一步可以参考下知乎网友的配置方式。(这个方法可能取返回值不方便)原创 2024-03-20 07:45:17 · 360 阅读 · 0 评论 -
[C++]多态性
1. 函数重载2. 运算符重载3. 静态联编 (略4. 动态联编和虚函数 (略5. 纯虚函数和抽象类(略1)封装性、继承性、多态性构成OOP的三大特性。2)在C++中,多态性分为两种:①静态多态 ②动态多态3)函数重载和运算符重载属于静态多态。函数重载:相同函数名可以完成不同功能。运算符重载:相同运算符完成不同功能。4)动态多态是指:程序执行过程中确定的关系,如动态确定函数的调用关系。5)运行时的多态(动态多态)是通过类的继承和虚函数来实现的。原创 2024-03-20 07:42:37 · 618 阅读 · 0 评论 -
[C++]指针数组、数组指针,指针函数和函数指针两组对应的区别
其实指针可以实现一些非常好的功能,当年我就用一个指针数组,保存一些函数的指针,然后把这个数组的指针作为参数传到调用方,调用方可以方便地根据需要,选择数组中不同的指针对应的函数来进行调用,实现了灵活的函数数组,例如这实现一个遥控器功能的程序,把每个按钮的功能写成一个函数,然后的把这些函数的指针装入一个数组,根据数组的下标来调用不同的函实,实现不同的功能。是一个指向一个函数的指针,可以把这个指针作为参数传进去,调用者用这个指针可以调用对应的函数,.NET里的delegate应该是使用这种机制实现的。原创 2024-03-20 07:39:47 · 277 阅读 · 0 评论 -
[C++]c++中的继承
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。2、如果父类中有这个函数,并且是虚函数,然后去看子类中有没有重写,如果子类中重写了就调用子类中的重写函数,如果子类中没有重写,调用父类的函数。保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。3、当子类继承了父类,子类中将具备父类中的所有成员,和访问权限没关系。原创 2024-03-20 07:38:46 · 651 阅读 · 0 评论 -
[C++]C++等号运算符重载
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。有点类似复制构造函数,将等号(=)右边的本类对象的值复制给等号左边的对象。与其他函数一样,重载运算符有一个返回类型和一个参数列表。原创 2024-03-19 07:43:37 · 287 阅读 · 0 评论 -
[C++]C++11关键字override和final
C++ 多态行为的基础:基类声明虚函数,派生类声明一个函数覆盖该虚函数。在C++ 11之前,没有一个强制的机制来标识虚函数在派生类中正确被重写。原创 2024-03-19 07:42:35 · 346 阅读 · 0 评论 -
[C++]C++类中默认成员函数的注意事项
对于刚接触C++的同学,定义一个类时需要小心编译器默认提供的成员函数,防止出现非预期的情况。原创 2024-03-19 07:41:07 · 203 阅读 · 0 评论 -
[C++]GCC的常用编译选项
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。对于 C 语言源代码文件,使用 GCC 生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。GCC 的编译选项有很多,在开发阶段,经常使用一些有用的警告选项来排查常见的代码 Bug,同时也是是检查代码正确性、提高代码鲁棒性的重要手段。原创 2024-03-19 07:40:03 · 866 阅读 · 0 评论 -
[C++]C++四种强制类型转换
隐式类型转换是编译器自动隐式进行的,需要在代码中体现,而显示类型转换由程序员明确指定。C++支持C风格的强制转换,但是C风格的强制转换可能带来一些隐患,让一些问题难以发现。下面对这四种转换操作的适用场景分别进行说明。原创 2024-03-19 07:38:45 · 840 阅读 · 0 评论 -
[C++]深入理解C++ 17 结构化绑定[key, value] 的处理
在探索结构化绑定(Structured Bindings)的世界之前,让我们先沉思一下计算机科学家Edsger W. Dijkstra的名言:“简单性是成功的关键。” C++17标准引入的结构化绑定,正是这一理念的体现,它为我们提供了一种更简单、更直观的方式来操作复合数据类型。结构化绑定,中文可以称之为“结构化解构”或“结构绑定”,是一种新的语法结构,允许你同时从元组、结构体、数组等数据结构中提取多个变量。在C++之前的版本中,如果你想从一个元组中提取值,通常需要使用。原创 2024-03-18 07:38:52 · 1071 阅读 · 0 评论 -
[C++]理解学习 C++ 17 折叠表达式 的用法
在C++11引入的变参模板中,参数包(Parameter Pack)是一种特殊的模板参数,它可以接受任意数量的模板参数。这也使得折叠表达式成为处理参数包的首选方法,尤其是在需要对参数包中的所有元素执行统一操作的场景中。综上所述,折叠表达式是处理参数包的强大工具,特别适用于那些需要对参数包中的所有元素执行统一操作的场景。然而,对于需要更复杂逻辑处理的情况,或者在处理非同质参数包时,可能需要采用更复杂的模板编程技术。由于其强大的灵活性,它们可以被应用于多种不同的场景中,大大简化了对参数包的操作。原创 2024-03-18 07:36:35 · 754 阅读 · 0 评论 -
[C++]C++ noexcept 关键字
然而,这种优化通常是微不足道的,因为大多数函数调用的成本都远大于检查异常的成本。另一个可能的优化是,如果编译器知道一个函数不会抛出异常,它可能更愿意将这个函数内联。一般来说,编译器在处理可能抛出异常的函数时需要考虑的情况更多,因此需要生成更复杂的代码,尤其是在涉及栈展开(stack unwinding)的情况下。时,编译器可以确保这个函数不会抛出异常,从而在生成代码时可以忽略处理异常的部分,产生更简洁、更高效的代码。对性能的影响并非直接的,而是通过允许编译器做出某些优化来实现的。在程序性能优化中的作用。原创 2024-03-18 07:34:26 · 658 阅读 · 0 评论 -
[C++]glog、log4cplus 和 spdlog 的日志输出性能分析
glog,即Google Logging Library,是由Google开发的一款高效的日志库,广泛应用于各种C++项目中。glog提供了丰富的日志记录功能,包括日志级别、条件日志、日志输出控制等,能够满足开发者在不同场景下的日志记录需求。log4cplus 是一个灵活的日志库,受到了 Java 的 log4j 库的启发,并为 C++ 设计。它提供了丰富的日志级别、日志格式和输出目标的配置选项,使得开发者能够根据应用程序的需要灵活地记录信息。原创 2024-03-18 07:31:43 · 769 阅读 · 0 评论