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

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ì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,
    },
    ...
    },
    ...
    }
  • options
    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ề

  • found_shapes
    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,
    },
    ...
    },
    ...
    },
    ...
    }
  • visualized
    Đối tượng ảnh. Khi options.should_visualizetrue, đâ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()