Const DOWNPYRS = 3		' ダウンサンプリング回数
Const AMEND_OFFSET = 50	' 補正用オフセット値

Sub Main
    Dim Ctrl
    Dim SrcImg, SrcDownImg
    Dim TempImg, TempDownImg
    Dim ResultImg

    ' オブジェクトの生成
	cao.Controllers.clear
    Set Ctrl = CAO.AddController("Image", "CaoProv.OpenCV", "", "OCREnabled=True, QREnabled=True")
    Set SrcImg = Ctrl.AddFile("ID_99", "ID=99")			' ID99:元画像
    Set TempImg = Ctrl.AddFile("ID_100", "ID=100")		' ID100:テンプレート画像
    Set SrcDownImg = Ctrl.AddFile("ID_101", "ID=101")	' ID101:ダウンサンプリング元画像
    Set TempDownImg = Ctrl.AddFile("ID_102", "ID=102")	' ID102:ダウンサンプリングテンプレート画像
    Set ResultImg = Ctrl.AddFile("ID_98", "ID=98")		' ID98:結果画像
    SrcImg.Copy 98
    SrcImg.Copy 101
    TempImg.Copy 102

    ' ダウンサンプリング
    For i = 1 To DOWNPYRS
        SrcDownImg.PyrDown 101
        TempDownImg.PyrDown 102
    Next

    ' ダウンサンプリングでのマッチング
    Dim vntDownRet
    vntDownRet = SrcDownImg.MatchTemplate(102, 3, 10)

    Dim vntSrcSize, vntTempSize
    vntSrcSize = DAT.ToVar(SrcImg.ImageSize)
    vntTempSize = DAT.ToVar(TempImg.ImageSize)
    
    ' 各個の詳細座標をマッチング
    Dim vntRet
    For i = LBound(vntDownRet) To UBound(vntDownRet)
        ' スケールを戻す
        vntDownRet(i)(0) = 2 ^ DOWNPYRS * vntDownRet(i)(0)
        vntDownRet(i)(1) = 2 ^ DOWNPYRS * vntDownRet(i)(1)

        ' ROIの設定
        Dim RoiX, RoiY, RoiW, RoiH
		If vntDownRet(i)(0) > AMEND_OFFSET then
			RoiX = vntDownRet(i)(0) - AMEND_OFFSET - vntTempSize(0) / 2
		Else
			RoiX = 0
		End If
		If vntDownRet(i)(1) > AMEND_OFFSET then
			RoiY = vntDownRet(i)(1) - AMEND_OFFSET - vntTempSize(1) / 2
		Else
			RoiX = 0
		End If
        RoiW = vntTempSize(0) + AMEND_OFFSET * 2
        If (RoiX + RoiW > vntSrcSize(0) - 1) Then
            RoiW = vntSrcSize(0) - 1 - RoiX
        End If
        RoiH = vntTempSize(1) + AMEND_OFFSET * 2
        If (RoiY + RoiH > vntSrcSize(1) - 1) Then
            RoiH = vntSrcSize(1) - 1 - RoiY
        End If
        SrcImg.SetROI RoiX, RoiY, RoiW, RoiH
    
        ' マッチング
        vntRet = SrcImg.MatchTemplate(100, 3, 1)
        
        SrcImg.ResetROI RoiX, RoiY, RoiW, RoiH
        
		' 結果出力
        Dim RetX, RetY
        RetX = vntRet(0)(0) + RoiX
        RetY = vntRet(0)(1) + RoiY
        ResultImg.Circle 98, RetX , RetY, 2, 255, 0, 0, 1, 0
        ResultImg.Rectangle 98, RetX - vntTempSize(0) / 2, RetY  - vntTempSize(1) / 2, RetX + vntTempSize(0) / 2, RetY + vntTempSize(1) / 2, 255, 0, 255, 1, 0
    Next
End Sub

