v2.1.0

v2.1.0 là một bản phát hành hiện đại hóa API toàn diện. Bản này thay thế bộ mô tả điểm đặc trưng FREAK bằng ORB, làm lại find_blobs() / biểu đồ tần suất / thống kê thành API dựa trên đối tượng, đổi tên các hàm tự động phơi sáng/khuếch đại/cân bằng trắng của sensor, thêm phát hiện mã QR và hiệu chỉnh ống kính OV7725, đồng thời hỗ trợ bo mạch OpenMV Cam M7 ban đầu. Nhiều API đã thay đổi — hãy đọc các thay đổi gây lỗi bên dưới.

Điểm nổi bật

  • Điểm đặc trưng ORB — bộ mô tả FREAK được thay thế bằng ORB (find_keypoints() / match_descriptor() được làm lại).

  • API đối tượngfind_blobs(), get_histogram(), get_statistics() giờ đây trả về các đối tượng có bộ truy cập được đặt tên.

  • Mã QR — thêm tính năng phát hiện image.find_qrcodes().

  • OpenMV Cam M7 — hỗ trợ bo mạch ban đầu.

  • Cảm biếnset_auto_whitebal() / set_auto_gain() / set_auto_exposure() (đổi tên) và set_lens_correction().

  • Thay đổi gây lỗi: các API điểm đặc trưng/bộ mô tả, blob/biểu đồ tần suất/thống kê, hàm tự động của cảm biến, và một số API khác đã thay đổi — xem phần thay đổi gây lỗi.

Tính năng mới

  • OpenMV Cam M7 — thêm hỗ trợ bo mạch OpenMV 3 (M7) ban đầu.

  • Mã QR — thêm image.find_qrcodes() cùng ví dụ qrcodes.py.

  • Điểm đặc trưng ORB — hệ thống bộ mô tả ORB mới: find_keypoints() với tham số corner_detector (CORNER_FAST / CORNER_AGAST), max_keypoints / scale_factor; match_descriptor() với từ khóa filter_outliers và ước tính góc quay; lưu/tải điểm đặc trưng.

  • API đối tượngimage.get_histogram() / get_statistics() / get_percentile() trả về các đối tượng biểu đồ tần suất/thống kê; find_blobs() trả về các đối tượng blob (rect() / cx() / cy() / code() / area() / pixels()) với area_threshold / pixels_threshold / merge / margin / invertx_stride / y_stride.

  • Cảm biến — thêm sensor.set_lens_correction(enable, radi, coef) để bù bóng ống kính OV7725, sensor.set_windowing() nay cũng chấp nhận bộ giá trị (w, h) (tự động căn giữa), và image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

  • Thêm các tập lệnh ví dụ về theo dõi màu sắc, SPI/I2C-slave trên Arduino, điểm đặc trưng, và biểu đồ tần suất/thống kê.

Các thay đổi và cải tiến khác

  • IDE nay có thể ngắt main.py đang chạy; find_blobs() / find_qrcodes() / get_statistics() nhanh hơn; ORB dùng khoảng cách Hamming popcount; hiệu chỉnh ống kính dùng ít RAM hơn; quy tắc udev trên Linux ngăn ModemManager chiếm cổng nối tiếp.

Sửa lỗi

Camera và xử lý ảnh:

  • Sửa lỗi làm sạch/hủy hợp lệ bộ nhớ đệm DMA trên M7 (khung hình bị hỏng), đường thừa ở cuối mỗi khung hình, tràn bộ đệm JPEG, giải phóng bộ đệm khung hình khi compress() thất bại, độ chính xác ORB / ROI / xử lý tập rỗng, và hình học load_image(copy_to_fb=True).

Hệ thống:

  • Sửa hỗ trợ ADC trên F7, tên thanh ghi OV7725, thời gian bootloader/USB, sử dụng WFI khi chờ ảnh chụp, và làm cho ví dụ MJPEG streamer không chặn với thời gian chờ theo từng máy khách.

Hỗ trợ phần cứng và bo mạch

  • OpenMV Cam M7 (OpenMV 3) — hỗ trợ bo mạch ban đầu.

  • OV7725 — hỗ trợ hiệu chỉnh ống kính (bù bóng).

Thay đổi API gây lỗi

Các thay đổi API hiển thị với người dùng giữa v2.0.0 và v2.1.0. Phạm vi: các C-module Python trong modules/ và thư viện Python trong scripts/libraries/.

Mỗi thay đổi được gắn nhãn theo mức độ ảnh hưởng:

  • major — ảnh hưởng đến hầu hết các tập lệnh sử dụng tính năng đó; bạn cần chuyển đổi mã.

  • minor — API hẹp; chỉ ảnh hưởng đến các tập lệnh sử dụng nó.

  • behavior — API giống nhau, kết quả khác nhau; hãy kiểm tra lại các tập lệnh đã tinh chỉnh.

Các thay đổi được nhóm theo mức độ ảnh hưởng theo thứ tự đó. Nếu bạn chỉ muốn chuyển đổi mã, hãy chuyển đến danh sách kiểm tra di chuyển ở cuối trang. Mỗi mã hash commit liên kết đến diff của nó trên GitHub.

FREAK được thay thế bằng ORB; API bộ mô tả được làm lại (major)

Bộ mô tả điểm đặc trưng FREAK đã bị xóa và thay thế bằng ORB: image.FREAK không còn tồn tại (dùng image.ORB). image.match_descriptor() / save_descriptor() / load_descriptor() không còn nhận tham số loại bộ mô tả đứng đầu (nó được suy ra từ đối tượng), match_descriptor() nay trả về bộ giá trị 8 phần tử (cx, cy, x, y, w, h, match_count, rotation) (phần tử cuối là số đếm thô, không phải phần trăm), và draw_keypoints() yêu cầu đối tượng keypoints thay vì danh sách (x, y, angle) thô. find_keypoints() nhận thêm corner_detector / max_keypoints / scale_factor với giá trị mặc định thay đổi.

Commits: e2d0c4840, bba8e5a9e, 6000684cb

Đổi tên hàm tự động của cảm biến (major)

sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() được đổi tên thành sensor.set_auto_whitebal() / set_auto_gain() / set_auto_exposure() (tên cũ đã bị xóa). Mỗi hàm có thêm từ khóa tùy chọn value= để đặt giá trị thủ công thay vì tự động.

Commits: 1b22a2961

Biểu đồ tần suất / thống kê được làm lại thành API đối tượng (major)

Giao diện biểu đồ tần suất/thống kê được làm lại thành dạng đối tượng qua image.get_histogram() / get_statistics() / get_percentile() trả về các đối tượng biểu đồ/thống kê. Kết quả biểu đồ/thống kê dạng phẳng cũ và các phương thức bin_count / l_bin_count / a_bin_count / b_bin_count đã bị xóa (dùng len(histogram.bins()) v.v.).

Commits: 011108412, 9f37c83de

Đổi tên scale trong find_features() (major)

image.find_features() (Haar) đổi tên từ khóa scale= thành scale_factor=. Hãy cập nhật các lệnh gọi find_features(cascade, scale=...) thành scale_factor=....

Commits: 96e4f770c

find_blobs() trả về đối tượng; find_markers() bị xóa (minor)

image.find_blobs() nay trả về các đối tượng blob với bộ truy cập được đặt tên (truy cập theo chỉ mục vẫn hoạt động để tương thích ngược), và image.find_markers() đã bị xóa — hãy dùng find_blobs(..., merge=True, margin=...) thay thế. Hàm gọi lại lọc blob màu nâng cao không còn được hỗ trợ.

Commits: af15ec6eb

img.copy_to_fb() được thay thế (minor)

Phương thức img.copy_to_fb() được thay thế bằng từ khóa copy_to_fb= trên image.Image / load_image(). Dùng image.Image(path, copy_to_fb=True) để tải ảnh lớn trực tiếp vào bộ đệm khung hình.

Commits: 1645ab94b

compress() từ chối chất lượng ngoài phạm vi (behavior)

image.compress() / compressed() nay phát sinh lỗi khi quality nằm ngoài phạm vi 1–100 thay vì âm thầm giới hạn lại. Hãy giới hạn quality vào 1–100 trước khi gọi. Ngoài ra, bộ đệm JPEG của OpenMV 3 đã được giảm từ 64 KB xuống 23000 byte, vì vậy các khung hình lớn có thể phát sinh lỗi hết bộ nhớ — hãy giảm chất lượng JPEG hoặc kích thước khung hình.

Commits: 9efd7474a, 9a7c3defc

Zoom của lens_corr() nay hoạt động (behavior)

image.lens_corr() nay thực sự áp dụng tham số zoom (trước đây được phân tích nhưng không có hiệu lực), vì vậy đầu ra sẽ khác với các tập lệnh đã truyền zoom không mặc định. Hãy kiểm tra lại việc tinh chỉnh lens_corr().

Commits: d6b49adef

Danh sách kiểm tra di chuyển

Để chuyển đổi sạch sẽ sang v2.1.0, công việc thông thường là:

  1. Thay image.FREAK bằng image.ORB, bỏ tham số loại bộ mô tả, và cập nhật giải nén bộ giá trị match_descriptor() / draw_keypoints() sang đối tượng keypoints (việc làm lại ORB).

  2. Đổi tên sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() thành dạng set_auto_* (việc đổi tên hàm tự động).

  3. Chuyển mã biểu đồ tần suất/thống kê sang các phương thức đối tượng (việc làm lại biểu đồ/thống kê).

  4. Đổi tên scale= trong find_features() thành scale_factor= (việc đổi tên find_features).

  5. Dùng bộ truy cập đối tượng blob và thay find_markers() bằng find_blobs(merge=True, ...) (thay đổi find_blobs); thay img.copy_to_fb() bằng từ khóa copy_to_fb= (thay đổi copy_to_fb).

  6. Giới hạn chất lượng compress() vào 1–100 và kiểm tra lại kích thước JPEG trên OpenMV 3 (thay đổi compress); tinh chỉnh lại zoom của lens_corr() (thay đổi lens_corr).

Tất cả các tập lệnh khác chạy không thay đổi.