跳到主要内容

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() -- 可视化输出图片