-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathskew_angle_dection.txt
141 lines (140 loc) · 8.4 KB
/
skew_angle_dection.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
0.主逻辑函数
0.1主逻辑函数代码段解释
skewDetection(),有800+行,(1)其前半部分,尝试划定一片区域,并将区域内图片缩放到一定大小,对大图使用了双线性插值(或降采样),然后做高斯平滑,再边缘检测
1336行->1705行,声明各种宏定义、变量、判断出是否需要缩放,缩放到多大,对大图双线性插值;
使用的外部函数,主要是CannyEdgeDetection()和imageDownSamplingCXImageAverage_G()
1706行->1715行,做高斯平滑,主要是grayImageGaussSmooth33()
1716行->1722行,做边缘检测,主要是CannyEdgeDetection()
1723行->1767行,无用代码
1768行->1803行,将需要的图片,放大几倍,主要是get_n_times_image()
1804行->1821行,debug代码
1822行->2137行,根据宽高值的大小和其他信息确认的fg_type来执行角度计算,主要是skewAngleDetection_H()
0.2主逻辑函数详解(参数角度)
参数:unsigned char const * const pUCharGrayImage, int const imageWidth,int const imageHeight, double * const pSkewAngle
局部变量:reV 返回的角度值,在一些情况下,会被赋值为1,直接goto到ERROR_OR_OUT,释放申请的内存和return reV;
1.如果图片的宽高中,比较大的,仍小于200(DOWN_SCALE_W_H)
在MERGE_NEW的编译选项下
width ->imageWidth ;fd为0,n_times为1,width_merge和height_merge为图像宽高;boxcanny的四个顶点设置为整张图片;fg_type根据宽度大还是高度大,设置为203或247;
大于200,宽大于高时,若比例大于4:1,height大于200,就设置heigth为固定值200(),width则缩放至相应等比例大小;
height小于200,则设置height和width为原图的值;
若比例小于4:1时,height大于200,就设置height为固定值200,width则缩放至相应等比例大小;
height小于200,则设置height和width为原图的值,若比例小;
高大于宽时,若比例大于3.3:1时,width大于200,就设置width为固定值200,height则缩放至相应等比例大小;
width小于200,则设置height和width为原图的值;
若比例小于3.3:1时,width大于200,就设置width为固定值200,height则缩放至相应等比例大小;
width小于200,则设置height和width为原图的值;
height ->imageHeight
width_merge ->imageWidth
height_merge ->imageHeight
n_times ->1
fg_type ->203(宽大)或247(高大)
fg_d ->0
boxCanny ->图片范围
pUChar_t ->pUCharGrayImage
在无MERGE_NEW编译选项下
则无width_merge/height_merge/ntimes
2.图片宽高任一个或全部大于200(DOWN_SCALE_W_H)
2.1宽大于高
2.1.1比例大于4:1
2.1.1.1 较小的height大于200
width ->200*(imageWidth/imageHeight)
height ->200
width_merge ->width
height_merge ->height*N_TIMES_A(即2)
ntimes ->N_TIMES_A(即2)
fg_type ->10
fd_d ->1
2.1.1.2 较小的height小于200
width ->imageWidth
height ->imageHeight
width_merge ->width
height_merge ->height*N_TIMES_A(即2)
ntimes ->N_TIMES_A(即2)
fg_type ->11
fd_d ->0
pUchar_t ->pUCharGrayImage
2.1.2.1 width_merge大于MAX_IMAGE_ROI_W_H(即560)
boxCanny ->截取width_merge正中的一段(即缩放后图片的正中一段):left为(width_merge-560)/2 right为width_merge+560
top为0,bottom为height-1
it ->为计算width_merge的临时变量
2.1.2.2 width_merge小于MAX_IMAGE_ROI_W_H(即560)
boxCanny ->width_merge和heigth_merge确定的范围(即缩放后图片的全部区域)
2.1.2比例小于4:1
2.1.1.1 较小的height大于200
width ->200*(imageWidth/imageHeight)
height ->200
width_merge ->width
height_merge ->height*N_TIMES_A(即2)
ntimes ->N_TIMES_A
fg_type ->12
fd_d ->1
2.1.1.2 较小的height小于200
width ->imageWidth
height ->imageHeight
width_merge ->width
height_merge ->height*N_TIMES_A(即2)
ntimes ->N_TIMES_A
fg_type ->13
fd_d ->0
pUchar_t ->pUCharGrayImage
boxCanny ->截取width_merge正中的一段(即缩放后图片的正中一段):left为(width_merge-height_merge)/2 right为width_merge+height_merge
top为0,bottom为height-1
it ->为计算width_merge的临时变量
2.2高大于宽
2.1.1比例大于1:3.3
2.1.1比例小于1:3.3
2.3 对fd不为0,即需要缩放的图片,执行双线性插值(或降采样,根据现有编译选项是在用双线性插值)
boxDown的四个点,为图片的的全范围
缩放参数,由width和height来确定
输出到pUCharDown
pUchar_t ->pUCharDown
pUCharGauss 高斯
pUCharCanny
pUCharCanny_merged
pUChar_t
skewAngle
skewAngle_abs
int_v
width_t
height_t
1.bilinearSamplingGrayFST()双线性插值函数
1.0 与只类似的函数还有:
bilinearSamplingRGBFST(),对彩图的处理函数,对比内部逻辑,会发现除了一个像素分配三个char来存储外,是一致的;
bilinearSamplingGrayFST(),因编译选项而不被编译的函数,和主要使用的函数同名,查看内容,发现也极其类似,应是改进后废弃的代码;
1.1 从函数的行上概述
194行->256行 声明各种变量,并检查传入的参数
257行->290行 申请内存,用来存储需要计算的起始位置、步长和需要计算位置的map、输出的图片所占的内存;
291行->396行 根据map中记录的步长和map,计算双线性插值;
1.2 从局部变量的角度来看
参数:
unsigned char const * const pUCharGray, int const imageWidth, int const imageHeight, ROI const * const pROI_t, int const outImageWidth, int const outImageHeight, unsigned char * * const ppUChargrayOut
局部变量:
pUCharGray_b ->
pUCharGray_t -> 灰度图的临时变量,为了给pLine_t的unsinged char*数组赋值为各行的行首的内存地址;
pUCharGray_s ->
pUChargrayOut -> 输出图片的内存地址,分配内存时,存指针的地址;
pUChargrayOut_t ->
trackWidth -> 选定要缩放区域的宽度
trackHeight -> 选定要缩放区域的高度
xStep -> 要缩放区域的宽度/输出图片宽度,得出的双线性插值在x轴上的步长
yStep -> 要缩放区域的宽度/输出图片宽度,得出的双线性插值在x轴上的步长
xStep_t -> 步长移动后,得到临时变量,起始点(0.0f - xStep/2.0f) - 0.5f,每次移动xStep步长,来pxMap和pxPos
yStep_t -> (pROI_t->top) + (0.0f - yStep/2.0f) - 0.5f
pxMap -> 一段长度为(输出宽度×2)长的int指针
pxMap_t -> 作为pxMap的临时变量
pxPOS -> pxMap的最后一个位置
pxPOS_t -> pxPos的临时变量
int i -> 遍历原图每一行,用的临时变量
int j ->
pLinep -> unsigned char*数组,数组长度为输入图片的height,的确是存储line指针用的;
pLinep_t ->
fdx ->
fdy ->
int_dx ->
int_dy ->
imageWidth_1 ->
imageHeight_1 ->
i_x_0 ->
i_x_1 ->
int_temp ->
int_x_base -> 要缩放区域的x轴的左起始位置