Chuyển tới nội dung chính

cv - Tìm đường viền trong ảnh (:cv_find_shapes)

Khai báo​

thông tin hình dạng tìm thấy, ảnh trực quan = ảnh:cv_find_shapes(tập hợp hình dạng[, cấu hình tìm hình dạng])

Tham số​

  • tập hợp hình dạng
    Kiểu bảng. Thông tin đỉnh của một hoặc nhiều hình dạng cần tìm

    Cấ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,
    },
    ...
    },
    ...
    }
  • cấu hình tìm hình dạng
    Kiểu bảng, không bắt buộc. Các tùy chọn khớp đường viền

    Cá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ề​

  • thông tin hình dạng tìm thấy
    Kiểu bảng

    Cấ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,
    },
    ...
    },
    ...
    },
    ...
    }
  • ảnh trực quan
    Đối tượng ảnh. Khi options.should_visualize là 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()