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() -- 可視化画像を出力