Skip to content

Commit fa55613

Browse files
committed
Modify format
1 parent 9480093 commit fa55613

17 files changed

+221
-194
lines changed

MySql/C++ 实现数据库连接池.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
#### 概 述
1+
## 概 述
22
本文介绍使用C++实现数据库连接池。
33
连接池的基本思想就是在初始化时,将数据库连接对象保存在内存中,当用户需要访问数据库时,并非新建一个连接,而是从连接池中取出一个空闲的连接对象;使用完毕后,也并非直接断开连接,而是重新放到连接池中。以达到避免频繁连接断开数据库,提高数据库的处理效率。
44

5-
#### 实 现
5+
## 实 现
66
根据连接池的基本思想,我们设计一个数据库连接池,如下:
77
- 单例模式,保证进程唯一
88
- 使用queue来管理数据库连接对象(静态大小)

MySql/Linux C++连接MySQL.md

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
#### 23.3.9 更 新
2-
单纯安装`mysql-server`可能会没有`mysql.h`头文件,我们还需要安装下相关的链接库
1+
## 23.3.9 更 新
2+
单纯安装 `mysql-server` 可能会没有 `mysql.h` 头文件,我们还需要安装下相关的链接库
33
```
44
sudo apt-get install libmysqlclient-dev
55
```
66
****
7-
#### 概 述
7+
## 概 述
88
Linux下C++连接MySQL
99

10-
#### 实 现
10+
## 实 现
1111
**1. 环境安装**
12-
首先是MySQL的安装,直接只用`apt-get`命令安装(这里推荐使用这种方式安装,因为此方式在后面程序编译时,不需要自己链接相关路径)
12+
首先是MySQL的安装,直接只用 `apt-get` 命令安装(这里推荐使用这种方式安装,因为此方式在后面程序编译时,不需要自己链接相关路径)
1313
```
1414
sudo apt-get install mysql-server
1515
```
@@ -33,7 +33,7 @@ systemctl status mysql.service
3333
```
3434

3535
**2. 配置**
36-
第一次安装MySQL后,是如法直接用root用户登录的,会报错`Access denied for user 'root'@'localhost'`。此时,我们先查看MySQL配置文件,获取默认用户名和密码:
36+
第一次安装MySQL后,是如法直接用root用户登录的,会报错 `Access denied for user 'root'@'localhost'`。此时,我们先查看MySQL配置文件,获取默认用户名和密码:
3737
```
3838
// 命令
3939
sudo cat /etc/mysql/debian.cnf
@@ -50,7 +50,7 @@ user = debian-sys-maint
5050
password = ***(这里我隐藏了,是一串英文和数字)
5151
socket = /var/run/mysqld/mysqld.sock
5252
```
53-
我们直接使用配置文件中提供的用户名`debian-sys-maint`和密码,登录MySQL
53+
我们直接使用配置文件中提供的用户名 `debian-sys-maint` 和密码,登录MySQL
5454
```
5555
$ mysql -udebian-sys-maint -p
5656
Enter password: (这里输入配置文件中的密码)
@@ -63,7 +63,7 @@ mysql> flush privileges; //这一步不要忘记,让MySQL重新加载权限数
6363
此时,退出MySQL,我们就可以用root账户和设置的密码正常进入MySQL了。
6464

6565
**3. C++操作MySQL**
66-
我们创建好数据库以及供demo使用的表和字段,具体的命令操作这里就不展示了。
66+
我们创建好数据库以及供demo使用的表和字段,具体的命令操作这里就不展示了。
6767
使用C++操作MySQL是通过MySQL提供的函数接口进行连接操作,示例代码如下:
6868
```
6969
#include <iostream>
@@ -114,10 +114,10 @@ set(CMAKE_CXX_STANDARD 14)
114114
add_executable(sqlDemo main.cpp)
115115
target_link_libraries(${PROJECT_NAME} libmysqlclient.so) //链接 libmysqlclient.so
116116
```
117-
这里需要说下,上文中提到的建议使用`apt-get`命令安装的原因,如果我们自己下载MySQL源码进行编译安装,在编译自己的程序时可能会遇到如下的几种问题:
118-
- **找不到mysql相关头文件**:需要在CMakeLists.txt中使用`include_directories()`添加MySQL头文件目录
119-
- **找不到mysql动态链接库**:需要在CMakeLists.txt中使用`link_directories()`添加MySQL动态链接库目录
117+
这里需要说下,上文中提到的建议使用 `apt-get` 命令安装的原因,如果我们自己下载MySQL源码进行编译安装,在编译自己的程序时可能会遇到如下的几种问题:
118+
- **找不到mysql相关头文件** :需要在CMakeLists.txt中使用 `include_directories()` 添加MySQL头文件目录
119+
- **找不到mysql动态链接库** :需要在CMakeLists.txt中使用 `link_directories()` 添加MySQL动态链接库目录
120120

121-
以上相关的目录,在自己编译安装时需要留意,如果你找不到目录在什么地方,可以使用`locate`命令去查找。当然,用`apt-get`命令安装就可以避免这些问题了。
121+
以上相关的目录,在自己编译安装时需要留意,如果你找不到目录在什么地方,可以使用 `locate` 命令去查找。当然,用 `apt-get` 命令安装就可以避免这些问题了。
122122

123123
最后,我们运行程序,发现数据已经插入到数据库中,完成!

MySql/MySQL开启日志.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
#### 概 述
1+
## 概 述
22
本文介绍如何设置MySQL从而实现查看对数据库执行的所有SQL语句。
33

4-
#### 实 现
4+
## 实 现
55
**一、临时设置**
66
首先通过 `mysql -u -p` 连接MySQL,设置相关变量
77
```
88
set global general_log = on;
99
set global general_log_file = '/var/log/mysql/mysql.log';
1010
```
11-
- `general_log`: 是否开启log,`on`开启,`off`关闭
12-
- `general_log_file`:log输出路径
11+
- `general_log` : 是否开启log,`on` 开启,`off` 关闭
12+
- `general_log_file` :log输出路径
1313

1414
*注:*log输出路径必须保证存在且MySQL有权限写入。
1515

@@ -21,7 +21,7 @@ show variables like "general_log_file";
2121
此时已经生效了,临时设置不需要重启MySQL
2222

2323
**二、全局设置**
24-
直接修改MySQL的配置文件,本人MySQL版本为5.7.31,配置文件路径为`/etc/mysql/mysql.conf.d/mysqld.cnf`。不同的版本可能路径略有不同。
24+
直接修改MySQL的配置文件,本人MySQL版本为5.7.31,配置文件路径为 `/etc/mysql/mysql.conf.d/mysqld.cnf`。不同的版本可能路径略有不同。
2525
将如下的两行取消注释并配置即可
2626
```
2727
#general_log_file = /var/log/mysql/mysql.log
@@ -37,7 +37,7 @@ show variables like "general_log_file";
3737
# - "~/.my.cnf" to set user-specific options.
3838
#
3939
```
40-
我们可以复制此文件到`/etc/mysql/my.cnf`作为全局配置,也可以复制到`~/.my.cnf`作为用户特定设置。
40+
我们可以复制此文件到 `/etc/mysql/my.cnf` 作为全局配置,也可以复制到 `~/.my.cnf` 作为用户特定设置。
4141
此方式需要重启MySQL
4242
```
4343
service mysql restart

OpenCV/OpenCV学习笔记(一).md

+43-39
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
#### 前言
2-
OpenCV环境的搭建,详见:[Ubuntu安装配置OpenCV](https://www.jianshu.com/p/59608e83becb)
1+
## 前言
2+
OpenCV环境的搭建,详见:[Ubuntu安装配置OpenCV](./Ubuntu%2018.04安装配置OpenCV%204.4.0.md)
33
Windows下配置OpenCV,可以参考:[基于VS2019配置opencv4.0](https://blog.csdn.net/qq_26884501/article/details/90770131)
44

5-
#### 一、基础
6-
首先了解一下OpenCV中的一些基本操作,在OpenCV中图像的基本容器定义为`Mat`对象。
7-
1.`imread()`打开图像,参数为图像的路径
5+
## 一、基础
6+
首先了解一下OpenCV中的一些基本操作,在OpenCV中图像的基本容器定义为 `Mat` 对象。
7+
1.`imread()` 打开图像,参数为图像的路径
88
```
99
Mat srcImage = imread("opencv.jpg");
1010
```
11-
2.`imshow()`显示图像,参数为窗口标题,显示图像的Mat对象
11+
2.`imshow()` 显示图像,参数为窗口标题,显示图像的Mat对象
1212
```
1313
imshow("Display window",srcImage);
1414
```
15-
3.`imwrite()`保存图像,参数为文件名,保存图像的Mat对象
15+
3.`imwrite()` 保存图像,参数为文件名,保存图像的Mat对象
1616
```
1717
imwrite("New_opencv.jpg", srcImage);
1818
```
@@ -23,7 +23,7 @@ Mat Image_1 = imread("opencv.jpg");
2323
Mat Image_2;
2424
Image_2 = Image_1; //当修改Image_2时,Image_1也会被改变
2525
```
26-
所以在OpenCV中,使用`clone()``copyTo()`来复制Mat对象
26+
所以在OpenCV中,使用 `clone()``copyTo()` 来复制Mat对象
2727
```
2828
Mat Image_1 = imread("opencv.jpg");
2929
Mat Image_2;
@@ -32,50 +32,54 @@ Image_2 = Image_1.clone();
3232
//copyTo()
3333
Image_1.copyTo(Image_2);
3434
```
35-
#### 二、颜色空间转换
36-
`cvtColor()`用于将图像从一个颜色空间转换到另一个颜色空间的转换,例如常用的转化为灰度图
35+
## 二、颜色空间转换
36+
`cvtColor()` 用于将图像从一个颜色空间转换到另一个颜色空间的转换,例如常用的转化为灰度图
3737
```
3838
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
3939
```
4040
参数说明:
41-
`srcImage`为输入图像的Mat对象;
42-
`grayImage`为输出图像的Mat对象;
43-
`COLOR_BGR2GRAY`为颜色映射码,即将什么制式的图像转换成什么制式的图像;
41+
`srcImage` 为输入图像的Mat对象;
42+
`grayImage` 为输出图像的Mat对象;
43+
`COLOR_BGR2GRAY` 为颜色映射码,即将什么制式的图像转换成什么制式的图像;
4444
最后还有一个参数为指定目标图像的通道数,默认为0。
45-
此函数支持多种颜色空间之间的转换,其支持的转换类型和转换码有: `COLOR_BGR2RGB``COLOR_RGB2BGR``COLOR_GRAY2BGR`等等,具体可以参考官方文档。
46-
#### 三、getStructuringElement函数
47-
`getStructuringElement()`用于返回指定形状和尺寸的卷积核
45+
此函数支持多种颜色空间之间的转换,其支持的转换类型和转换码有: `COLOR_BGR2RGB``COLOR_RGB2BGR``COLOR_GRAY2BGR` 等等,具体可以参考官方文档。
46+
47+
## 三、getStructuringElement函数
48+
`getStructuringElement()` 用于返回指定形状和尺寸的卷积核
4849
```
4950
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
5051
```
51-
`shape`表示内核的形状,有三种形状:
52+
`shape` 表示内核的形状,有三种形状:
5253
- 矩形:MORPH_RECT; 值为 0
5354
- 交叉形:MORPH_CROSS; 值为 1
5455
- 椭圆形:MORPH_ELLIPSE; 值为 2
5556

56-
`esize`表示内核的尺寸;`anchor`表示锚点的位置,默认值为Point(-1, -1),表示锚点位于中心。
57-
此函数通常在侵蚀和扩张操作之前使用,用于生成其操作的内核。
58-
#### 四、图像侵蚀和膨胀
59-
`erode()`用于图像侵蚀操作;`dilate()`用于图像膨胀操作
57+
`esize` 表示内核的尺寸;`anchor` 表示锚点的位置,默认值为Point(-1, -1),表示锚点位于中心。
58+
此函数通常在侵蚀和扩张操作之前使用,用于生成其操作的内核。
59+
60+
## 四、图像侵蚀和膨胀
61+
`erode()` 用于图像侵蚀操作;`dilate()` 用于图像膨胀操作
6062
```
6163
erode(src, dst, element);
6264
dilate(src, dst, element);
6365
```
64-
`src`为输入图像;`dst`为输出图像;`element`即为上文使用 `getStructuringElement()`生成的操作内核。
65-
当然,`erode()``dilate()`有多种重载,例如操作内核可以不使用`getStructuringElement()`来生成,直接将变量作为函数参数写入等等。具体可以参考官方文档。
66-
#### 五、图像二值化
67-
二值化,即将图像上的像素点的灰度值设置为0或255,可以理解为黑白图。常用的方法为:简单阈值`threshold()`和自适应阈值`adaptiveThreshold()`
66+
`src` 为输入图像;`dst` 为输出图像;`element` 即为上文使用 `getStructuringElement()` 生成的操作内核。
67+
68+
当然,`erode()``dilate()` 有多种重载,例如操作内核可以不使用 `getStructuringElement()` 来生成,直接将变量作为函数参数写入等等。具体可以参考官方文档。
69+
70+
## 五、图像二值化
71+
二值化,即将图像上的像素点的灰度值设置为0或255,可以理解为黑白图。常用的方法为:简单阈值 `threshold()` 和自适应阈值 `adaptiveThreshold()`
6872
注:图像二值化之前,首先需要将图像转化为灰度图。
69-
**简单阈值`threshold()`**
73+
**简单阈值 `threshold()`**
7074
```
7175
threshold(Mat src, Mat dst, int thresh, int maxVal, thresholdType);
7276
```
7377
参数说明:
74-
src:原图像。
75-
dst:结果图像。
76-
thresh:设置的当前阈值。
77-
maxVal:最大阈值,一般为255。
78-
thresholdType:阈值类型,主要有下面几种:
78+
`src` :原图像。
79+
`dst` :结果图像。
80+
`thresh` :设置的当前阈值。
81+
`maxVal` :最大阈值,一般为255。
82+
`thresholdType` :阈值类型,主要有下面几种:
7983
```
8084
THRESH_BINARY //二进制阈值化
8185
THRESH_BINARY_INV //反二进制阈值化
@@ -88,21 +92,21 @@ THRESH_TRIANGLE
8892
```
8993
不同的阈值类型表示不同的阈值计算方法,这里不再赘述。
9094

91-
**自适应阈值`adaptiveThreshold()`**
95+
**自适应阈值 `adaptiveThreshold()`**
9296
```
9397
adaptiveThreshold(Mat src, Mat dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
9498
```
9599
参数说明:
96-
`src`:源图像。
97-
`dst`:输出图像。
98-
`maxVal`:最大阈值,一般为255。
99-
`adaptiveMethod`:表示在一个邻域内计算阈值所采用的算法,分别为 `ADAPTIVE_THRESH_MEAN_C``ADAPTIVE_THRESH_GAUSSIAN_C`
100+
`src` :源图像。
101+
`dst` :输出图像。
102+
`maxVal` :最大阈值,一般为255。
103+
`adaptiveMethod` :表示在一个邻域内计算阈值所采用的算法,分别为 `ADAPTIVE_THRESH_MEAN_C``ADAPTIVE_THRESH_GAUSSIAN_C`
100104
```
101105
ADAPTIVE_THRESH_MEAN_C:表示计算出局部领域块的平均值再减去第七个参数C的值
102106
ADAPTIVE_THRESH_GAUSSIAN_C:表示计算出局部领域块的高斯均值再减去第七个参数C的值
103107
```
104-
`thresholdType`:表示阈值类型,分别为 `THRESH_BINARY``THRESH_BINARY_INV`。(即二进制阈值或反二进制阈值)
105-
`blockSize`:表示计算阈值的像素邻域块的大小,值一般为3、5、7等等。
106-
`C`:即偏移值调整量,可以是负数。
108+
`thresholdType` :表示阈值类型,分别为 `THRESH_BINARY``THRESH_BINARY_INV`。(即二进制阈值或反二进制阈值)
109+
`blockSize` :表示计算阈值的像素邻域块的大小,值一般为3、5、7等等。
110+
`C` :即偏移值调整量,可以是负数。
107111

108112
对于有明显的光暗反差的图像,使用全局阈值(简单阈值)的效果会非常差,推荐根据图像的特征使用自适应阈值进行二值化。

OpenCV/OpenCV学习笔记(三).md

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#### 一、透明背景转白色
1+
## 一、透明背景转白色
22
我们经常会处理一些透明背景的png格式图片,可以使用下面的demo实现将透明背景转白色
33
```
44
cv::Mat alpha2white_opencv2(cv::Mat& src) {
@@ -20,27 +20,27 @@ cv::Mat src = cv::imread("C:\\Users\\PC\\Desktop\\cv\\test.png",-1);
2020

2121
![透明背景转白色](https://upload-images.jianshu.io/upload_images/22192996-eb64afda8017f25b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2222

23-
#### 二、使用grabCut实现图像前景分割
24-
可以使用`grabCut()`来分割出图像前景,函数原型:
23+
## 二、使用grabCut实现图像前景分割
24+
可以使用 `grabCut()` 来分割出图像前景,函数原型:
2525
```
2626
void grabCut( InputArray img, InputOutputArray mask, Rect rect,
2727
InputOutputArray bgdModel, InputOutputArray fgdModel,
2828
int iterCount, int mode = GC_EVAL );
2929
```
3030
参数说明:
31-
`img`:待分割的源图像,必须是8位3通道(CV_8UC3)图像
32-
`mask`:输入输出掩码图像,保存处理后的结果,8位单通道掩码。mask元素值只能为以下四种值:
31+
`img` :待分割的源图像,必须是8位3通道(CV_8UC3)图像
32+
`mask` :输入输出掩码图像,保存处理后的结果,8位单通道掩码。mask元素值只能为以下四种值:
3333
- GCD_BGD(=0),背景;
3434
- GCD_FGD(=1),前景;
3535
- GCD_PR_BGD(=2),可能的背景;
3636
- GCD_PR_FGD(=3),可能的前景。
3737

3838
如果没有手动标记GCD_BGD或者GCD_FGD,那么结果只会有GCD_PR_BGD或GCD_PR_FGD
39-
`rect`:进行分割的图像范围,即只有该矩形范围内的图像部分才会被处理
40-
`bgdModel`:背景模型
41-
`fgdModel`:前景模型
42-
`iterCount`:函数迭代次数
43-
`mode`:用于指示grabCut函数进行什么操作,可选的值有:
39+
`rect` :进行分割的图像范围,即只有该矩形范围内的图像部分才会被处理
40+
`bgdModel` :背景模型
41+
`fgdModel` :前景模型
42+
`iterCount` :函数迭代次数
43+
`mode` :用于指示grabCut函数进行什么操作,可选的值有:
4444
- GC_INIT_WITH_RECT(=0),用矩形窗初始化GrabCut;
4545
- GC_INIT_WITH_MASK(=1),用掩码图像初始化GrabCut;
4646
- GC_EVAL(=2),执行分割。

0 commit comments

Comments
 (0)