メインコンテンツまでスキップ

cv - 画像から輪郭を検索 (:cv_find_shapes)

宣言

検出した形状情報, 可視化画像 = 画像:cv_find_shapes(形状セット[, 形状検索設定])

パラメータ

  • 形状一覧
    テーブル。検索する単一または複数の形状の頂点情報

    形状一覧の構造
    {
    { -- 形状 1
    { -- 形状 1 の頂点 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- 形状 1 の頂点 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- 形状 2
    { -- 形状 2 の頂点 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- 形状 2 の頂点 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    }
  • 形状検索オプション
    省略可能なテーブル。輪郭マッチングのオプション

    形状検索オプションのフィールド
    {
    should_visualize = false | true, -- 省略可能。可視化出力を行うか。デフォルトは false
    closed = false | true, -- 省略可能。図形を閉じるか。デフォルトは false
    min_area = number_value, -- 省略可能。最小面積。デフォルトは -1 で制限なし
    max_area = number_value, -- 省略可能。最大面積。デフォルトは -1 で制限なし
    blur_size = integer_value, -- 省略可能。ぼかしカーネルのピクセル数。正の奇数のみ。デフォルトは 3
    canny_threshold1 = 100, -- 省略可能。エッジの最小しきい値。デフォルトは 100
    canny_threshold2 = 200, -- 省略可能。エッジの最大しきい値。デフォルトは 200
    diff_threshold = number_value, -- 省略可能。差分のしきい値。小さいほど類似。デフォルトは 0.001
    approx_epsilon = integer_value, -- 省略可能。複雑な輪郭を単純化するための、周長に対する輪郭近似の比率。デフォルトは 2
    }

戻り値

  • 検出した形状情報
    テーブル

    検出した形状情報の構造
    {
    { -- 形状 1 と一致する形状の一覧
    { -- 形状 1 と一致する 1 番目の形状
    diff_score = number_value, -- この形状と形状 1 との差分値。小さいほど類似
    { -- 形状 1 と一致する 1 番目の形状の頂点 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- 形状 1 と一致する 1 番目の形状の頂点 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- 形状 1 と一致する 2 番目の形状
    diff_score = number_value, -- この形状と形状 1 との差分値。小さいほど類似
    { -- 形状 1 と一致する 2 番目の形状の頂点 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- 形状 1 と一致する 2 番目の形状の頂点 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    },
    { -- 形状 2 と一致する形状の一覧
    { -- 形状 2 と一致する 1 番目の形状
    diff_score = number_value, -- この形状と形状 2 との差分値。小さいほど類似
    { -- 形状 2 と一致する 1 番目の形状の頂点 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- 形状 2 と一致する 1 番目の形状の頂点 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- 形状 2 と一致する 2 番目の形状
    diff_score = number_value, -- この形状と形状 2 との差分値。小さいほど類似
    { -- 形状 2 と一致する 2 番目の形状の頂点 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- 形状 2 と一致する 2 番目の形状の頂点 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    },
    ...
    }
  • 可視化画像
    画像オブジェクト。options.should_visualize が true の場合、この戻り値は可視化結果の画像オブジェクト

説明

画像から単一または複数の形状を検索する
標準的な規則形状は関数で生成できる

function make_triangle(side_len) -- 正三角形を作成。辺の長さのみを指定すると、3 個の頂点を自動生成
local hf = math.sqrt(3)/2
local h = math.floor(hf * side_len)
return {
{
["x"] = 1,
["y"] = h,
},
{
["x"] = side_len,
["y"] = h,
},
{
["x"] = side_len // 2,
["y"] = 1,
},
}
end

function make_rectangle(side_len) -- 正方形を作成。辺の長さのみを指定すると、4 個の頂点を自動生成
return {
{ -- 左上
["x"] = 1,
["y"] = 1,
},
{ -- 左下
["x"] = 1,
["y"] = side_len,
},
{ -- 右下
["x"] = side_len,
["y"] = side_len,
},
{ -- 右上
["x"] = side_len,
["y"] = 1,
},
}
end
-- 戻り値は複数の形状一覧をまとめた一覧で、各一覧はパラメータに指定した形状の検索結果に対応する
-- ここでは正三角形と正方形を検索する
local info, visimg = screen.image():cv_find_shapes({make_triangle(45), make_rectangle(40)}, {
min_area = 2000, -- 最小面積
max_area = 20000, -- 最大面積
diff_threshold = 0.005, -- 変形の最大許容差。小さいほど類似
approx_epsilon = 1,
shape_match_mode = 3,
closed = true, -- 閉じた図形
should_visualize = true, -- 可視化出力を行うか。true の場合、二番目の戻り値は画像
})

nLog(info[1]) -- 正三角形と一致する形状の一覧を出力
nLog(info[2]) -- 正方形と一致する形状の一覧を出力

dialog():add_image(visimg):show() -- 可視化画像を出力