cv - Tìm đường viền trong ảnh (:cv_find_shapes)
Khai báo
found_shapes, visualized = img:cv_find_shapes(shapes[, options])
Tham số
-
shapes
Kiểu bảng. Thông tin đỉnh của một hoặc nhiều hình dạng cần tìmCấu trúc tham số hình dạng
{
{ -- hình dạng 1
{ -- đỉnh 1
["y"] = number_value,
["x"] = number_value,
},
{ -- đỉnh 2
["y"] = number_value,
["x"] = number_value,
},
...
},
{ -- hình dạng 2
{ -- đỉnh 1
["y"] = number_value,
["x"] = number_value,
},
{ -- đỉnh 2
["y"] = number_value,
["x"] = number_value,
},
...
},
...
} -
options
Kiểu bảng, không bắt buộc. Các tùy chọn khớp đường viềnCác trường tùy chọn
{
should_visualize = false | true, -- không bắt buộc, có xuất ảnh trực quan hóa hay không, mặc định false
closed = false | true, -- không bắt buộc, hình dạng có khép kín hay không, mặc định false
min_area = number_value, -- không bắt buộc, diện tích tối thiểu, mặc định -1 (không giới hạn)
max_area = number_value, -- không bắt buộc, diện tích tối đa, mặc định -1 (không giới hạn)
blur_size = integer_value, -- không bắt buộc, kích thước nhân làm mờ, chỉ nhận số lẻ dương, mặc định 3
canny_threshold1 = 100, -- không bắt buộc, ngưỡng dưới Canny, mặc định 100
canny_threshold2 = 200, -- không bắt buộc, ngưỡng trên Canny, mặc định 200
diff_threshold = number_value, -- không bắt buộc, ngưỡng sai khác; càng nhỏ càng tương đồng, mặc định 0.001
approx_epsilon = integer_value, -- không bắt buộc, tỷ lệ phần trăm chu vi dùng để xấp xỉ đường viền, mặc định 2
}
Giá trị trả về
-
found_shapes
Kiểu bảngCấu trúc các hình dạng tìm thấy
{
{ -- danh sách hình dạng khớp với hình dạng đầu vào 1
{
diff_score = number_value, -- càng nhỏ càng tương đồng
{ -- đỉnh 1
["y"] = number_value,
["x"] = number_value,
},
{ -- đỉnh 2
["y"] = number_value,
["x"] = number_value,
},
...
},
{ -- kết quả khớp thứ hai cho hình dạng đầu vào 1
diff_score = number_value,
{ -- đỉnh 1
["y"] = number_value,
["x"] = number_value,
},
{ -- đỉnh 2
["y"] = number_value,
["x"] = number_value,
},
...
},
...
},
{ -- danh sách hình dạng khớp với hình dạng đầu vào 2
{ -- kết quả khớp đầu tiên
diff_score = number_value,
{ -- đỉnh 1
["y"] = number_value,
["x"] = number_value,
},
{ -- đỉnh 2
["y"] = number_value,
["x"] = number_value,
},
...
},
{ -- kết quả khớp thứ hai
diff_score = number_value,
{ -- đỉnh 1
["y"] = number_value,
["x"] = number_value,
},
{ -- đỉnh 2
["y"] = number_value,
["x"] = number_value,
},
...
},
...
},
...
} -
visualized
Đối tượng ảnh. Khioptions.should_visualizelàtrue, đây là ảnh trực quan hóa
Mô tả
Tìm một hoặc nhiều hình dạng trong ảnh
Có thể dùng hàm để tạo các hình dạng chuẩn, đều
Ví dụ
function make_triangle(side_len)
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)
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,
})
nLog(info[1])
nLog(info[2])
dialog():add_image(visimg):show()