<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • halcon 基礎總結(一)裁切圖片并旋轉圖像

    ?

     

    • 第一步當然是讀取圖像了:read_image (Image, 'C:/Users/HJ/Desktop/test_image/b.jpg')        

      ?

    • 第二步:二值化。二值化。因為我這里的物體是黑色的,所以用binary_threshold來二值化的時候參數選擇的‘dark’,如果特征是白色的話可以把dark改為light,效果如下:

    • 第三步:將區域打散,然后根據過濾條件來進行賽選,我這里是通過面積來進行篩選 。過濾條件在這里只用了一個,也可以使用多個過濾條件來進行過濾。

            connection (Region, ConnectedRegions)

            select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 400000, 9900000)

    ?編輯?編輯 

    •  第四步:篩選完之后就只剩下想要的區域了,然后尋找區域的最小外接矩形。

               smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Lenghts1, Lenghts2)
               返回的Row,Column是區域特征的中心點坐標,Lenghts1是物體區域的長邊的一半,Lenghts2是物體區域的短邊的一半,Lenghts1>Lenghts2恒成立。Phi是x軸(水平)與長邊的夾角的弧度,

               它的值在(-π/2, π/2), 要將phi換成角度的話只用angle := -180/π  * phi就好了

    • 第五步:因為在實際場景中,拍出來的圖片位置會有些許差異,所以我們需要得到一個統一的輸出,也就是輸出的圖片中物體的位置差異不大。所以就需要經過旋轉和裁切來進行處理。

            rotate_image(Image, ImageRotate, angle, 'constant')

            在halcon中rotate_image是按逆時針方向進行旋轉,而且旋轉后的圖片大小不變,但內容可能會有缺失。并且物體的中心在原圖的位置和在旋轉之后圖片上的位置還會有差異。

     

    ?編輯

     為了解決使用rotate_image進行旋轉產生的問題,可以所以建議使用旋轉矩陣來進行旋轉。具體參數解釋在代碼里

    hom_mat2d_identity(HomMat2DIdentity)
    hom_mat2d_rotate(HomMat2DIdentity, rad(angle), Row, Column, HomMat2DRotate)
    affine_trans_image(Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')

    ?編輯

    • 第六步:裁剪出想要的區域

    crop_part(ImageAffineTrans, ImagePart, Row-Lenghts2, Column-Lenghts1, 2*Lenghts1, 2*Lenghts2)

    ?編輯

     

    注意事項:

    1. 在旋轉的時候我們的角度是angle:=180/π  * phi,旋轉之后物體的長邊與X軸平行(也就是本子平著)。如果想要本子豎起來就需要令angle := -(ratio*Phi+90)這樣子旋轉之后本子就豎起來
    2. 在使用crop_part這個函數對圖像進行裁切時,如果長邊與X軸平行則Row-Length2,Column-Length1。保存的圖像的長寬分別為2*Lenghts1, 2*Lenghts2
    3. 如果短邊與X軸平行則Row-Length1,Column-Length2。保存的圖像的長寬分別為2*Lenghts2, 2*Lenghts1
    4. 使用旋轉矩陣旋轉之后物體的中心其實是發生了變化的,并且length1可能會大于row和column,所以在crop_part的時候需要注意輸入左上角的坐標
    5. 其實由于旋轉之后物體中心發生了變化,我更傾向于對旋轉之后的圖片再重新二值化尋找輪廓,這樣子物體中心就是正常的了。然后再進行裁切圖片

     

    總體代碼:

     

    read_image (Image, 'C:/Users/HJ/Desktop/save_image/angle_60.png')

    *自適應二值化,當尋找的物體為偏黑時使用dark, 偏白時使用light
    binary_threshold(Image, Region, 'max_separability', 'light', UsedThreshold)
    *將區域打散
    connection (Region, ConnectedRegions)
    *通過面積來篩選區域
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 400000, 9900000)
    *尋找區域的最小外接矩形,返回的Phi是弧度,在(-π/2,π/2)之間
    *Row,Column是中心點的坐標,length1是物體的長邊的一半, length2是物體短邊的一半
    smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Lenghts1, Lenghts2)

    *角度換算,將弧度換算成角度
    ratio := 90.045/1.5708
    angle := ratio*Phi
    *創建vertical來控制旋轉是垂直還是水平, 1表示長邊與x軸平行, 0表示短邊與x軸平行
    vertical := 0
    *創建旋轉矩陣
    hom_mat2d_identity(HomMat2DIdentity)
    if (vertical == 1)
      *旋轉使用的是弧度,所以需要用rad將角度換成弧度, row, column是旋轉中心
      hom_mat2d_rotate(HomMat2DIdentity, rad(90-angle), Row, Column, HomMat2DRotate)
      *旋轉圖片,false的時候圖像大小不發生改變,true的時候圖像大小會變化,使用旋轉矩陣旋轉之后物體的中心其實是發生了變化的,
      *所以在截取物體的時候其實還要在重新尋找一些物體在旋轉之后的圖片上的中心位置
      affine_trans_image(Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'true')
      *裁切圖片,當長邊與x軸平行時,Row-Lenghts2, Column-Lenghts2, 2*Lenghts1, 2*Lenghts2
      *當短邊與x軸平行時,Row-Lenghts1, Column-Lenghts2, 2*Lenghts2, 2*Lenghts1

      *Row-Lenghts1, Column-Lenghts2是左上角的坐標,2*Lenghts2, 2*Lenghts1是截取的場合寬
      crop_part(ImageAffineTrans, ImagePart, Row-Lenghts1, Column-Lenghts2, 2*Lenghts2, 2*Lenghts1)
    else
      hom_mat2d_rotate(HomMat2DIdentity, rad(-angle), Row, Column, HomMat2DRotate)
      affine_trans_image(Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'true')
      crop_part(ImageAffineTrans, ImagePart, Row-Lenghts2, Column-Lenghts1, 2*Lenghts1, 2*Lenghts2)
    endif

     

     

     

    
    
    posted @ 2022-06-28 14:49  小女孩真可愛  閱讀(7)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看