
C-Cpp
文章平均质量分 93
熊叫大雄
雁归时,佳期如梦。
展开
-
[边缘检测算法] Sobel算子及其PC端优化提速20几倍
文章目录前言一、Sobel算子二、实现与优化1.原始版本2.第一版优化3.第二版优化4.第三版优化5.第四版优化6.第五版优化前言 Sobel是图像处理中非常常见的一种边缘检测算法,本文基于C++和OpenCV对Sobel进行了实现,并对代码进行优化。一、Sobel算子 Sobel算子是图像处理中的一个离散微分算子,经典的Sobel算子包含了一个33的矩阵(OpenCV中的Sobel是包含其它尺寸的,本文原创 2021-03-05 11:12:41 · 4184 阅读 · 1 评论 -
C++:log日志
前言 日志一般是记录一些程序运行信息的文件,一般是用于快速定位错误所在,追踪程序运行的过程和进度、采集运行环境等作用。说白了简单粗暴点就是程序挂了,可以看到大概在哪里挂的,挂的原因可能有哪些等作用。 最近在github上找了些C++的日志库,做了些简单的使用记录。一、NanoLog C++ 11 在github上找到的NanoLog有几个版本,不过我只下载了两个星星数量最高的,一个是...原创 2020-05-05 21:54:49 · 6369 阅读 · 2 评论 -
C++:http消息
前言 最近的一些开发,需要用到http服务,大致是两种,一种是我们算法端起http服务,等到后端发送消息给算法,然后算法去解析消息,得到我们要的图像数据;第二种是,我们算法端处理完图像之后,需要将结果发送给后端,那么如果是后端发送给我们的,其实可以将处理完的结果返回即可;但也有一种情况是,需要我们算法去给后端发消息的。 所以这其中就涉及两种情形:第一种是算法起服务,第二种是算法发送http...原创 2020-04-25 22:48:00 · 2848 阅读 · 3 评论 -
偏要叫[C++] Base64编码
前言 Base64非常常见的用于传输8Bit字节码的编码方式之一,也就是采用64个可打印的自体来编码二进制数据进行传输的方法。在ASCII表中,0~31、127是控制字符32~126属于可打印字符,而Http协议下传输二进制数据,是需要把数据转为字符来传输的,所以实际上能用于传输的就是ASCII表中的32~126这95个字符,base64则是采用了其中的64个来编码。 标准base64中可...原创 2020-04-24 23:50:44 · 634 阅读 · 0 评论 -
QMainWindow的空间布局结构
简单讲一下Qt的QMainWindow的结构,Qt的顶级窗口有三种类型,首先是万恶之源(...应该说是大部分控件的父类...)的QWidget,然后是QMainWidget和QDialog,后面两者也是继承自QWidget的,QMainWindow跟QWidget的区别在于,他有菜单栏,有工具栏,有悬浮窗口栏,有状态栏,而QWidget一般是没有的,由于QWidget是万恶之源,所以,实际上,继承...原创 2019-09-10 18:20:58 · 442 阅读 · 0 评论 -
在VS中编写Qt5涉及到的一点字符串问题
在VS中开发Qt5程序似乎成了我的一种习惯,因为觉得VS简直不能再溜了,不愧是“宇宙第一IDE”。所以在开发中难免会遇到中文显示乱码的问题,网上找到的很多方法都是类似于下面这样的:QStringLiteral("中文")或者这样的:#pragmaexecution_character_set("utf-8")还有这样的:QTextCodec*BianMa=Q...原创 2019-09-09 15:24:49 · 214 阅读 · 0 评论 -
Qt5学习笔记(1)-环境配置(win+64bit+VS2013)
Qt5学习笔记(1)-环境配置工欲善其事必先…不装…所以装软件久不露面,赶紧打下酱油。下载地址:http://download.qt.io/ 这个小网页就可以下载到跟Qt有关的几乎所有大部分东西 地址:http://download.qt.io/archive/qt/这个小网页可以下载到Qt的各个历史版本 然后,比如我安装Qt5.7.1,那就点开5.7,选择5...原创 2018-05-06 13:24:18 · 428 阅读 · 0 评论 -
Qt creator中配置opencv win7 64bit
64bit win7环境,MSVC2013(64bit)版本Qt5.5.1的Qtcreator配置opencv2.4.9,自己出现的一些小问题和解决方法。原创 2016-10-27 22:31:50 · 655 阅读 · 0 评论 -
树莓派安装ncnn
前言 ncnn是腾讯开源的用于手机端部署深度学习模型的框架,目前也支持在树莓派上使用。ncnn提供C++的借口,支持caffe等框架的模型进行转换。 目前ncnn已经开源,代码放[github](https://github.com/Tencent/ncnn "github")上,但是原版的代码对tensorflow支持不是很好,因此有大神搞了个支持tensorflow的ncnn,也在g...原创 2020-04-12 00:22:24 · 1833 阅读 · 0 评论 -
C++基础--智能指针
智能指针其实也不是完全的指针,应该说是像指针一样的类对象,智能指针通常有指针的功能,当然同时也包含了一些额外的功能。目前比较常见的智能指针有auto_ptr、unique_ptr和shared_ptr三种(其实还有weak_ptr第四种),本篇主要也是讲这三种。auto_ptr是C++98提出来的,到了C++11基本已经摒弃这种用法,但是一些编译器还没有支持C++11的标准,还用C++98的标...原创 2019-10-01 09:37:02 · 226 阅读 · 0 评论 -
C++基础--函数模板
函数模板是通用的函数描述,其使用泛型来定义函数。其实就是有些操作,如果撇开具体的变量的数据类型,其操作是一样的如果我们将这些操作写成一个模板,在调用不同变量的时候就设定好变量类型就可了,后续的操作基本都是一个流程了。比如我要对两个变量进行交换,那么不管是int型、double型还是long型或者类或者结构体啥的,我都可以这样实现:TA=AAAAA;TB=SB;Ttemp...原创 2019-09-30 10:29:06 · 172 阅读 · 0 评论 -
C++基础--引用的一点补充
这一篇是对引用的一点补充,内容基本上是来自《C++ primer plus》一书第八章的内容。前面一篇介绍了引用的一点特点,这里补充一个,将引用用于类对象的时候,有一个体现继承的特征,就是当基类引用可以指向派生类对象,而不需要进行类型强转。这个特征有一个用法是在调用一个接收基类引用作为输入参数的函数的时候,可以将基类对象作为参数,也可以将派生类对象作为参数:classA{publi...原创 2019-09-27 16:37:16 · 189 阅读 · 0 评论 -
C++基础--引用做函数参数
引用,简单粗暴的解释叫做别名,简单粗暴的例子就是,我是熊叫大雄,但是很多时候别人不叫我熊叫大雄,会叫我大雄,粤语地区朋友爱叫我阿雄,有人叫我雄,所以,熊叫大雄这个变量的值是我,雄、大雄、阿雄是熊叫大雄的别名,通过别名叫到的值还是我,晕了没?这一篇主要讲引用做函数参数,引用还有其它内容,不过我觉得做函数参数比较常用且好理解一点,1、创建引用引用的创建形式有点类似指针,但是又有不同,一般这...原创 2019-09-27 08:07:37 · 6352 阅读 · 1 评论 -
C++基础--虚函数和纯虚函数
虚函数的一种重要的应用是在子类重写父类方法上,一般都是在父类中声明的时候用关键字virtual修饰。在C++中,一个父类的对象指针是可以指向子类的实例化对象,这个时候可以用该对象指针来访问父类的成员函数,但是访问不了子类的成员函数。如果这个父类的对象指针想要访问子类中的函数,则需要在父类中对应的函数添加virtual关键词将该函数变为虚函数,这个时候父类的对象指针就可以访问子类重写父类虚函数:...原创 2019-09-26 09:52:46 · 293 阅读 · 0 评论 -
C++基础--随机数
C/C++要产生随机数的方法一般是采用rand()函数核srand()函数来实现的。rand()函数返回的是一个伪随机数,这个函数内部采用线性同余法来实现伪随机数,而这个伪随机数是在一定范围内可以看作是随机的。rand()函数返回的随机数的范围在0~RAND_MAX之间,这个RAND_MAX的定义在头文件<stdlib.h>中:#define RAND_MAX 0x7fff...原创 2019-10-01 13:27:38 · 434 阅读 · 0 评论 -
C++基础--重载、重写、隐藏
1、重载(overload)重载的概念是在同一作用域内,函数名相同,函数输入参数个数、数据类型不同,但是不能是函数名、参数个数、数据类型完全相同但返回值不同的情况。最直接的例子是常见的构造函数重载,在写一个类的时候可能会出现多个构造函数,每个构造函数的输入参数是不一样的,有无输入参数的默认构造函数,也有带参的构造函数。所以,重载的特点总结为: 在同一作用域(比如同一类中的成员函...原创 2019-09-26 09:49:39 · 192 阅读 · 0 评论 -
VS Qt国际化操作
开发一个软件的时候有时候会遇到需要进行国际化的操作,也就是说一些显示可能因为需求而要改为另一种语言,像一些常见的软件是会提供一些语言包,然后再软件中加载就可以更换显示语言了,今天这一篇讲的就是这个,而且暂时针对VS下开发Qt而言,如果在Qt Creator上开发的话,可能会有不同,但是大致还是一样的。在VS上开发Qt的项目的话是,Qt的VS插件是很有用的,现在我们的国际化操作也是要依赖这一个小...原创 2020-01-11 09:48:57 · 766 阅读 · 4 评论 -
C++写入txt
C++写txt的时候可以用到std::ofstream来实现。代码:#include<stdlib.h>#include<fstream>#include<string>#include<iostream>intmain(intargc,char*argv[]){ std::ifstreamfIn("s...原创 2019-09-20 17:57:03 · 6445 阅读 · 1 评论 -
C++逐词读取txt
这一篇来写下std::ifstream读取txt的另一种方式,逐词读取,上一篇是按行读取,逐词读取的话每个单词都以空格或者换行等符号间隔开。代码如下:#include"stdafx.h"#include<stdlib.h>#include<fstream>#include<string>#include<iostream>...原创 2019-09-20 17:57:13 · 714 阅读 · 0 评论 -
C++逐行读取txt
C++读取txt文件的时候可以使用std::ifstream来实现,如果打开文件失败的话,其变量会是空的,所以可以用来判断是否打开成功。#include<stdlib.h>#include<fstream>#include<string>#include<iostream>intmain(intargc,cha...原创 2019-09-20 17:57:32 · 915 阅读 · 0 评论 -
C#调用C++系列二:传结构体
这一篇记录下C#调用C++的结构体的方式来使用OpenCV的数据格式,这里会有两种方式,第一种是C#传一个结构体和图像的路径给C++,然后C++将图像加载进来,再把传进来的结构体填满即可,第二种是C#加载好图像之后传给C++去使用OpenCV处理图像。情形一:C#传结构体给C++填满这一种跟系列一的方式是一样的,只不过我将很多参数封装为一个结构体罢了,调用起来也就是函数参数看起来变少了而已...原创 2019-09-18 15:15:17 · 3181 阅读 · 1 评论 -
C#调用C++系列一:简单传值
因为去实习的时候有一个小任务是C#想调用C++ opencv实现的一些处理,那我主要的想法就是将C++实现的OpenCV处理封装成dll库供C#调用,这里面还会涉及到一些托管和非托管的概念,我暂时的做法是非托管的方式,托管的方式好像是在编译C++的DLL库的时候打开托管的选项即可,这部分还不是很清楚,所以就记录下我暂时知道的一点做法。先说下简单的调用吧,就是简单的调用C++的函数,传递一些常见...原创 2019-09-18 14:21:06 · 1223 阅读 · 0 评论 -
Tensorflow加载多幅图像进一个tensor
这里加载多幅图像进一个tensor,我用的还是opencv读取图像的做法,然后这里要介绍Tensor的一个函数Tensor Slice(int64 dim0_start, int64 dim0_limit) const;可以看到它返回的还是一个tensor,参数是一个tensor的切片的起止下标,而且是一个左闭右开的区间,我就是利用这个函数将加载进来的多幅图像塞进去的,并且对获取到的切片...原创 2019-11-03 22:35:40 · 780 阅读 · 0 评论 -
OpenCV--基于直线检测的文本图像倾斜校正
图像倾斜矫正的方式有很多种,今天简单介绍一种基于直线检查的倾斜校正。这种方法暂时在如下图的文本文件上测试过,不一定能针对所有:首先,因为这种图像基本是比较常见的白底黑字,所以首先对这幅图做一个灰度化,灰度化之后做一个二值化,得到二值图像:二值化之后,将X轴方向的的像素点连起来,这里我采用的是形态学的膨胀,因为我做二值化的时候采用了取反的操作,这里可以考虑不取反,但是要用腐蚀来做...原创 2019-12-02 11:26:07 · 4789 阅读 · 2 评论 -
C++基础--转string
在C++中,任意数值型转可以使用字符串流的方式来实现,如果编译器支持C++11标准的话,也可以用to_string()函数来实现。1、to_string()to_string()包含在头文件<string>中:stringto_string(int_Val)stringto_string(unsignedint_Val)stringto_string(lo...原创 2019-10-03 08:30:09 · 929 阅读 · 0 评论 -
C++基础--string转
有时候除了要将数值型转为string外,可能也需要将一些string转为数值型,这个时候也还是可以用sstream字符串流来实现,同时也可以用C++标准库得到函数来实现。1、字符串流这个时候使用istringstream()函数来实现:std::istringstreamiss(sStr);doubledNum1=0.0;iss>>dNum1;std::...原创 2019-10-03 12:37:07 · 225 阅读 · 0 评论 -
OpenCV和Qt的图像格式互转
做图像处理的时候经常使需要用到opencv的,这应该是免费的图像处理库中用得最广泛而且最好用的库了吧。然后有时候想用界面来展示点东西的时候,我们就需要编写个界面,编写界面的方法千千万,弱水三千我只取一瓢饮,所以我用Qt来写界面,这个时候,就会想,如果我用OpenCV处理后的图像不会还要用OpenCV的GUI来显示吧,虽然完全可以这么做,但是既然都有个界面了,为啥我们还要用两个窗口来显示呢,于是就有...原创 2019-09-12 01:07:12 · 1654 阅读 · 0 评论 -
Cmake构建OpenCV测试例子
适用Cmake的CMakeLists.txt来编译一个OpenCV的测试例子。CMakeLists.txt的写法为:project( main )#添加头文件路径include_directories(/usr/local/opencv347/include /usr/local/opencv347/include/opencv /usr/local/opencv347/inclu...原创 2019-11-03 21:43:53 · 686 阅读 · 0 评论 -
Windows下C++遍历文件夹中的文件
Windows下,在VS中开发,C++遍历文件夹下文件。在Windows下,遍历文件所用到的函数和结构体,需要在程序中包含头文件#include <io.h>,在VS中,头文件io.h实际上是包含了另一个头文件corecrt_io.h的,所以需要用到的函数和结构体也都是包含在corecrt_io.h这个头文件中的。首先是遍历文件的时候用于存储文件信息的结构体_finddata_...原创 2019-10-06 13:27:34 · 2174 阅读 · 1 评论 -
略坑的C#自动回收机制
说起这个坑货,要说说折腾了好久的bug,项目对方需要在32位系统上使用,C#加载图像扔给C++处理再返回。所以想好了,C#这边加载图像开好内存扔给C++,各自开的内存各自释放。所以,在32位系统上出问题了,64位的没出现。而周围的同事没有懂C#的,都是懂C/C++的比较多,所以折腾了这么久,一直以为是我C++没写好导致内存不足,还纳闷好奇了好久,用C++调dll都一直没有问题,用C#在64位下...原创 2019-09-23 09:36:12 · 838 阅读 · 0 评论 -
error LNK2019: 无法解析的外部符号……
在VS中开发程序的时候遇到一个问题,应该算是比较常见,所以记录下。在编译程序的时候遇到一个错误,大致提示如下:“error LNK2019: 无法解析的外部符号……”遇到这个错误一般是因为存在以下三种情况:1、引用别人编译好的库,这个时候一般是引入头文件后,没有将lib文件导进工程中,所以需要在VS的工程属性设置中将lib文件加到工程里;2、自己写的.h/.cpp文件,但是没有...原创 2019-10-09 11:10:49 · 424 阅读 · 0 评论 -
排序之快速排序
快速排序,从名字来看就够藐视一切了,不过经过测试,快速排序还是比较对得起这个名字的,速度还是比较快的,不过快速排序依然是一个不稳定排序,其平均时间复杂度为NlogN。快速排序的基本思想是在一个数组中找一个元素为参考值,将大于它的元素放在一边,然后将小于它的元素放在另一边,这样其实就得到两个子数组,然后对子数组再分别找一个参考点,大于参考点的放在一边,小于的放在另一边,如此循环下去,所以在做的时...原创 2019-09-08 11:51:44 · 135 阅读 · 0 评论 -
基于Qt5的排序算法简单可视化
之前写了几个排序算法,然后看到别人将排序算法的过程可视化出来,所以就想尝试一下,然后就用Qt简单写了个界面,用QImage和QPainter来画图显示,代码比较简单。我的想法是画图的时候,图像的X轴对应数组的,然后画垂直线,线的高度就是数组元素值的大小。首先需要一个画整个数组的函数,这个函数要将数组整个画到图像上,背景取黑色,然后线取绿色,为了可视化,将图像的大小设置为宽度数组的元素个数乘以1...原创 2019-09-08 21:16:14 · 1931 阅读 · 11 评论 -
排序之归并排序
归并排序的思想是,将小的有序数组归并为一个大的有序数组,也就是对于一个数组,将其不管拆分为小的数组进行排序,然后将排好序的小数组再归并为稍大的数组,再将稍大的数组归并为原来的数组。归并排序的是稳定排序,其时间复杂度为归并的时候要判断三个条件:1、当左半边数组用尽的时候要取右半边的数组;2、当右半边数组用尽的时候要取左半边的数组;3、如果未用尽,右边当前的元素与左边当前的元素作比...原创 2019-09-09 15:23:50 · 210 阅读 · 0 评论 -
[OpenCV] 直方图均衡化
直方图是图像处理中最最最最基本的操作之一,这个基本操作是在太太太太常见了,同时也是很容易理解的操作,对于一些对比度稍微较低的图像,这是一个还挺不错的预处理操作。1、直方图先说直方图,直方图就是图像像素的统计表,这个表里记录着一幅图像中每个像素值在图像中出现的个数,一幅图只有一个灰度直方图,但是多幅图可能有相同的直方图,这是N对1的关系。所以在制作直方图的时候就很容易啦,创建一个包含所有像素...原创 2019-10-12 14:17:32 · 254 阅读 · 0 评论 -
C++保存数据到CSV文件
主要是今天工作的时候需要把一些数据保存到本地,因为是一些预测值和标签的对比,还有预测值的概率,所以想到用CSV文件来保存,大概查了一下,还是比较简单的,所以记录一下。首先要说明的是CSV文件有点类似excel文件,也可以用excel文件直接打开的。在写数据到CSV文件的时候要注意,字符串逗号表示的是换列,换行符号就是换行,所以在写数据的时候要注意好这两点就可以了。然后写的时候也很简单,直接...原创 2019-09-23 16:23:26 · 10833 阅读 · 0 评论 -
堆和栈的一点知识
堆栈的一点知识原创 2016-07-11 10:40:52 · 315 阅读 · 0 评论 -
[Qt5] QSlider设置步长
这是一个小问题,就是QSlider是一个滑动条控件,既然是个滑动条控件,就会想要用鼠标滚轮或者鼠标去移动它来实现某些功能,但是呢,我能说这个控件的一个属性函数设置也是比较奇怪的,它设置步长的函数有setSingleStep(int);这应该是很多可以滑动或者说调值的控件都有的属性设置吧,然而,我竟然发现,即使有这个函数,QSlider设置步长的话也不是用它,而是用下面这个:setP...原创 2019-09-03 14:03:24 · 4301 阅读 · 0 评论 -
[C/C++]编程规范一:头文件篇
一般来说,每一个.cc或者.cpp文件对应一个头文件(.h文件),当然,也有例外,例如一些测试单元或者main文件,头文件的一些规范可以令代码可读性、程序的性能等大为改观,所以还是要注意头文件的规范问题。一、#define保护所有头文件为了防止文件被多重包含(multiple inclusion),一般就需要#define保护。#define保护的格式如下:<PROJECT&g...原创 2019-09-03 14:03:51 · 2086 阅读 · 0 评论 -
[C/C++]'fopen': This function or variable may be unsafe
这个错误也算比较常见吧,当然这个与代码无关,是编译器的问题,主要是VS中出现的,因为微软方面认为fopen函数是不安全的,于是自己搞了一套fopen_s的函数来代替,用前面一个的话编译器是会出错的,所以需要在设置里添加一些东西,具体操作添加如下指令:_CRT_SECURE_NO_WARNINGS长堤春水绿悠悠,畎入漳河一道流...原创 2019-09-03 14:04:26 · 7964 阅读 · 0 评论