识别光学芯片中间的波导

By 笑口常开 at 2019-03-22 • 0人收藏 • 385人看过

之前我把这个halcon代码和aar工程的代码发布在了halcon的论坛里

http://www.ihalcon.com/read-11823-1.html

这种办法, 通用性不强, 原来的代码如下:

import win.ui; 
/*DSGpw_*/ 
mainForm = win.form(text="aardio + halcon 矫正并找波导内芯 , Htmlayout.cn";right=883;bottom=561) 
mainForm.add( 
button={cls="button";text="检测";left=7;top=43;right=182;bottom=101;z=1}; 
picturebox={cls="picturebox";left=214;top=0;right=884;bottom=562;z=2} 
) 
/**/ 

import com 
import com.activeX 

var HOperatorSetX; 

//检查并注册halcon控件 
try{ 
HOperatorSetX = com.CreateObject("{6ebd90e2-d219-11d2-ade5-0000c00f4ef9}"); 
} 
catch(e){ 
com.activeX.regsvr32As("\res\halconx.dll"); 
HOperatorSetX = com.CreateObject("{6ebd90e2-d219-11d2-ade5-0000c00f4ef9}"); 
} 

//调用halcon控件 
HOperatorSetX = com.CreateObject("{6ebd90e2-d219-11d2-ade5-0000c00f4ef9}") 

var Image = HOperatorSetX.ReadImage( "img/555.png" ); 
var Width , Height = HOperatorSetX.GetImageSize( Image ); 
var WindowHandle = HOperatorSetX.OpenWindow( 0 , 0 , mainForm.picturebox.width , mainForm.picturebox.height , mainForm.picturebox.hwnd , "transparent" , "" ); 
HOperatorSetX.DispObj( Image , WindowHandle ); 

mainForm.button.oncommand = function(id,event){ 

var ImageScaled = HOperatorSetX.ScaleImage( Image , 6.07143, -164 ); 
var GrayImage = HOperatorSetX.Rgb1ToGray( ImageScaled ); 
var Region = HOperatorSetX.Threshold( GrayImage , 63 , 255 ); 
var RegionFillUp = HOperatorSetX.FillUp( Region ); 
var Row , Column , Phi , Length1 , Length2 = HOperatorSetX.SmallestRectangle2( RegionFillUp ); 
var Rad = math.rad(270) 
var HomMat2d = HOperatorSetX.VectorAngleToRigid( Row , Column , Phi , Row , Column , Rad ); 
var ImageAffineTrans = HOperatorSetX.AffineTransImage( GrayImage , HomMat2d , 'constant', 'false' ); 

HOperatorSetX.DispObj( ImageAffineTrans , WindowHandle ); 

var ImageGauss = HOperatorSetX.GaussImage( ImageAffineTrans , 5 ); 
var DiffOfGauss = HOperatorSetX.DiffOfGauss( ImageGauss , 3 , 1.6 ); 
var Region = HOperatorSetX.Threshold( DiffOfGauss , -73 , -3 ); 
var ConnectedRegions = HOperatorSetX.Connection( Region ); 
var SelectedRegions = HOperatorSetX.SelectShape( ConnectedRegions , 'width', 'and', 477.25, 585.06 ); 
var RegionClosing = HOperatorSetX.ClosingRectangle1( SelectedRegions , Width , Height ); 
var Row1 , Column1 , Row2 , Column2 = HOperatorSetX.InnerRectangle1( RegionClosing ); 
var Rectangle = HOperatorSetX.GenRectangle1( Row1 , Column1 , Row2 , Column2 ); 
var SortedRegions = HOperatorSetX.SortRegion( Rectangle , 'first_point', 'true', 'row' ); 
var Number = HOperatorSetX.CountObj( SortedRegions ); 

HOperatorSetX.SetColor( WindowHandle , "green" ); 
HOperatorSetX.SetDraw( WindowHandle , "margin" ); 

var columnPublic = 0; 
for(i=2;Number-1;1){ 
var ObjectSelected = HOperatorSetX.SelectObj( SortedRegions , i ); 
var Area , Row , Column = HOperatorSetX.AreaCenter( ObjectSelected ); 
if(i == 2){ 
columnPublic = Column; 
} 
var Rectangle = HOperatorSetX.GenRectangle1( Row-3 , columnPublic-270 , Row+3 , columnPublic+270 ); 
HOperatorSetX.DispObj( Rectangle , WindowHandle ); 
} 

} 

mainForm.show(); 
return win.loopMessage();

这两天看了看其他算子, 发现设置ROI后, 直接用 LinesGauss 更好

mainForm.button2.oncommand = function(id,event){
 	HOperatorSetX.SetDraw( WindowHandle , "margin" );
 	HOperatorSetX.SetColor( WindowHandle , "green" ); 
 	HOperatorSetX.SetLineWidth( WindowHandle , 3 ); 
	var GrayImage = HOperatorSetX.Rgb1ToGray( Image ); 
	var Region = HOperatorSetX.Threshold( GrayImage , 63 , 255 ); 
	var RegionFillUp = HOperatorSetX.FillUp( Region ); 
	var Row , Column , Phi , Length1 , Length2 = HOperatorSetX.SmallestRectangle2( RegionFillUp ); 
	//旋转图像
	var Rad = math.rad(0) 
	var HomMat2d = HOperatorSetX.VectorAngleToRigid( Row , Column , Phi , Row , Column , Rad ); 
	var ImageAffineTrans = HOperatorSetX.AffineTransImage( GrayImage , HomMat2d , 'constant', 'false' ); 
	HOperatorSetX.DispObj( ImageAffineTrans , WindowHandle ); 
	win.delay(2000)
	//高斯模糊
	var ImageGauss = HOperatorSetX.GaussImage( ImageAffineTrans , 5 ); 
	//绘制ROI区间
	var Rectangle = HOperatorSetX.GenRectangle1( 274.757, 350.787, 645.919, 816.213 );
	HOperatorSetX.DispObj( Rectangle , WindowHandle );
	//win.delay(2000)
	HOperatorSetX.DispObj( ImageAffineTrans , WindowHandle );
	var ImageReduced = HOperatorSetX.ReduceDomain( ImageGauss , Rectangle );
	//黑白反转图像
	var ImageInvert = HOperatorSetX.InvertImage( ImageReduced );
	//对比度调大
	var ImageScaled = HOperatorSetX.ScaleImage( ImageInvert , 2.42857, -364 );
	//模糊图像
	var ImageMean = HOperatorSetX.MeanImage( ImageScaled , Width , 1 );
	//抽取高斯线性线段
	var Lines = HOperatorSetX.LinesGauss( ImageMean , 3, 0.5, 1, 'dark', 'false', 'bar-shaped', 'true' );
	//排序
	var SortedContours = HOperatorSetX.SortContoursXld( Lines , 'upper_left', 'true', 'row' );
	//显示线段
	HOperatorSetX.DispObj( SortedContours , WindowHandle );
	
	//绘制为实体线
	var Polygons = HOperatorSetX.GenPolygonsXld( SortedContours , 'ramer', 2 );
	//求出每根线的位置
	var BeginRow , BeginCol , EndRow , EndCol , Length , Phi = HOperatorSetX.GetLinesXld( Polygons );
	//显示位置信息
	HOperatorSetX.DispText( WindowHandle , BeginRow , "image" , BeginRow, BeginCol , "black" ,  ,  );
	
	
}

image.png

1 个回复 | 最后更新于 2019-03-22
2019-03-22   #1

Halcon代码如下:

read_image (Image, 'C:/Users/popdes/Desktop/555.png') 
get_image_size (Image, Width, Height) 

rgb1_to_gray (Image, ImageGray) 
threshold (ImageGray, Regions, 63, 255) 
fill_up (Regions, RegionFillUp) 
smallest_rectangle2 (RegionFillUp, Row, Column, Phi, Length1, Length2) 
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2) 
Rad := rad(0) 
vector_angle_to_rigid (Row, Column, Phi, Row, Column, Rad, HomMat2D) 
affine_trans_image (ImageGray, ImageAffineTrans, HomMat2D, 'constant', 'false') 
gauss_image (ImageAffineTrans, ImageGauss, 5) 

gen_rectangle1 (ROI_0, 274.757, 350.787, 645.919, 816.213)
reduce_domain (ImageGauss, ROI_0, ImageReduced)
invert_image (ImageReduced, ImageInvert)
scale_image (ImageInvert, ImageScaled, 2.42857, -364)

mean_image (ImageScaled, ImageMean, Width, 1)

lines_gauss (ImageMean, Lines, 3, 0.5, 1, 'dark', 'false', 'bar-shaped', 'true')
sort_contours_xld (Lines, SortedContours, 'upper_left', 'true', 'row')
gen_polygons_xld (SortedContours, Polygons, 'ramer', 2)

get_lines_xld (Polygons, BeginRow, BeginCol, EndRow, EndCol, Length, Phi1)

dev_disp_text (BeginRow, 'image', BeginRow, BeginCol, 'black', [], [])


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
Htmlayout皮肤Htmlayout皮肤引擎介绍
黑猫Aar教程网:简码编程
C大Aardio论坛:Aar爱好者论坛
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...