跳至主要內容

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() -- 可視化輸出圖片