image --- thị giác máy¶
Mô-đun image là trung tâm của ngăn xếp thị giác máy OpenMV. Nó cung cấp lớp Image -- bộ đệm điểm ảnh trong bộ nhớ mà mọi quy trình vẽ, lọc, biến đổi và trích xuất đặc trưng đều hoạt động trên đó -- cùng với các đối tượng kết quả hỗ trợ được trả về bởi các quy trình đó (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, ...) và các lớp trợ giúp dùng để cấu hình chúng (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).
Lấy ảnh¶
Có bốn cách để đưa một Image vào RAM:
Chụp trực tiếp từ cảm biến camera. Gọi
csi.CSI.snapshot()để chụp khung hình tiếp theo thẳng vào bộ đệm khung hình;Imageđược trả về sẽ tham chiếu đến bộ đệm đó.Từ một tệp. Truyền đường dẫn vào hàm khởi tạo
Image(image.Image("/sd/photo.jpg")); các định dạng trên đĩa được hỗ trợ gồm BMP, PPM/PGM, JPEG, PNG và định dạng ghiImageIOcủa OpenMV.Từ một ndarray. Truyền một
ndarraykiểu float32 có hình dạng(h, w)hoặc(h, w, 3)vào hàm khởi tạoImage. Các điểm ảnh sẽ được chia tỷ lệ từ0.0 -- 255.0thành ảnh GRAYSCALE hoặc RGB565 tương ứng. Dùng cách này để đưa đầu ra tensor từml(hoặc bất kỳ pipelineulabnào) trở lại thành ảnh có thể vẽ.Bộ đệm rỗng. Khởi tạo một
Imagevới kích thước và định dạng điểm ảnh cho trước (image.Image(320, 240, image.RGB565)) để vẽ từ đầu, hoặc dùng làm bề mặt tạm thời cho các phép tính số học trên ảnh.
Định dạng điểm ảnh¶
Mỗi Image có một trong các định dạng điểm ảnh sau; việc lựa chọn sẽ đánh đổi giữa bộ nhớ, chi phí xử lý và những thuật toán có thể chạy trên đó. Dùng BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG hoặc PNG làm đối số pixformat khi khởi tạo ảnh hoặc cấu hình cảm biến camera:
BINARY (1 bpp) -- một bit trên mỗi điểm ảnh. Định dạng nhỏ nhất; được sử dụng nội bộ bởi các quy trình ngưỡng hóa và hình thái học, ít khi được chụp trực tiếp từ cảm biến.
GRAYSCALE (8 bpp) -- một byte trên mỗi điểm ảnh (kênh Y của YUV422). Định dạng nhanh nhất cho hầu hết các thuật toán thị giác máy tính (AprilTag, phát hiện cạnh, optical flow).
RGB565 (16 bpp) -- hai byte trên mỗi điểm ảnh, 5-bit đỏ / 6-bit xanh lá / 5-bit xanh dương. Định dạng màu sắc mặc định.
BAYER (8 bpp) -- dữ liệu màu sắc Bayer thô trực tiếp từ cảm biến. Hữu ích cho giải mã Bayer tùy chỉnh hoặc để lưu trữ nhiều điểm ảnh hơn trong ít bộ nhớ hơn trước khi giải mã theo yêu cầu.
YUV422 (16 bpp) -- màu sắc chroma-subsampled 4:2:2, hai byte trên mỗi điểm ảnh. Hữu ích khi bạn muốn các thuật toán đặc thù chroma mà không phải trả chi phí RGB đầy đủ.
JPEG / PNG -- bộ đệm nén. Phù hợp nhất để lưu trữ và truyền qua mạng. Các thao tác ở cấp độ điểm ảnh yêu cầu dùng
Image.to_grayscale()hoặcImage.to_rgb565()trước.
Làm việc với kết quả¶
Các phương thức phát hiện / trích xuất đặc trưng trên Image trả về các đối tượng mà bạn có thể duyệt và kết hợp -- một lệnh gọi Image.find_blobs() trả về danh sách Blob, một lệnh gọi Image.find_apriltags() trả về danh sách AprilTag, v.v. Mỗi lớp kết quả cung cấp các thuộc tính hình học của phát hiện (tâm điểm, hộp giới hạn, diện tích, giá trị mã, v.v.) để bạn có thể tác động trực tiếp lên chúng hoặc truyền chúng vào các phương thức vẽ (Image.draw_rectangle(), Image.draw_string(), ...).
Các hàm trợ giúp không gian màu¶
Mô-đun cũng cung cấp các hàm thuần túy nhỏ để chuyển đổi giá trị điểm ảnh riêng lẻ giữa các không gian màu binary / thang xám / RGB / LAB / YUV. Chúng hữu ích khi bạn cần chuyển đổi giá trị ngưỡng hoặc mục nhập bảng màu trong Python trước khi truyền vào các thao tác ảnh -- để chuyển đổi toàn bộ ảnh, hãy dùng các phương thức to_* của Image, vì chúng nhanh hơn nhiều so với việc gọi các hàm trợ giúp này trong vòng lặp.
Các lớp¶
- lớp Image -- đối tượng Image
- class ImageIO -- Đối tượng ImageIO
- lớp HaarCascade -- Bộ mô tả đặc trưng
- class Similarity -- Đối tượng Similarity
- lớp Histogram -- Đối tượng Histogram
- class Percentile -- Đối tượng Percentile
- class Threshold -- Đối tượng Threshold
- class Statistics -- Đối tượng Statistics
- lớp Blob -- đối tượng Blob
- class Line -- Đối tượng Line
- lớp Circle -- đối tượng Circle
- class Rect -- Đối tượng Rectangle
- class QRCode -- Đối tượng QRCode
- class AprilTag -- Đối tượng AprilTag
- lớp DataMatrix -- đối tượng DataMatrix
- lớp BarCode -- đối tượng BarCode
- lớp Displacement -- đối tượng Displacement
- class kptmatch -- Đối tượng khớp điểm đặc trưng
Các hàm¶
Các hàm trợ giúp chuyển đổi không gian màu¶
Mỗi hàm X_to_Y dưới đây thực hiện một phép chuyển đổi giá trị điểm ảnh đơn lẻ. Tất cả đều nhận/trả về giá trị trong phạm vi chuẩn của OpenMV:
binary --
int0 -- 1.thang xám --
int0 -- 255.RGB -- tuple
(r, g, b)gồm các số nguyên 8-bit (mỗi giá trị từ 0 -- 255).LAB -- tuple
(l, a, b)vớiLtrong khoảng 0 -- 100 vàA/Btrong khoảng -128 -- 127.YUV -- tuple
(y, u, v)vớiYtrong khoảng 0 -- 255 vàU/Vtrong khoảng -128 -- 127.
Để chuyển đổi toàn bộ ảnh, hãy dùng các phương thức to_* của Image, vì chúng nhanh hơn nhiều so với việc gọi các hàm trợ giúp này trong vòng lặp.
- image.grayscale_to_rgb(value: int) Tuple[int, int, int]¶
Chuyển đổi giá trị thang xám sang tuple RGB.
- image.grayscale_to_lab(value: int) Tuple[int, int, int]¶
Chuyển đổi giá trị thang xám sang tuple LAB.
- image.grayscale_to_yuv(value: int) Tuple[int, int, int]¶
Chuyển đổi giá trị thang xám sang tuple YUV.
- image.rgb_to_grayscale(value: Tuple[int, int, int]) int¶
Chuyển đổi tuple RGB sang giá trị thang xám.
- image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Chuyển đổi tuple RGB sang tuple LAB.
- image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Chuyển đổi tuple RGB sang tuple YUV.
- image.lab_to_grayscale(value: Tuple[int, int, int]) int¶
Chuyển đổi tuple LAB sang giá trị thang xám.
- image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Chuyển đổi tuple LAB sang tuple RGB.
- image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Chuyển đổi tuple LAB sang tuple YUV.
- image.yuv_to_grayscale(value: Tuple[int, int, int]) int¶
Chuyển đổi tuple YUV sang giá trị thang xám.
Bộ mô tả đặc trưng¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Tải một Haar Cascade và trả về một handle
Cascadeđể dùng vớiImage.find_features().pathcó thể là:chuỗi ký tự
"frontalface"hoặc"eye"để tải một trong hai cascade được tích hợp sẵn vào ROM firmware, hoặcđường dẫn filesystem đến tệp nhị phân
.cascadetùy chỉnh được tạo bởi các công cụ chuyển đổi cascade của OpenMV.
stageschọn số lượng giai đoạn cascade cần đánh giá khi phát hiện.-1sử dụng tất cả các giai đoạn được lưu trong tệp. Giảm giá trị này sẽ tăng tốc độ phát hiện nhưng có thể tăng số lượng kết quả dương tính giả.
- image.load_descriptor(path: str) kp_desc | lbp_desc¶
Tải một bộ mô tả từ tệp tại
pathvà trả về nó. Thẻ kiểu nội bộ của tệp sẽ xác định lớp bộ mô tả nào được tái tạo:Bộ mô tả điểm đặc trưng ORB -- được lưu bởi
Image.find_keypoints()theo sau bởiimage.save_descriptor().Bộ mô tả LBP -- được lưu bởi
Image.find_lbp()theo sau bởiimage.save_descriptor().
- image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None¶
Tuần tự hóa
descriptor(một bộ mô tả điểm đặc trưng ORB hoặc LBP) vào tệp tạipaththeo định dạng tệp bộ mô tả OpenMV. Tệp tương tự có thể được tải lại sau thông quaimage.load_descriptor().
- image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch¶
So khớp hai bộ mô tả cùng loại.
Với hai bộ mô tả LBP -- trả về khoảng cách Hamming nguyên giữa chúng (giá trị thấp hơn là kết quả khớp tốt hơn).
Với hai bộ mô tả điểm đặc trưng ORB -- trả về một
kptmatchmô tả cụm điểm đặc trưng đã khớp, hoặcNonenếu không có kết quả khớp nào vượt quathreshold.
threshold(0 -- 100) thiết lập mức độ chặt chẽ của việc khớp ORB khi chấp nhận một cặp điểm đặc trưng. Giá trị thấp hơn sẽ thắt chặt việc khớp bằng cách loại bỏ các kết quả khớp lân cận yếu.filter_outlierskích hoạt loại bỏ ngoại lệ theo kiểu RANSAC trên tập hợp các điểm đặc trưng đã khớp. Dùng khi bạn mong đợi một phép biến đổi cứng nhắc duy nhất giữa hai góc nhìn; tắt đi khi các điểm đặc trưng đã khớp trải rộng trên nhiều đối tượng.
Các hàm trợ giúp hình học vùng màu (blob)¶
Các hàm trợ giúp này nhận một Blob (được trả về bởi Image.find_blobs()) và tính toán các thuộc tính hình học bổ sung theo yêu cầu. Chúng nằm ở phạm vi mô-đun -- không phải trên Blob -- do đó đường dẫn find_blobs() cơ bản không phải trả chi phí cho chúng trừ khi bạn yêu cầu.
- image.get_solidity(blob: blob) float¶
Trả về độ đặc (
blob.pixels / convex_hull_area) củablob. Kiểu float, 0 -- 1; 1.0 có nghĩa là blob lấp đầy hoàn toàn vỏ lồi của nó.
- image.get_convexity(blob: blob) float¶
Trả về độ lồi (
convex_hull_perimeter / blob.perimeter) củablob. Kiểu float, 0 -- 1; 1.0 là một blob lồi hoàn hảo.
- image.get_major_axis_line(blob: blob) line¶
Trả về một
Linedọc theo trục chính củablob(trục dài hơn trong hai trục chính của hình chữ nhật xoay diện tích nhỏ nhất).
- image.get_minor_axis_line(blob: blob) line¶
Trả về một
Linedọc theo trục phụ củablob(trục ngắn hơn trong hai trục chính của hình chữ nhật xoay diện tích nhỏ nhất).
- image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]¶
Trả về một tuple 5 phần tử
(cx, cy, a, b, rotation)mô tả hình elip nội tiếp trong hình chữ nhật xoay diện tích nhỏ nhất bao quanhblob:cx/cy-- tâm hình elip tính bằng điểm ảnh (số nguyên).a/b-- độ dài bán trục tính bằng điểm ảnh (số nguyên).rotation-- góc xoay hình elip tính bằng độ (số nguyên).
Đây là một tuple thông thường, không phải attrtuple, vì vậy các trường chỉ có thể truy cập theo chỉ số.
Hằng số¶
Định dạng điểm ảnh¶
Truyền bất kỳ giá trị nào sau đây làm đối số pixformat cho hàm khởi tạo Image hoặc cho csi.CSI.pixformat().
- image.BINARY: int¶
Bitmap 1-bit-trên-mỗi-điểm-ảnh. Định dạng nhỏ nhất -- được sử dụng nội bộ bởi ngưỡng hóa và hình thái học, hiếm khi được chụp trực tiếp từ cảm biến.
- image.GRAYSCALE: int¶
Thang xám 8-bit-trên-mỗi-điểm-ảnh (một byte trên mỗi điểm ảnh). Định dạng nhanh nhất cho hầu hết các thuật toán thị giác máy tính (AprilTag, phát hiện cạnh, optical flow).
- image.RGB565: int¶
Màu sắc 16-bit-trên-mỗi-điểm-ảnh được đóng gói thành 5 bit đỏ / 6 bit xanh lá / 5 bit xanh dương. Định dạng màu sắc mặc định.
- image.BAYER: int¶
Dữ liệu Bayer thô 8-bit-trên-mỗi-điểm-ảnh trực tiếp từ cảm biến. Hầu hết các phương thức xử lý ảnh không khả dụng trên ảnh Bayer; dùng định dạng này khi bạn muốn giải mã Bayer theo yêu cầu hoặc lưu trữ nhiều điểm ảnh hơn trong ít bộ nhớ hơn.
- image.YUV422: int¶
Màu sắc chroma-subsampled 4:2:2, hai byte trên mỗi điểm ảnh, được đóng gói dạng
Y1, U, Y2, Vcho mỗi cặp điểm ảnh. Chỉ một số phương thức xử lý ảnh hoạt động trực tiếp trên YUV422.
- image.JPEG: int¶
Bộ đệm JPEG nén. Các thao tác ở cấp độ điểm ảnh yêu cầu dùng
Image.to_grayscale()hoặcImage.to_rgb565()trước.
- image.PNG: int¶
Bộ đệm PNG nén. Các thao tác ở cấp độ điểm ảnh yêu cầu dùng
Image.to_grayscale()hoặcImage.to_rgb565()trước.
Bảng màu¶
Truyền bất kỳ giá trị nào sau đây cho Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) hoặc cho csi.CSI.color_palette() để tô màu một ảnh thang xám.
- image.PALETTE_IRONBOW: int¶
Bảng màu "ironbow" phi tuyến tính mô phỏng giao diện kính ngắm nhiệt FLIR Lepton.
- image.PALETTE_DEPTH: int¶
Bảng màu cho ảnh độ sâu. Chỉ khả dụng trên các bản build có hỗ trợ cảm biến độ sâu (pipeline ToF -- ví dụ: OpenMV Cam AE3 hoặc bất kỳ cam nào có ToF Pmod được gắn vào).
- image.PALETTE_EVT_DARK: int¶
Bảng màu để hiển thị khung hình từ event-camera GENX320 trên nền tối. Truyền vào
csi.CSI.color_paletteđể driver GENX320 phát ra các khung hình RGB565 có tô màu ở chế độ biểu đồ tần suất, hoặc truyền vàocolor_palette=củaImage.draw_image()khi tô màu cho ảnh thang xám từ event.Chỉ khả dụng trên các bản build có hỗ trợ GENX320 (OpenMV Cam AE3 và GENX320 Pmod).
- image.PALETTE_EVT_LIGHT: int¶
Bảng màu để hiển thị khung hình từ event-camera GENX320 trên nền sáng. Cách điều phối và tính khả dụng giống như
PALETTE_EVT_DARK.
Chế độ chia tỷ lệ¶
Truyền bất kỳ giá trị nào sau đây làm đối số hint cho Image.draw_image(), Image.scale(), hoặc các phương thức chia tỷ lệ tương tự.
Gợi ý vẽ / draw_image¶
Dùng phép OR bit với bất kỳ giá trị nào trong số này và truyền làm đối số hint của Image.draw_image().
- image.CENTER: int¶
Căn giữa nguồn trên đích. Các offset x/y tường minh sau đó trở thành offset từ tâm thay vì từ góc trên bên trái.
- image.EXTRACT_RGB_CHANNEL_FIRST: int¶
Khi trích xuất kênh RGB thông qua
Image.draw_image(), trích xuất kênh trước khi chia tỷ lệ. Nếu không có gợi ý này, kênh sẽ được trích xuất sau khi chia tỷ lệ.
- image.APPLY_COLOR_PALETTE_FIRST: int¶
Khi áp dụng bảng màu thông qua
Image.draw_image(), áp dụng bảng màu trước khi chia tỷ lệ. Nếu không có gợi ý này, bảng màu sẽ được áp dụng sau khi chia tỷ lệ.
- image.SCALE_ASPECT_KEEP: int¶
Chia tỷ lệ nguồn để vừa vặn bên trong đích trong khi duy trì tỷ lệ khung hình (letterbox khi tỷ lệ khác nhau).
- image.SCALE_ASPECT_EXPAND: int¶
Chia tỷ lệ nguồn để lấp đầy đích trong khi duy trì tỷ lệ khung hình (cắt xén khi tỷ lệ khác nhau).
Lấy mẫu phụ JPEG¶
Truyền bất kỳ giá trị nào sau đây làm đối số subsampling cho Image.to_jpeg(), Image.compress(), hoặc Image.save() khi ghi JPEG.
So khớp mẫu¶
Truyền một trong các giá trị sau làm đối số search cho Image.find_template().
Phát hiện cạnh¶
Truyền một trong các giá trị sau làm đối số algorithm cho Image.find_edges().
- image.EDGE_CANNY: int¶
Bộ phát hiện cạnh Canny -- độ lớn gradient + non-max suppression + hysteresis. Chất lượng cao hơn, chậm hơn.
- image.EDGE_SIMPLE: int¶
Bộ phát hiện cạnh lọc thông cao có ngưỡng. Nhanh hơn nhưng tạo ra các cạnh dày hơn và nhiễu hơn so với
EDGE_CANNY.
Bộ phát hiện góc ORB¶
Truyền một trong các giá trị sau làm đối số corner_detector cho Image.find_keypoints().
- image.CORNER_FAST: int¶
Bộ phát hiện góc FAST. Nhanh hơn
CORNER_AGASTnhưng kém chính xác hơn.
- image.CORNER_AGAST: int¶
Bộ phát hiện góc AGAST. Chậm hơn
CORNER_FASTnhưng tạo ra các điểm đặc trưng ổn định hơn.
Các họ AprilTag¶
Dùng phép OR bit với bất kỳ tổ hợp nào trong số sau và truyền làm đối số families cho Image.find_apriltags(). Mỗi họ được kiểm soát bởi tùy chọn build riêng trong firmware; các họ không được hỗ trợ sẽ vắng mặt lúc chạy thay vì luôn bằng không.
Các ký hiệu mã vạch¶
Các giá trị được báo cáo trong BarCode.type cho các mục được trả về bởi Image.find_barcodes().
- image.PDF417: int¶
Mã vạch 2D PDF417 dạng xếp chồng. Hằng số tồn tại để đầy đủ, nhưng bộ giải mã mã vạch hiện chưa triển khai PDF417 --
Image.find_barcodes()sẽ không trả về phát hiện loại này.