识别光学芯片中间的波导

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

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

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

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

import win.ui; 
/*DSGpw_*/ 
mainForm = win.form(text="aardio + halcon 矫正并找波导内芯 , Aardio.com.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', [], [])


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...