Trevan
管理员
管理员
  • 最后登录2017-10-24
  • 发帖数1008
  • 金币19089枚
  • 贡献勋章5枚
阅读:5537回复:17

Halcon 1D测量(1) :测量边缘对

楼主#
更多 发布于:2014-06-25 17:45
首先先说明一下Hdevelop图形显示界面的坐标:基本上和其他环境中图像的坐标一样,左上角为(0,0),X轴为横轴,Y轴为纵轴,行Row指的是Y轴坐标,列Column指的是X轴坐标


关于gen_measure_rectangle2
它是获得一个测量句柄
Row, Column是矩形的中心

Length1, Length2是矩形区域的长和宽的一半,关于区域的宽度,尽量在包住边缘的同时设置的越大越好,因为设置的太小噪声太大
Phi是Rectangle旋转的角度,当为正时表示逆时针旋转,当为负时表示顺时针旋转
如果想看ROI是否合适可以利用gen_rectangle1查看

Interpolation表示插值的方法,因为当ROI不是垂直或者水平的话,那么他的Projection(下图中短的等距线)经过的就不是一个完整的像素,因为要计算它的平均值给Profile。它的值就需要插值,详细见solution_guide_iii_a_1d_measuring  A-12

图片:1.jpg



图片:2.jpg



关于measure_pairs
measure_pairs适用于有许多组边缘的图像,如果是一组边缘,也可以用measure_pos,下面的第一个例子就可以。使用他们时边缘要是一条直线,结果中包含了许多信息,每一个边缘RowEdge表示的是边缘的行坐标,ColumnEdge表示的是列坐标,Amplitude表示的是根据Transition边缘的梯度,IntraDistance表示的是一个边缘组之间的距离,InterDistance表示的是边缘组之间的距离,这两个距离可以计算物体的高度和计算物体的个数
Transition = ‘negative’时表示由像素值高转到低像素值的边缘放在RowEdgeFirst中,这里有一个参考方向,就是Rectangle旋转角度为0时,从左到右的方向
Sigma表示高斯滤波的参数,高斯滤波的是对Profile形成的曲线,Threshold是对他的一阶导数设置的阈值(下图粗线是Profile line经过的像素,细线是他的一阶导数,可以看出它大概有三组边缘)
如果要可视化边缘,需要利用RowEdge,Column,Phi自己确定边缘的开始点与结束点

图片:3.jpg



注意,由于没有对摄像机进行标定,1D测量只能获得物体的像素的个数




[cpp] view plaincopyprint?
  1. *测量手机电池的高度有多少个像素  
  2.  
  3. *  
  4. *读取图像  
  5. *  
  6. read_image (Image1, 'D:/picture/20130930153459.jpg')  
  7. get_image_size (Image1, Width, Height)  
  8.  
  9. dev_close_window()  
  10. dev_open_window (0, 0, Width, Height, 'black', WindowHandle)  
  11. *设置所画的区域是一个面还是轮廓  
  12. dev_set_draw ('margin')  
  13. *设置画的颜色  
  14. dev_set_color ('black')  
  15. *因为我使用的彩色RGB图像,先使他变成灰度图像  
  16. decompose3 (Image1, red, green, blue)  
  17. rgb3_to_gray (red, green, blue, ImageGray)  
  18. dev_display(ImageGray)  
  19.  
  20. *  
  21. *设置ROI  
  22. *  
  23. *注意row和column是矩形的中心  
  24. row := 238  
  25. column := 300  
  26. *这个是矩形旋转的角度,角度是正的按逆时针转,负的按顺时针转  
  27. angle := rad(90)  
  28. *在length1<length2的情况下,measure——pairs没有值,不管怎样调整参数???  
  29. *length1和length2是矩形的两个半轴的长,明白了这个下面在计算多边形轮廓的时候要用到  
  30. length1 := 200  
  31. length2 := 10  
  32. *注意这里的矩形框的参数是自己调整的  
  33. gen_rectangle2 (Rectangle, row, column, angle, length1, length2)  
  34. *这里的测量矩形框也就是上面显示的部分  
  35. gen_measure_rectangle2 (row, column, angle, length1, length2, Width, Height, 'nearest_neighbor', MeasureHandle)  
  36.  
  37. disp_continue_message (WindowHandle, 'black', 'true')  
  38.  
  39. stop()  
  40.  
  41.  
  42. *注意这个算子可以计算许多组边缘,然后将获得的边缘组放在RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond中  
  43. *根据Thansition的不同值,所获得的边缘组的先后顺序不同,例如为'negative'意思是将‘从白至黑’的边缘 中心点 的坐标放在RowEdgeFirst,注意这里的参考方向,是角度为0时,是从左往右方向  
  44. *ColumnEdgeFirst中,‘从黑到白’放在RowEdgeSecond, ColumnEdgeSecond中  
  45. measure_pairs (Image1, MeasureHandle, 0.9, 30, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)  
  46.  
  47. disp_continue_message (WindowHandle, 'black', 'true')  
  48.  
  49. stop()  
  50.  
  51. *  
  52. *可视化结果  
  53. *  
  54. *根据分组的个数,来画线,这个个数就是RowEdgeFirst组的个数,也就是边缘的个数  
  55. for i := 0 to |RowEdgeFirst|-1 by 1      
  56.    *这个算子是画出多边形的亚像素轮廓,其中第二个和第三个参数可以是元素,即表示有多个点,两个点组成一条直线  
  57.    *至于每一个点是怎么计算的,我们已经知道了旋转的角度和每一条边的中心点,这个大家自己就可以在纸上用三角函数得出来每一个开始结束点  
  58.    *的坐标了  
  59.    gen_contour_polygon_xld (EdgeFirst, [RowEdgeFirst - sin(rad(90) - angle)*length2,RowEdgeFirst + sin(rad(90) - angle)*length2], [ColumnEdgeFirst - cos(rad(90) - angle)*length2,ColumnEdgeFirst + cos(rad(90) - angle)*length2])  
  60.    gen_contour_polygon_xld (EdgeSecond, [RowEdgeSecond - sin(rad(90) - angle)*length2,RowEdgeSecond + sin(rad(90) - angle)*length2], [ColumnEdgeFirst - cos(rad(90) - angle)*length2,ColumnEdgeFirst + cos(rad(90) - angle)*length2])  
  61.    dev_set_color ('cyan')  
  62.    dev_display (EdgeFirst)  
  63.    dev_set_color ('red')  
  64.    dev_display (EdgeSecond)  
  65.    dev_set_color ('blue')  
  66.    *这是设置文本在那里显示  
  67.    if (i = 0)  
  68.        set_tposition (WindowHandle, RowEdgeFirst + 5, ColumnEdgeFirst+20)  
  69.    else  
  70.        set_tposition (WindowHandle, RowEdgeFirst - 40, ColumnEdgeFirst+20)  
  71.    endif  
  72.    *从文本显示的地方写入字符串,写出像素  
  73.    write_string (WindowHandle, 'width: '+IntraDistance+' pix')  
  74. endfor  
  75. disp_continue_message (WindowHandle, 'black', 'true')  
  76. stop ()  
  77. *  
  78. * 销毁  
  79. *  
  80. close_measure (MeasureHandle)  
  81. dev_update_window ('on')  
  82. dev_clear_window ()  

*测量手机电池的高度有多少个像素

*
*读取图像
*
read_image (Image1, 'D:/picture/20130930153459.jpg')
get_image_size (Image1, Width, Height)

dev_close_window()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*设置所画的区域是一个面还是轮廓
dev_set_draw ('margin')
*设置画的颜色
dev_set_color ('black')
*因为我使用的彩色RGB图像,先使他变成灰度图像
decompose3 (Image1, red, green, blue)
rgb3_to_gray (red, green, blue, ImageGray)
dev_display(ImageGray)

*
*设置ROI
*
*注意row和column是矩形的中心
row := 238
column := 300
*这个是矩形旋转的角度,角度是正的按逆时针转,负的按顺时针转
angle := rad(90)
*在length1<length2的情况下,measure——pairs没有值,不管怎样调整参数???
*length1和length2是矩形的两个半轴的长,明白了这个下面在计算多边形轮廓的时候要用到
length1 := 200
length2 := 10
*注意这里的矩形框的参数是自己调整的
gen_rectangle2 (Rectangle, row, column, angle, length1, length2)
*这里的测量矩形框也就是上面显示的部分
gen_measure_rectangle2 (row, column, angle, length1, length2, Width, Height, 'nearest_neighbor', MeasureHandle)

disp_continue_message (WindowHandle, 'black', 'true')

stop()


*注意这个算子可以计算许多组边缘,然后将获得的边缘组放在RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond中
*根据Thansition的不同值,所获得的边缘组的先后顺序不同,例如为'negative'意思是将‘从白至黑’的边缘 中心点 的坐标放在RowEdgeFirst,注意这里的参考方向,是角度为0时,是从左往右方向
*ColumnEdgeFirst中,‘从黑到白’放在RowEdgeSecond, ColumnEdgeSecond中
measure_pairs (Image1, MeasureHandle, 0.9, 30, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

disp_continue_message (WindowHandle, 'black', 'true')

stop()

*
*可视化结果
*
*根据分组的个数,来画线,这个个数就是RowEdgeFirst组的个数,也就是边缘的个数
for i := 0 to |RowEdgeFirst|-1 by 1    
    *这个算子是画出多边形的亚像素轮廓,其中第二个和第三个参数可以是元素,即表示有多个点,两个点组成一条直线
    *至于每一个点是怎么计算的,我们已经知道了旋转的角度和每一条边的中心点,这个大家自己就可以在纸上用三角函数得出来每一个开始结束点
    *的坐标了
    gen_contour_polygon_xld (EdgeFirst, [RowEdgeFirst - sin(rad(90) - angle)*length2,RowEdgeFirst + sin(rad(90) - angle)*length2], [ColumnEdgeFirst - cos(rad(90) - angle)*length2,ColumnEdgeFirst + cos(rad(90) - angle)*length2])
    gen_contour_polygon_xld (EdgeSecond, [RowEdgeSecond - sin(rad(90) - angle)*length2,RowEdgeSecond + sin(rad(90) - angle)*length2], [ColumnEdgeFirst - cos(rad(90) - angle)*length2,ColumnEdgeFirst + cos(rad(90) - angle)*length2])
    dev_set_color ('cyan')
    dev_display (EdgeFirst)
    dev_set_color ('red')
    dev_display (EdgeSecond)
    dev_set_color ('blue')
    *这是设置文本在那里显示
    if (i = 0)
        set_tposition (WindowHandle, RowEdgeFirst + 5, ColumnEdgeFirst+20)
    else
        set_tposition (WindowHandle, RowEdgeFirst - 40, ColumnEdgeFirst+20)
    endif
    *从文本显示的地方写入字符串,写出像素
    write_string (WindowHandle, 'width: '+IntraDistance+' pix')
endfor
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
* 销毁
*
close_measure (MeasureHandle)
dev_update_window ('on')
dev_clear_window ()





最后结果如下图:

图片:4.jpg






[cpp] view plaincopyprint?
  1. *测量刻度尺  
  2.  
  3. dev_close_window()  
  4.  
  5. read_image (Image, 'D:/picture/20131001152907.jpeg')  
  6. decompose3 (Image, Red, Green, Blue)  
  7. rgb3_to_gray (Red, Green, Blue, ImageGray)  
  8. get_image_size (Image, Width, Height)  
  9.  
  10.  
  11. dev_close_window()  
  12. dev_open_window (0, 0, Width, Height, 'black', WindowHandle)  
  13. dev_set_draw ('margin')  
  14. dev_display (ImageGray)  
  15.  
  16. Row := 169  
  17. Column := 636  
  18. *这里为什么要旋转-90度,自己想想去  
  19. Phi := rad(-90)  
  20. Length1 := 105  
  21. Length2 := 3  
  22.  
  23.  
  24. gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)  
  25. gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'bicubic', MeasureHandle)  
  26.  
  27. Sigma := 1.0  
  28. Threshold := 10  
  29. *旋转了-90度,表示顺时针旋转了90度,也就是表示从上至下,从像素值高到像素值低的放在RowEdgeFirst中  
  30. Transition := 'negative'  
  31. Select := 'all'  
  32. measure_pairs (ImageGray, MeasureHandle, 1, 30, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)  
  33.  
  34. disp_line (WindowHandle, RowEdgeFirst , ColumnEdgeFirst- Length2, RowEdgeFirst, ColumnEdgeSecond + Length2)  
  35.  
  36. avgLeadWidth := sum(IntraDistance)/|IntraDistance|  
  37. avgLeadDistance := sum(InterDistance)/|InterDistance|  
  38. numLeads := |IntraDistance|  
  39.  
  40. disp_message (WindowHandle, '刻度个数: '+numLeads, 'window', 100, 200, 'black', 'false')  
  41. disp_message (WindowHandle, '平均宽度:  '+avgLeadWidth$'.2f', 'window',130, 200, 'black', 'false')
  42. disp_message (WindowHandle, '平均距离:  '+avgLeadDistance$'.2f', 'window',160, 200, 'black', 'false')
  43. stop()  
  44.  
  45. *将之部分放大,首先定义一个区域  
  46. Row1 := 100  
  47. Column1 := 580  
  48. Row2 := 200  
  49. Column2 := 680  
  50. dev_set_color ('blue')  
  51. disp_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)  
  52. disp_continue_message (WindowHandle, 'black', 'true')  
  53. stop()  
  54.  
  55. *将这个区域放大,然后显示  
  56. dev_set_part (Row1, Column1, Row2, Column2)  
  57. dev_display (Image)  
  58. dev_set_color ('black')  
  59. dev_display (Rectangle)  
  60. *画出每一个边缘  
  61. NumRows := |RowEdgeFirst|  
  62. NumCols := |ColumnEdgeFirst|  
  63. Num := min([NumRows, NumCols])  
  64.  
  65. for i:= 0 to Num - 1 by 1  
  66.    *先得到每一条边缘的中心点  
  67.    RowCoorFirst := RowEdgeFirst  
  68.    ColCoorFirst := ColumnEdgeFirst  
  69.      
  70.    RowCoorSecond := RowEdgeSecond  
  71.    ColCoorSecond := ColumnEdgeSecond  
  72.    *得到边缘的开始点与结束点  
  73.    RowStartFirst := RowCoorFirst - sin(rad(90) - Phi)*Length2  
  74.    RowEndFirst := RowCoorFirst + sin(rad(90) - Phi)*Length2  
  75.    ColStartFirst := ColCoorFirst - cos(rad(90) - Phi)*Length2  
  76.    ColEndFirst := ColCoorFirst + cos(rad(90) - Phi)*Length2  
  77.      
  78.    RowStartSecond := RowCoorSecond - sin(rad(90) - Phi)*Length2  
  79.    RowEndSecond := RowCoorSecond + sin(rad(90) - Phi)*Length2  
  80.    ColStartSecond := ColCoorSecond - cos(rad(90) - Phi)*Length2  
  81.    ColEndSecond := ColCoorSecond + cos(rad(90) - Phi)*Length2  
  82.    *画出边缘线  
  83.    gen_contour_polygon_xld(EdgeFirst,[RowStartFirst,RowEndFirst],[ColStartFirst,ColEndFirst])  
  84.    gen_contour_polygon_xld(EdgeSecond,[RowStartSecond,RowEndSecond],[ColStartSecond,ColEndSecond])  
  85.    dev_set_color ('red')  
  86.    dev_set_line_width (2)  
  87.    dev_display (EdgeFirst)  
  88. endfor  
  89. close_measure (MeasureHandle)  
  90. *重置参数  
  91. dev_set_part (0, 0, Height-1, Width-1)  
  92. dev_set_draw ('fill')  
  93. dev_set_line_width (1)  

*测量刻度尺

dev_close_window()

read_image (Image, 'D:/picture/20131001152907.jpeg')
decompose3 (Image, Red, Green, Blue)
rgb3_to_gray (Red, Green, Blue, ImageGray)
get_image_size (Image, Width, Height)


dev_close_window()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_draw ('margin')
dev_display (ImageGray)

Row := 169
Column := 636
*这里为什么要旋转-90度,自己想想去
Phi := rad(-90)
Length1 := 105
Length2 := 3


gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'bicubic', MeasureHandle)

Sigma := 1.0
Threshold := 10
*旋转了-90度,表示顺时针旋转了90度,也就是表示从上至下,从像素值高到像素值低的放在RowEdgeFirst中
Transition := 'negative'
Select := 'all'
measure_pairs (ImageGray, MeasureHandle, 1, 30, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

disp_line (WindowHandle, RowEdgeFirst , ColumnEdgeFirst- Length2, RowEdgeFirst, ColumnEdgeSecond + Length2)

avgLeadWidth := sum(IntraDistance)/|IntraDistance|
avgLeadDistance := sum(InterDistance)/|InterDistance|
numLeads := |IntraDistance|

disp_message (WindowHandle, '刻度个数: '+numLeads, 'window', 100, 200, 'black', 'false')
disp_message (WindowHandle, '平均宽度:  '+avgLeadWidth$'.2f', 'window',130, 200, 'black', 'false')
disp_message (WindowHandle, '平均距离:  '+avgLeadDistance$'.2f', 'window',160, 200, 'black', 'false')
stop()

*将之部分放大,首先定义一个区域
Row1 := 100
Column1 := 580
Row2 := 200
Column2 := 680
dev_set_color ('blue')
disp_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
disp_continue_message (WindowHandle, 'black', 'true')
stop()

*将这个区域放大,然后显示
dev_set_part (Row1, Column1, Row2, Column2)
dev_display (Image)
dev_set_color ('black')
dev_display (Rectangle)
*画出每一个边缘
NumRows := |RowEdgeFirst|
NumCols := |ColumnEdgeFirst|
Num := min([NumRows, NumCols])

for i:= 0 to Num - 1 by 1
    *先得到每一条边缘的中心点
    RowCoorFirst := RowEdgeFirst
    ColCoorFirst := ColumnEdgeFirst
    
    RowCoorSecond := RowEdgeSecond
    ColCoorSecond := ColumnEdgeSecond
    *得到边缘的开始点与结束点
    RowStartFirst := RowCoorFirst - sin(rad(90) - Phi)*Length2
    RowEndFirst := RowCoorFirst + sin(rad(90) - Phi)*Length2
    ColStartFirst := ColCoorFirst - cos(rad(90) - Phi)*Length2
    ColEndFirst := ColCoorFirst + cos(rad(90) - Phi)*Length2
    
    RowStartSecond := RowCoorSecond - sin(rad(90) - Phi)*Length2
    RowEndSecond := RowCoorSecond + sin(rad(90) - Phi)*Length2
    ColStartSecond := ColCoorSecond - cos(rad(90) - Phi)*Length2
    ColEndSecond := ColCoorSecond + cos(rad(90) - Phi)*Length2
    *画出边缘线
    gen_contour_polygon_xld(EdgeFirst,[RowStartFirst,RowEndFirst],[ColStartFirst,ColEndFirst])
    gen_contour_polygon_xld(EdgeSecond,[RowStartSecond,RowEndSecond],[ColStartSecond,ColEndSecond])
    dev_set_color ('red')
    dev_set_line_width (2)
    dev_display (EdgeFirst)
endfor
close_measure (MeasureHandle)
*重置参数
dev_set_part (0, 0, Height-1, Width-1)
dev_set_draw ('fill')
dev_set_line_width (1)



结果如下所示:


图片:5.jpg




图片:6.jpg



http://blog.csdn.net/fred_yang2013/article/details/12205925
捐助网站请点击 http://www.ihalcon.com/read-6416.html
tzw142
助理工程师
助理工程师
  • 最后登录2017-08-21
  • 发帖数108
  • 金币421枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
沙发#
发布于:2014-06-25 21:10
版主讲解的很详细受益不浅呀
x8515618
工程师
工程师
  • 最后登录2017-08-29
  • 发帖数93
  • 金币769枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
板凳#
发布于:2014-06-25 22:47
楼主讲的很仔细,学习了不少细节性的东西,谢谢
543249117
高级工程师
高级工程师
  • 最后登录2017-06-22
  • 发帖数5
  • 金币1695枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
地板#
发布于:2014-06-26 09:24
比书上的教程好多了,回家里试试
Maryann
助理工程师
助理工程师
  • 最后登录2016-08-05
  • 发帖数40
  • 金币386枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
4楼#
发布于:2014-07-02 19:26
高大上啊,拜读啦,
mcs4304
技术员
技术员
  • 最后登录2014-12-16
  • 发帖数13
  • 金币112枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
5楼#
发布于:2014-08-26 15:32
我是新手,这段时间在看1d measure,但是很多的东西不知道有什么区别,大神还是多发点这样的帖子吧
wangqm
助理工程师
助理工程师
  • 最后登录2014-12-31
  • 发帖数38
  • 金币214枚
  • 贡献勋章0枚
6楼#
发布于:2014-09-02 10:25
咋弄得这么详细呢,太有奉献精神了
liushusu
助理工程师
助理工程师
  • 最后登录2016-09-06
  • 发帖数55
  • 金币463枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
7楼#
发布于:2014-10-11 12:59
正碰上这个算子,要学习,讲的好详细,感谢!
qingzhuye
工程师
工程师
  • 最后登录2017-09-23
  • 发帖数120
  • 金币720枚
  • 贡献勋章0枚
  • 社区居民
8楼#
发布于:2014-10-30 21:20
楼主解释的这么详细,太有奉献精神了
worrycyy
初学者
初学者
  • 最后登录2016-02-25
  • 发帖数4
  • 金币37枚
  • 贡献勋章0枚
9楼#
发布于:2015-01-01 20:02
大神就是大神  不光技术牛 精神也好
longxian
初学者
初学者
  • 最后登录2015-05-12
  • 发帖数13
  • 金币60枚
  • 贡献勋章0枚
  • 社区居民
10楼#
发布于:2015-03-30 17:00
讲解很详细,新手学习一下
lyw362
技术员
技术员
  • 最后登录2017-03-27
  • 发帖数29
  • 金币148枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
11楼#
发布于:2015-05-27 15:51
学习了 很有用 。多发些这种帖子
halcon520
专家
专家
  • 最后登录2017-10-21
  • 发帖数266
  • 金币5204枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
12楼#
发布于:2015-05-29 16:24
理论与实际结合,讲解的非常好
Nathan_Tour
助理工程师
助理工程师
  • 最后登录2017-10-23
  • 发帖数100
  • 金币408枚
  • 贡献勋章0枚
  • 社区居民
13楼#
发布于:2015-06-02 17:32
楼主讲的真详细,太感谢了,要是能贴上例子的原图就更好了
学而不思则罔,思而不学则殆,不学不思则狗带!!!
bssdtn
初学者
初学者
  • 最后登录2016-09-07
  • 发帖数12
  • 金币93枚
  • 贡献勋章0枚
  • 社区居民
14楼#
发布于:2015-08-18 17:38
谢谢分享,学习中!!!!
上一页
游客

返回顶部