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