Halcon編程實驗-(3)紙片測量【目的:仿射變換的應用】

程序流程

1.圖像採集
2.圖像灰度化
3.圖像二值化
4.圖像形態學閉運算
5.填充所有孔洞
6.計算所有連通域
7.計算區域方向
8.獲取區域中心位置座標
9.計算生成旋轉矩陣
10.旋轉圖像至水平方向
11.幾何測量,得到寬度(單位:像素)

本次實驗重點知識:仿射變換的應用

環境

筆記本電腦摺疊90度,利用其攝像頭完成實驗平臺搭建,在擴展屏上進行代碼編輯,筆記本屏幕壁紙更換爲白色背景,亮度調節至最高,減少陰影影響,使用自制小紙片。
在這裏插入圖片描述

相關代碼:

* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] ', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
* dev_update_off ()
while (true)
    grab_image_async (Image, AcqHandle, -1)
    rgb1_to_gray (Image, GrayImage)
    threshold (GrayImage, Regions, 149, 206)
    closing_rectangle1 (Regions, RegionOpening, 10, 10)//形態學閉運算,模版爲矩形
    fill_up (RegionOpening, RegionFillUp)
    orientation_region (RegionFillUp, Phi)//區域方向計算,得到弧度Phi
    area_center (RegionFillUp, Area, Row, Column) //獲得區域座標,面積
    vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)//生成旋轉矩形
    affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')//旋轉操作
   
    //以下測量部分代碼使用測量助手生成
    * Measure 02: Code generated by Measure 02
    * Measure 02: Prepare measurement
    AmplitudeThreshold := 49
    RoiWidthLen2 := 29
    set_system ('int_zooming', 'true')
    * Measure 02: Coordinates for line Measure 02 [0]
    LineRowStart_Measure_02_0 := 241.682
    LineColumnStart_Measure_02_0 := 320.184
    LineRowEnd_Measure_02_0 := 260.591
    LineColumnEnd_Measure_02_0 := 1232.32
    * Measure 02: Convert coordinates to rectangle2 type
    TmpCtrl_Row := 0.5*(LineRowStart_Measure_02_0+LineRowEnd_Measure_02_0)
    TmpCtrl_Column := 0.5*(LineColumnStart_Measure_02_0+LineColumnEnd_Measure_02_0)
    TmpCtrl_Dr := LineRowStart_Measure_02_0-LineRowEnd_Measure_02_0
    TmpCtrl_Dc := LineColumnEnd_Measure_02_0-LineColumnStart_Measure_02_0
    TmpCtrl_Phi := atan2(TmpCtrl_Dr, TmpCtrl_Dc)
    TmpCtrl_Len1 := 0.5*sqrt(TmpCtrl_Dr*TmpCtrl_Dr + TmpCtrl_Dc*TmpCtrl_Dc)
    TmpCtrl_Len2 := RoiWidthLen2
    * Measure 02: Create measure for line Measure 02 [0]
    * Measure 02: Attention: This assumes all images have the same size!
    gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 1280, 720, 'nearest_neighbor', MsrHandle_Measure_02_0)
    * Measure 02: ***************************************************************
    * Measure 02: * The code which follows is to be executed once / measurement *
    * Measure 02: ***************************************************************
    * Measure 02: The image is assumed to be made available in the
    * Measure 02: variable last displayed in the graphics window
    copy_obj (ImageAffineTrans, Image, 1, 1)
    * Measure 02: Execute measurements
    measure_pairs (Image, MsrHandle_Measure_02_0, 1, AmplitudeThreshold, 'all', 'all', Row1_Measure_02_0, Column1_Measure_02_0, Amplitude1_Measure_02_0, Row2_Measure_02_0, Column2_Measure_02_0, Amplitude2_Measure_02_0, Width_Measure_02_0, Distance_Measure_02_0)
    * Measure 02: Do something with the results
endwhile
close_framegrabber (AcqHandle)

實驗效果

原圖:
在這裏插入圖片描述
旋轉過後:

測量結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章