ハルコン画像ステッチ

  1. なぜスプライシングするのか
    被写体が十分に小さい
    場合、レンズの視野が十分に大きい
    場合、十分なお金がある場合は、より優れたカメラとより優れたレンズを購入できます。

ifがあまり多くない場合は、プロジェクトが多すぎて、画像のステッチが避けられません。

  1. 効果は何ですか?
    ハルコン自身の例の助けを借りて、次の2つの画像がより広い画像にステッチされます。

画像1:
ここに画像の説明を記入してください

画像2:
ここに画像の説明を書いてください

ステッチ後の画像:
ここに画像の説明を記入してください

幅が広くなりましたか?

  1. モザイクの手順
    画像の読み取り
    特徴点の抽出
    変換行列の計算
    モザイク
    Halconルーチンproj_match_points_ゆがみ_ransac.hdevを参照し、段階的に分析します。このルーチンは、特徴点に基づいて画像をステッチします。
    ここに写真の説明を書いてください

3.1。画像を読み取り、画像
コードを表示します。

read_image(Image1、 'building_01')
read_image(Image2、 'building_02')
get_image_size(Image1、Width、Height)
dev_close_window()
dev_open_window(0、0、Width、Height、 'white'、WindowHandle)
set_display_font(WindowHandle、16、 ' mono '、' true '、' false ')
dev_display(Image1)
disp_message(WindowHandle、'一致する画像1 '、' image '、-1、-1、' black '、' true ')
disp_continue_message(WindowHandle、' black '、' true ')
stop()
dev_display(Image2)
disp_message(WindowHandle、'一致する画像2 '、' image '、-1、-1、' black '、' true ')
disp_continue_message(WindowHandle、' black '、' true ')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
効果:
ここに写真の説明を書いてください

ここに写真の説明を書いてください

3.2。特徴点の取得
このルーチンは、画像の特徴点に基づいて画像をステッチし、2つの画像の特徴点を取得する必要があります。
特徴点とは何ですか?演算子points_foerstnerの説明によると、特徴点には2つのタイプがあります。1つは画像のエッジ上の点を参照する交差特徴点と呼ばれ、もう1つは色などの領域特徴点と呼ばれます。画像の明るさや明るさが周囲と異なります。

コード:

points_foerstner(Image1、1、2、3、50、0.1、 'gauss'、 'true'、Rows1、Columns1、CoRRJunctions、CoRCJunctions、CoCCJunctions、RowArea、ColumnArea、CoRRArea、CoRCArea、CoCCArea)
points_foerstner(Image2、1、2、 3、50、0.1、 'ガウス'、 '本当'、Rows2、Columns2、CoRRJunctions、CoRCJunctions、CoCCJunctions、RowArea、ColumnArea、CoRRArea、CoRCArea、CoCCArea)
1
2
3
3.3。計算アフィン変換行列
の特性に基づいて2つの画像ポイント、アフィン変換行列を計算します。

コード:

proj_match_points_ransac(画像1、画像2、Rows1、Columns1、Rows2、Columns2、 'NCC'、10、0、0、高さ、幅、0、0.5、 'gold_standard'、2、42、HomMat2DUnrectified、Points1Unrectified、Points2Unrectified)
1
3.3。ステッチ
スプライシングのアフィン変換行列によると。

コード:

concat_obj(
Image1、Image2 、Images)gen_projective_mosaic(Images、MosaicImageUnrectified、1、1、2、HomMat2DUnrectified、 'default'、 'false'、MosaicMatrices2DUnrectified)
1
2
3
効果:
ここに画像の説明を記入してください

シームコードを表示する:

Projective_trans_pixel(MosaicMatrices2DUnrectified [9:17]、[0,493]、[0,0]、RowTrans、ColumnTrans)
gen_contour_polygon_xld(Contour、RowTrans、ColumnTrans)
1
2
3共同
効果:
ここに画像の説明を記入してください

画像が接合されている継ぎ目を注意深く観察し、接合効果が理想的ではなく、継ぎ目がずれていることを確認します。その理由は、2つの画像の放射状の歪みです。放射歪曲とは何ですか?これはレンズに固有のものです。焦点距離が非常に大きいか非常に小さい場合、キャプチャされた画像は特に明白です。画像のエッジは前方に凹状または内側に凸状です。元の2つの画像を注意深く観察すると、エッジは内側に凸状になります。に。

課外知識
カメラ内パラメータ:

f:カメラの主モーメント、つまり焦点距離
k:放射状歪みのサイズ、つまり放射状歪みは、一般に接線方向の歪みを考慮しません
sx、sy:画像の隣接するピクセル間の距離水平および垂直方向のセンサー
cx、cy:イメージング平面上の投影中心の垂直投影
1
2
3
4
外部カメラパラメーター:

平行移動ベクトルX、Y、Z
回転ベクトルX、Y、Z
遠近補正
1
2
3
カメラの内部および外部パラメーターは、カメラキャリブレーションの焦点です。

したがって、ルーチンの後半では、この放射状の歪みがスプライシングに与える影響を排除します。Halconには対応する演算子があり、非常に便利です。

  1. 放射状の歪みをなくす
    4.1。画像を読み上げる
    上記と同じ

4.2。アフィン変換行列を計算
する放射状の歪みを排除する演算子が使用されていることに注意してください。コード:

proj_match_points_ゆがみ_ransac(Image1、Image2、Rows1、Columns1、Rows2、Columns2、 'ncc'、10、0、0、Height、Width、0、0.5、 'gold_standard'、1、42、HomMat2D、Kappa、Error、Points1、Points2)
1
4.3。前処理は、
画像内のミラーの歪みを排除します。

コード:

CamParDist:= [0.0、Kappa、1.0,1.0,0.5 *(幅-1)、0.5 *(高さ-1)、幅、高さ]
change_radial_ゆがみ_cam_par( 'fixed'、CamParDist、0、CamPar)
change_radial_Constraintion_image(Image1 、Image1 、 Image1Rect、CamParDist、CamPar)
change_radial_Constraintion_image(Image2、Image2、Image2Rect、CamParDist、CamPar)
1
2
3
4
5
高果:

画像1(元の画像)
ここに説明を書いてください

画像1(放射状の歪みを取り除いた後)
ここに画像の説明を書きます

画像2(元の画像)
ここに画像の説明を記入してください

画像2(放射状の歪みを取り除いた後)、
ここに画像の説明を記入します。
最初のグループの画像の効果はあまり明白ではありません。2番目のグループの画像を注意深く観察してください。2つのエッジが平らになっていますか?

4.4。画像のステッチ
上記と同じ。

最終的な効果:
ここに写真の説明を書いてください

関節を注意深く観察します。今回は、画像が非常にうまくつなぎ合わされています。

  1. コード
    完全なコードは次のとおりです。
  • この例は、proj_match_points_ゆがみ_ransacを使用して

  • モザイクアプリケーションで2つの画像を一致させます。

  • この例は、アプリケーションのスプライシングでproj_match_points_ゆがみ_ransac演算子を使用する方法を示しています。

  • モザイク2枚の写真(特徴点のマッチングに基づいてスプライスされた画像)

  • 初期化


  • dev_update_offを初期化します()

  • 画像を読んで表示する

  • 读取すると
    、表示画像がread_image(Image1 、 'building_01')
    read_image(Image2、 'building_02')
    get_image_size(Image1、Width、Height)
    dev_close_window()
    dev_open_window(0、0、Width、Height、 'white'、WindowHandle)
    set_display_font( WindowHandle、16、 'mono'、 'true'、 'false')
    dev_display(Image1)
    disp_message(WindowHandle、 '一致する画像1'、 'image'、-1、-1、 'black'、 'true')
    disp_continue_message(WindowHandle、 'black'、 'true')
    stop()
    dev_display(Image2)
    disp_message(WindowHandle、 '一致する画像2'、 'image'、-1、-1、 'black'、 'true')
    disp_continue_message (WindowHandle、 '黒'、 '真')
    停止()

  • 画像から一致するポイントを抽出します

  • 获取特探ポイント
    points_foerstner(Image1、1、2、3、50、0.1、 'gauss'、 'true'、Rows1、Columns1、CoRRJunctions、CoRCJunctions、CoCCJunctions、RowArea、ColumnArea、CoRRArea、CoRCArea、CoCCArea)
    points_foerstner(Image2、1 、2、3、50、0.1、 'gauss'、 'true'、Rows2、Columns2、CoRRJunctions、CoRCJunctions、CoCCJunctions、RowArea、ColumnArea、CoRRArea、CoRCArea、CoCCArea)

  • まず、通常の射影マッチングを実行します。

  • 発生するエラーを示すために放射状の歪みを考慮に入れる

  • 放射状の歪みを無視することによって。

  • まず、歪曲収差を考慮せずに画像スティッチングを行うと、歪曲収差の影響がわかります。

  • 継ぎ目でのステッチ効果は理想的ではありません
    proj_match_points_ransac(Image1、Image2、Rows1、Columns1、Rows2、Columns2、 'ncc'、10、0、0、Height、Width、0、0.5、 'gold_standard'、2、42、HomMat2DUnrectified 、Points1Unrectified、Points2Unrectified)

  • 修正されていない2つの画像から投影モザイクを作成します。

  • 2つの変更されていない(放射状歪みのある)画像を投影モザイク
    concat_obj(
    Image1、Image2 、Images)gen_projective_mosaic(Images、MosaicImageUnrectified、1、1、2、HomMat2DUnrectified、 'default'、 'false'、MosaicMatrices2DUnrectified)

  • 修正されていない結果を表示する

  • 五示結果
    get_image_size(MosaicImageUnrectified、Width、Height)
    dev_set_window_extents(-1、-1、Width、Height)
    dev_clear_window()
    dev_display(MosaicImageUnrectified)

  • シームラインを表示

  • 显示拼接缝隙
    projective_trans_pixel(MosaicMatrices2DUnrectified [午前9時17分]、[0493]、[0,0]、RowTrans、ColumnTrans)
    gen_contour_polygon_xld(輪郭、RowTrans、ColumnTrans)
    set_line_style(WindowHandle、[1,5])
    dev_set_line_width(1)
    dev_set_color( 'yellow')
    dev_display(Contour)
    set_line_style(WindowHandle、[])
    dev_set_draw( 'margin')
    dev_set_color( 'red')
    dev_set_line_width(3)
    gen_circle(Circle、[82,402]、[228,223]、[15,15])
    dev_display (サークル)

  • 結果から、放射状歪みを考慮しないと、継ぎ目でのスプライシング効果は理想的ではなく、継ぎ目は千鳥状になります
    メッセージ:= 'モザイク画像が適合しません'
    メッセージ[1]:= '放射状歪みの場合は完全に'
    メッセージ[2]:= 'は考慮されません
    。'disp_message(WindowHandle、Message、' image '、200、300、' black '、' true ')
    disp_continue_message(WindowHandle、' black '、' true ')
    stop()

  • 次に、ラジアルを取る射影マッチングを実行します

  • 歪みを考慮に入れます。

  • 今回は、放射状の歪みの影響を取り除き、ステッチを再度実行します
    get_image_size(Image1、Width、Height)
    proj_match_points_ゆれ0、0.5、 'gold_standard'、1、42、HomMat2D、Kappa、Error、Points1、Points2)

  • 画像を修正する目的でカメラパラメータを作成し、

  • つまり、放射状の歪みを取り除くためです。

  • 画像を変更するには、カメラパラメータを作成します

  • たとえば、放射歪曲を削除するには
    CamParDist:= [0.0、Kappa、1.0,1.0,0.5 *(Width-1)、0.5 *(Height-1)、Width、Height]

  • 画像から放射状の歪みを取り除きます。

  • 畸変図像d的直径向
    畸変化change_radial_ゆがみ_cam_par( 'fixed'、CamParDist、0、CamPar)
    change_radial_ゆがみ_image(Image1、Image1、Image1Rect、CamParDist、CamPar)
    change_radial_Constraintion_image(Image2、Image2、ImageP、ImagePDR)、

  • 2つの修正された画像からモザイクを作成します。画像に注意してください

  • 完璧にフィットします。

  • 放射状歪みを取り除いた画像を使用して、ステッチ画像を作成します

  • 画像のステッチが非常に優れていることがわかります
    concat_obj(Image1Rect、Image2Rect、ImagesRect)
    gen_projective_mosaic(ImagesRect、MosaicImage、1、1、2、HomMat2D、 'default'、 'false'、MosaicMatrices2D)

  • 修正された結果を表示する

  • 変更された結果を表示します
    get_image_size(MosaicImage、Width、Height)
    dev_set_window_extents(-1、-1、Width、Height)
    dev_clear_window()
    dev_display(MosaicImage)

  • シームラインを表示

  • 卓示接缝
    projective_trans_pixel(MosaicMatrices2D [9:17]、[0,493]、[0,0]、RowTrans、ColumnTrans)
    gen_contour_polygon_xld(Contour2、RowTrans、ColumnTrans)
    set_line_style(WindowHandle、[1,5])
    dev_set_line_width(1)
    dev_ 'yellow')
    dev_display(Contour2)
    set_line_style(WindowHandle、[])
    dev_set_draw( 'margin')
    dev_set_color( 'green')
    dev_set_line_width(3)
    gen_circle(Circle、[124,496]、[244,239]、[15,15])
    dev_display (円)
    メッセージ:= 'モザイク画像は完全にフィットします。'
    メッセージ[1]:= '放射状の歪みが取られた場合'
    メッセージ[2]:= 'を考慮に入れます。
    disp_message(WindowHandle、Message、 'image'、200、300、 'black'、 'true')

  • スプライスされた画像を出力します
    write_image(MosaicImage、 'bmp'、0、 'result.bmp')

おすすめ

転載: blog.csdn.net/weixin_43864187/article/details/112997217