分享一篇以前学习机器视觉的一篇报告
主要是HDevelop的,里面有很多识别物体的方法和图像处理的介绍。有兴趣可以看看
一:指导老师给我们介绍了深圳市元创新科技有限公司的企业文化与企业环境,简要地介绍了本行业的发展历史及未来发展趋势。讲解了机器视觉的功能与应用。指导我们学习HDevelop的安装使用方法。并且带着我们对全新的HDevelop语言的基础知识进行了讲解。通过一些实例操作介绍了HDevelop机器视觉常用的编程指令,学习程序编译与运行。
二:学会HDevelop下的代码编辑器的使用方法;学习了如何导入图片并在窗口显示出来、如何利用数组在图片上显示几行文字,如何使用判断语句,如何编辑图片的大小使其尺寸一样,还学习了循环语句的使用,完成了老师布置的作业。
三:开始学习对图片的处理,用相关语句对两张图片进行合成,还有如何打开电脑的摄像头进行拍摄图片,下午的时候老师开始教如何用灰度直方图的阈值对图片进行处理,在对连通域分割提取,得到自己想要的那部分并把它用十字架标注出来,后面还学习了用特征直方图中的多个特征对字符进行提取和形态学与缺陷检测,老师布置了对车牌字符检测的作业。
四:指导老师因为疫情去隔离了,在线上教学,我们主要学习了如何对彩色对象进行识别并在其上面显示对应的颜色,下午学习了利用已经存在的机器学习模型识别字符并在其上面显示出相应的结果,老师布置了相应的作业。
五:上午指导老师教授了我们模板匹配的两种方法:归一化相关匹配和形状模板匹配,在准备下课时布置了我们最后的任务,我们组别选择了矿泉水瓶盖识别,并在下午完成了。
第一阶段:指导老师给我们介绍了深圳市元创新科技有限公司的企业文化与企业环境,简要地介绍了本行业的发展历史及未来发展趋势。讲解了机器视觉的功能与应用。指导我们学习HDevelop的安装使用方法。并且带着我们对全新的HDevelop语言的基础知识进行了讲解。通过一些实例操作介绍了HDevelop机器视觉常用的编程指令,学习程序编译与运行。
第二阶段:学会HDevelop下的代码编辑器的使用方法;学习了如何导入图片并在窗口显示出来、如何利用数组在图片上显示几行文字,如何使用判断语句,如何编辑图片的大小使其尺寸一样,还学习了循环语句的使用,完成了老师布置的作业。
第三阶段:开始学习对图片的处理,用相关语句对两张图片进行合成,还有如何打开电脑的摄像头进行拍摄图片,下午的时候老师开始教如何用灰度直方图的阈值对图片进行处理,在对连通域分割提取,得到自己想要的那部分并把它用十字架标注出来,后面还学习了用特征直方图中的多个特征对字符进行提取和形态学与缺陷检测,老师布置了对车牌字符检测的作业。
第四阶段:指导老师因为疫情去隔离了,在线上教学,我们主要学习了如何对彩色对象进行识别并在其上面显示对应的颜色,下午学习了利用已经存在的机器学习模型识别字符并在其上面显示出相应的结果,老师布置了相应的作业。
第五阶段:上午指导老师教授了我们模板匹配的两种方法:归一化相关匹配和形状模板匹配,在准备下课时布置了我们最后的任务,我们组别选择了矿泉水瓶盖识别,并在下午完成了。
第五阶段是最终任务的验收答辩环节,具体在下面部分结果里说明。
学习了如何导入图片并在窗口显示出来、如何利用数组在图片上显示几行文字,如何使用判断语句,如何编辑图片的大小使其尺寸一样;开始学习对图片的处理,用相关语句对两张图片进行合成,还有如何打开电脑的摄像头进行拍摄图片,下午的时候老师开始教如何用灰度直方图的阈值对图片进行处理,在对连通域分割提取,得到自己想要的那部分并把它用十字架标注出来,后面还学习了用特征直方图中的多个特征对字符进行提取和形态学与缺陷检测;了利用已经存在的机器学习模型识别字符并在其上面显示出相应的结果;
(1)杂物识别结果
图1.2 杂物识别结果
(2)图片显示文字
图2 图片显示文字
图3 图片合成
(4)提取想要的那部分并把它用十字架标注出来
图4 十字架标注
(5)字符进行提取
图5 字符进行提取
图6 识别显示对应的颜色
四、实习总结及体会
在本次的专业实习中,让我对c语言进行了一次查漏补缺,巩固了C语言基础。了解ARM 开发的文件读取方式、交叉编译环境。掌握了VM虚拟机的使用以及了解Ubuntu环境的搭建及功能使用。学习了Linux的基本指令、共享设置、代码的编写编译及运行。加强了C语言编程能力,更加熟练掌握VM虚拟机和Ubuntu环境的功能使用;掌握了交叉编译方式,加强了对嵌入式产品的认知。通过老师同学的帮助学会了封装显示图片,实现触摸屏数据获取和手势数据获取等功能。还有通过此次实习,加强了动手思考能力开拓了视野,增长了见识。发现了自己对于软硬件操作以及与组员间的交流沟通能力还有待提高,明白团队协作的重要性,学会换位思考。
*1.杂物识别,矿泉水瓶盖识别
dev_update_window ('off')
* Image Acquisition 02: Code generated by Image Acquisition 02
read_image (Image, 'C:/Users/CTOS.CTOS-PC/Desktop/hhh/lcj/1.all images/4.杂物组图/杂物01.png')
dev_display (Image)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_get_window (WindowHandle)
draw_circle (WindowHandle, Row, Column, Radius)
gen_circle (Circle1, Row, Column, Radius)
reduce_domain (Image, Circle1, ImageReduced)
rgb1_to_gray (ImageReduced, ImageReduced)
stop ()
create_ncc_model (ImageReduced, 5,-3.14,6.28,'auto', 'use_polarity', ModelID)
* Image Acquisition 02: Code generated by Image Acquisition 02
list_files ('C:/Users/CTOS.CTOS-PC/Desktop/hhh/lcj/1.all images/4.杂物组图', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index1 := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index1])
* Image Acquisition 02: Do something
rgb1_to_gray (Image, GrayImage)
dev_display (GrayImage)
find_ncc_model (GrayImage, ModelID,\
-3.14, 6.28, 0.66, 10, 0.5, \
'true', 6, Row1, Column1, Angle, Score)
if (|Score|!=0)
for Index := 0 to |Score|-1 by 1
dev_set_color ('red')
disp_cross (WindowHandle, Row1[Index], Column1[Index], 40, Angle[Index])
dev_set_color ('green')
disp_circle (WindowHandle, Row1[Index], Column1[Index], 200)
endfor
endif
disp_message (WindowHandle,'数量:'+Index, 'image', 100, 100, 'red', 'true')
stop ()
endfor
clear_ncc_model (ModelID)
程序2
dev get window (windowfandle)
set_display_font (windowHandle,8o,'澈体','true', ‘false’)
for Index := 1 to 900e by 1
if(Index==900e)
break
endif
str:='功德+"+Index
set_system ( 'flush graphic' , 'false")
dev_clear_window()
set_system ('flush_graphic" ,'true")
read_image (Image, ./66/6')
disp_message(windowHandle,str , "window' , 30,30, 'blue",wait_seconds (0.2)
endfor
程序3
read_image(image, "./66/3'read_image( image1, "./66/4)read image (image2, "./66/5)
zoom_image_size(Image1,Imagezoom,1036,647, "constant")zoom_image_size(Image2,ImageZoom1,1036,647,"constant')" compose3(Image,ImageZoom, Image,HultiChannelmage)
compose3(Image, Imagezoom, ImageZooml,MultiChanneilmage)
程序4
rgb1_to_gray (Image, GrayImage)
*阈值分割
*找到灰度直方图的山和谷
threshold (GrayImage, Regions, 56, 111)
*腐蚀
erosion_circle (Region3, RegionErosion2, 20)
*分割
connection (RegionErosion2, ConnectedRegions)
*膨胀
dilation_circle (ConnectedRegions, RegionDilation,20)
*可视化
dev_clear_window ()
dev_display (Image)
dev_set_draw ('margin')
dev_set_line_width (2)
dev_display (RegionDilation)
dev_get_window (WindowHandle)
*stop ()
*统计图形数组元素数量
count_obj (RegionDilation,Number)
dev_clear_window ()
dev_display (Image)
dev_display (RegionDilation)
*disp_message (WindowHandle,'数量:'+ Number, 'image', 10, 10, 'black', 'false')
*显示文本在窗口上
disp_message (WindowHandle, '', 'window', 20, 300, 'red', 'false')
*stop ()
*定位中心
area_center (RegionDilation, Area, Row, Column)
dev_clear_window ()
dev_display (Image)
dev_set_line_width (2)
*循环显示中心|Row|:代表数组元素的个数
for Index := 0 to |Row|-1 by 1
disp_cross (WindowHandle, Row[Index], Column[Index],15, 0)
disp_message (WindowHandle,'数量:'+ Number, 'image', 18, 18, 'green', 'false')
*显示文本在窗口上
disp_message (WindowHandle, 'hhhh', 'window', 100, 50, 'green', 'false')
endfor
程序4
dev_update_window('off')
read_image (Bottle, './images/bottle2.png')
dev_get_window (WindawHardle)
set_display_font(WindawHardle, 27 , 'mono' , 'true', 'false')
*粗略分割字符区域
threshold (Bottle, RawSegmentation, 0, 95)
*根据孔的面积大小填充孔洞
fill_up_shape (RawSegmentation, RemovedNoise,'area', 1,5)
opening_circle (RemovedNoise,ThickStructures,2.5)
*填充所有的孔
fill_up (ThickStructures,Solid)
*垂直开运算.断开垂直方向的粘连
stop()
opening_rectangle1(Solid, Cut,1,7)
opening_circle (Cut, RegionOpening,2.5)
connection (RegionOpening, ConnectedPatterns)
*取交集
intersection (ConnectedPatterns,ThickStructures,NumberCandidates)
select_shape (NumberCandidates , Numbers,'area', 'and' , 300,9999)
sort_region (Numbers, FinalNumbers,'first_point','true' , 'column')
dev_display (Bottle)
dev_set_colored (12)
dev_set_line_width (2)
dev_set_draw ( 'margin')
dev_display (FinalNumbers)
stop()
*利用已经存在的机器学习模型识别*找到会做题的人
read_ocr_class_mlp('DotPrint_0-9.omc',OCRHandleMLP_OCR)
*识别字符
dev_clear_window ()
dev_display (Bottle)
Class_Bottle:=[]
*确定一个显示位置
shape_trans (FinalNumbers,RegionSamllestRect , 'rectangle1')
area_center (RegionSamllestRect , Area1, Row1, Column1)
RowMean:=mean(Row1)
count_obj (FinalNumbers, Number)
Confidence_:=[]
for Index := 0 to Number-1 by 1
select_obj (FinalNumbers,ObjectSclected,Index+1)
*单个字符识别
do_ocr_single_class_mlp (ObjectSclected, Bottle, OCRHandleMLP_OCR, 1, Class, Confidence)
*将识别到的字符全部记录下来
*Confidence置信度
if (Confidence>0.8)
*将Class的结果装到Class_Bottle
Confidence_:=[Confidence_,Confidence]
Class_Bottle:=[Class_Bottle,Class]
disp_message(WindawHardle, Class, 'image', RowMean-50, Column1[Index]-10, 'blue', 'true')
endif
Endfor
程序5
read_image (Image, './颜色')
*******给定颜色确定目标位置(以红色为例,其他相同)*****
dev_get_window (HWnd)
****确定红色目标*****
decompose3 (Image, ImageR, ImageG, ImageB)
*转为hsv模型(H:灰度值 0-255,实际H表示角度0-360)
trans_from_rgb ( ImageR, ImageG, ImageB,\
H, S, V, 'hsv')
*1.在亮度通道V中目标应该较亮 100:255 60:153
threshold (V, RegionV, 160, 255)
*2.饱和度S中值较高 100:255 50:127.5
threshold (S, RegionS, 130, 255)
intersection (RegionS, RegionV, RegionVS)
****角度对应灰度值换算关系
K:=255.0/360
*****确定红色****
*angel1: 0-14
*angle2:350-360
*红色目标角度范围 给定 340~360 0~20
threshold ( H, Region_red_1, 0, 20*K)
threshold ( H, Region_red_2, 350*K, 360*K)
*合并两个区域
union2 (Region_red_1, Region_red_2, RegionRed)
closing_circle (RegionRed, RegionClosing, 5.5)
*填充闭合的孔
fill_up (RegionClosing, RegionFillUp)
opening_circle (RegionFillUp, RegionOpening, 5.5)
intersection (RegionVS, RegionOpening, RegionRed)
dev_set_draw ('margin')
dev_display (Image)
dev_set_color ('white')
dev_set_line_width (2)
dev_display (RegionRed)
stop()
*****确定蓝色****
dev_set_draw ('fill')
threshold (H, blue,200*K,252*K)
closing_circle (blue, RegionClosing2, 3.5)
opening_circle (RegionClosing2, RegionOpening2, 5.5)
intersection (RegionVS, RegionOpening2, RegionBlue)
stop()
*****取绿色 100-140*********
threshold ( H, RegionGreen, 100*K, 140*K)
closing_circle (RegionGreen, RegionClosing1, 5.5)
opening_circle (RegionClosing1, RegionOpening1, 5.5)
*两个区域取交集 绿色圆
intersection (RegionVS, RegionOpening1, RegionGreen)