image — 머신 비전¶
image 모듈은 OpenMV 머신 비전 스택의 핵심입니다. 모든 그리기, 필터링, 변환 및 특징 추출 루틴이 동작하는 대상인 메모리 내 픽셀 버퍼인 Image 클래스와 함께, 해당 루틴들이 반환하는 결과 객체들(Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) 그리고 이들을 구성하는 데 사용되는 헬퍼 클래스들(Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO)을 노출합니다.
이미지 획득¶
Image 를 RAM으로 가져오는 방법은 네 가지가 있습니다:
카메라 센서에서 실시간 캡처.
csi.CSI.snapshot()을 호출하여 다음 프레임을 프레임 버퍼로 직접 캡처합니다; 반환된Image는 해당 버퍼를 참조합니다.파일에서.
Image생성자에 경로를 전달합니다(image.Image("/sd/photo.jpg")); 디스크에서 지원되는 형식은 BMP, PPM/PGM, JPEG, PNG 및 OpenMVImageIO녹화 형식입니다.ndarray에서. float32
(h, w)또는(h, w, 3)ndarray를Image생성자에 전달합니다. 픽셀은0.0 -- 255.0범위에서 각각 GRAYSCALE 또는 RGB565 이미지로 스케일링됩니다.ml(또는 모든ulab파이프라인)의 텐서 출력을 다시 그릴 수 있는 이미지로 가져올 때 이를 사용하세요.빈 버퍼. 주어진 크기와 픽셀 형식으로
Image를 생성하여(image.Image(320, 240, image.RGB565)) 처음부터 그려 넣거나, 이미지 산술 연산을 위한 스크래치 표면으로 사용합니다.
픽셀 형식¶
모든 Image 는 다음 픽셀 형식 중 하나를 가집니다; 이 선택은 메모리, 처리 비용 및 실행 가능한 알고리즘 간의 절충을 결정합니다. 이미지를 생성하거나 카메라 센서를 구성할 때 pixformat 인수로 BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG 또는 PNG 를 사용하세요:
BINARY (1 bpp) – 픽셀당 1비트. 가장 작은 형식; 임계값 처리 및 모폴로지 루틴에서 내부적으로 사용되지만 센서에서 직접 캡처되는 경우는 드뭅니다.
GRAYSCALE (8 bpp) – 픽셀당 1바이트(YUV422의 Y 채널). 대부분의 컴퓨터 비전 알고리즘(AprilTag, 에지 검출, 옵티컬 플로우)에 가장 빠른 형식입니다.
RGB565 (16 bpp) – 픽셀당 2바이트, 5비트 빨강 / 6비트 초록 / 5비트 파랑. 기본 색상 형식입니다.
BAYER (8 bpp) – 센서에서 바로 나온 원시 Bayer 패턴 색상 데이터. 사용자 정의 디모자이크 처리나, 필요 시 디베이어 처리하기 전에 더 적은 메모리에 더 많은 픽셀을 저장하는 데 유용합니다.
YUV422 (16 bpp) – 4:2:2 크로마 서브샘플링 색상, 픽셀당 2바이트. 전체 RGB 비용을 들이지 않고 크로마 기반 알고리즘을 사용하려는 경우 유용합니다.
JPEG / PNG – 압축된 버퍼. 저장 및 네트워크 전송에 가장 적합합니다. 픽셀 단위 연산을 하려면 먼저
Image.to_grayscale()또는Image.to_rgb565()가 필요합니다.
결과 다루기¶
Image 의 검출 / 특징 추출 메서드는 반복하고 조합할 수 있는 객체를 반환합니다 – Image.find_blobs() 호출은 Blob 의 리스트를 반환하고, Image.find_apriltags() 호출은 AprilTag 의 리스트를 반환하는 식입니다. 각 결과 클래스는 검출의 기하학적 속성(중심점, 경계 상자, 면적, 코드 값 등)을 노출하므로, 이를 직접 활용하거나 그리기 메서드(Image.draw_rectangle(), Image.draw_string(), …)에 다시 전달할 수 있습니다.
색 공간 헬퍼¶
이 모듈은 또한 binary / grayscale / RGB / LAB / YUV 색 공간 사이에서 개별 픽셀 값을 변환하는 작은 순수 함수들을 노출합니다. 이는 이미지 연산에 전달하기 전에 Python에서 임계값이나 팔레트 항목을 변환해야 할 때 유용합니다 – 전체 이미지 변환에는 Image 의 to_* 메서드를 사용하세요. 이는 이 헬퍼들을 루프에서 호출하는 것보다 훨씬 빠릅니다.
클래스¶
- class Image – Image 객체
- class ImageIO – ImageIO 객체
- class HaarCascade – 특징 디스크립터
- class Similarity – Similarity 객체
- class Histogram – Histogram 객체
- class Percentile – Percentile 객체
- class Threshold – Threshold 객체
- class Statistics – Statistics 객체
- class Blob – Blob 객체
- class Line – Line 객체
- class Circle – Circle 객체
- class Rect – Rectangle 객체
- class QRCode – QRCode 객체
- class AprilTag – AprilTag 객체
- class DataMatrix – DataMatrix 객체
- class BarCode – BarCode 객체
- class Displacement – Displacement 객체
- class kptmatch – 키포인트 매치 객체
함수¶
색 공간 변환 헬퍼¶
아래의 각 X_to_Y 함수는 단일 픽셀 값 변환을 수행합니다. 모두 표준 OpenMV 범위의 값을 받고 반환합니다:
binary –
int0 – 1.grayscale –
int0 – 255.RGB – 8비트 정수의
(r, g, b)튜플(각각 0 – 255).LAB –
L은 0 – 100,A/B는 -128 – 127 범위인(l, a, b)튜플.YUV –
Y는 0 – 255,U/V는 -128 – 127 범위인(y, u, v)튜플.
전체 이미지 변환에는 Image 의 to_* 메서드를 사용하세요. 이는 이 헬퍼들을 루프에서 호출하는 것보다 훨씬 빠릅니다.
특징 디스크립터¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Haar Cascade를 로드하고
Image.find_features()와 함께 사용할Cascade핸들을 반환합니다.path는 다음 중 하나일 수 있습니다:펌웨어 ROM에 내장된 두 개의 캐스케이드 중 하나를 로드하기 위한 리터럴 문자열
"frontalface"또는"eye", 또는OpenMV 캐스케이드 변환 도구로 생성된 사용자 정의
.cascade바이너리 파일에 대한 파일 시스템 경로.
stages는 검출 시 평가할 캐스케이드 단계의 수를 선택합니다.-1은 파일에 저장된 모든 단계를 사용합니다. 이 값을 줄이면 더 많은 오탐을 대가로 검출 속도가 빨라집니다.
- image.load_descriptor(path: str) kp_desc | lbp_desc¶
path의 파일에서 디스크립터를 로드하여 반환합니다. 파일의 내부 타입 태그가 어떤 디스크립터 클래스를 재구성할지 선택합니다:ORB 키포인트 디스크립터 –
Image.find_keypoints()에 이어image.save_descriptor()로 저장됨.LBP 디스크립터 –
Image.find_lbp()에 이어image.save_descriptor()로 저장됨.
- image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None¶
descriptor(ORB 키포인트 또는 LBP 디스크립터)를 OpenMV 디스크립터 파일 형식으로path의 파일에 직렬화합니다. 동일한 파일은 나중에image.load_descriptor()를 통해 다시 로드할 수 있습니다.
- image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch¶
동일한 타입의 두 디스크립터를 매칭합니다.
두 LBP 디스크립터의 경우 – 둘 사이의 정수 Hamming 거리를 반환합니다(값이 낮을수록 더 가까운 매칭).
두 ORB 키포인트 디스크립터의 경우 – 매칭된 키포인트 클러스터를 설명하는
kptmatch를 반환하거나,threshold를 통과하는 매칭이 없으면None을 반환합니다.
threshold(0 – 100)는 키포인트 쌍을 받아들일 때 ORB 매칭이 얼마나 엄격할지를 설정합니다. 값이 낮을수록 약한 최근접 이웃 매칭을 거부하여 매칭을 더 엄격하게 만듭니다.filter_outliers는 매칭된 키포인트 집합 전반에 걸쳐 RANSAC 방식의 이상치 제거를 활성화합니다. 두 시점 사이에 단일 강체 변환이 예상될 때 사용하세요; 매칭된 키포인트가 여러 객체에 걸쳐 있을 때는 비활성화하세요.
블롭 기하 헬퍼¶
이 헬퍼들은 (Image.find_blobs() 가 반환하는) Blob 을 받아 추가적인 기하학적 속성을 필요 시 계산합니다. 이들은 Blob 이 아니라 모듈 범위에 존재하므로, 기본 find_blobs() 경로는 요청하지 않는 한 이에 대한 비용을 치르지 않습니다.
- image.get_solidity(blob: blob) float¶
blob의 견고도(blob.pixels / convex_hull_area)를 반환합니다. 0 – 1 범위의 부동소수점; 1.0은 블롭이 볼록 껍질을 완전히 채움을 의미합니다.
- image.get_convexity(blob: blob) float¶
blob의 볼록도(convex_hull_perimeter / blob.perimeter)를 반환합니다. 0 – 1 범위의 부동소수점; 1.0은 완벽하게 볼록한 블롭입니다.
- image.get_major_axis_line(blob: blob) line¶
blob의 장축(최소 면적 회전 직사각형의 두 주축 중 더 긴 것)을 따르는Line을 반환합니다.
상수¶
픽셀 형식¶
다음 중 아무거나 Image 생성자나 csi.CSI.pixformat() 에 pixformat 인수로 전달하세요.
- image.GRAYSCALE: int¶
픽셀당 8비트 grayscale(픽셀당 1바이트). 대부분의 컴퓨터 비전 알고리즘(AprilTag, 에지 검출, 옵티컬 플로우)에 가장 빠른 형식입니다.
- image.BAYER: int¶
센서에서 바로 나온 픽셀당 8비트 원시 Bayer 데이터. 대부분의 이미지 처리 메서드는 Bayer 이미지에서 사용할 수 없습니다; 필요 시 디베이어 처리하거나 더 적은 메모리에 더 많은 픽셀을 저장하려는 경우 이를 사용하세요.
- image.YUV422: int¶
4:2:2 크로마 서브샘플링 색상, 픽셀당 2바이트, 픽셀 쌍당
Y1, U, Y2, V로 패킹됨. 일부 이미지 처리 메서드만 YUV422에서 직접 동작합니다.
- image.JPEG: int¶
압축된 JPEG 버퍼. 픽셀 단위 연산을 하려면 먼저
Image.to_grayscale()또는Image.to_rgb565()가 필요합니다.
- image.PNG: int¶
압축된 PNG 버퍼. 픽셀 단위 연산을 하려면 먼저
Image.to_grayscale()또는Image.to_rgb565()가 필요합니다.
색상 팔레트¶
grayscale 이미지에 색을 입히려면 다음 중 아무거나 Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) 또는 csi.CSI.color_palette() 에 전달하세요.
- image.PALETTE_DEPTH: int¶
깊이 이미지 팔레트. 깊이 센서 지원(ToF 파이프라인 – 예: OpenMV Cam AE3 또는 ToF Pmod가 부착된 모든 카메라)이 있는 빌드에서만 사용할 수 있습니다.
- image.PALETTE_EVT_DARK: int¶
어두운 배경에서 GENX320 이벤트 카메라 프레임을 시각화하기 위한 팔레트. GENX320 드라이버가 히스토그램 모드에서 색상화된 RGB565 프레임을 출력하도록 하려면
csi.CSI.color_palette에 전달하거나, grayscale 이벤트 이미지를 색상화할 때Image.draw_image()의color_palette=에 전달하세요.GENX320 지원(OpenMV Cam AE3 및 GENX320 Pmod)이 있는 빌드에서만 사용할 수 있습니다.
- image.PALETTE_EVT_LIGHT: int¶
밝은 배경에서 GENX320 이벤트 카메라 프레임을 시각화하기 위한 팔레트.
PALETTE_EVT_DARK와 동일한 디스패치 및 가용성을 가집니다.
스케일링 모드¶
다음 중 아무거나 Image.draw_image(), Image.scale() 또는 유사한 스케일링 메서드에 hint 인수로 전달하세요.
그리기 / draw_image 힌트¶
다음 중 아무거나 비트 OR로 결합하여 Image.draw_image() 의 hint 인수로 전달하세요.
- image.EXTRACT_RGB_CHANNEL_FIRST: int¶
Image.draw_image()를 통해 RGB 채널을 추출할 때, 스케일링 전에 채널을 추출합니다. 이 힌트가 없으면 스케일링 후에 채널이 추출됩니다.
- image.APPLY_COLOR_PALETTE_FIRST: int¶
Image.draw_image()를 통해 색상 팔레트를 적용할 때, 스케일링 전에 팔레트를 적용합니다. 이 힌트가 없으면 스케일링 후에 팔레트가 적용됩니다.
JPEG 서브샘플링¶
JPEG를 쓸 때 다음 중 아무거나 Image.to_jpeg(), Image.compress() 또는 Image.save() 에 subsampling 인수로 전달하세요.
템플릿 매칭¶
다음 중 하나를 Image.find_template() 에 search 인수로 전달하세요.
에지 검출¶
다음 중 하나를 Image.find_edges() 에 algorithm 인수로 전달하세요.
- image.EDGE_SIMPLE: int¶
임계값 처리된 고역 통과 필터 에지 검출기. 더 빠르지만
EDGE_CANNY보다 더 두껍고 노이즈가 많은 에지를 생성합니다.
ORB 코너 검출기¶
다음 중 하나를 Image.find_keypoints() 에 corner_detector 인수로 전달하세요.
- image.CORNER_FAST: int¶
FAST 코너 검출기.
CORNER_AGAST보다 빠르지만 정확도가 낮습니다.
- image.CORNER_AGAST: int¶
AGAST 코너 검출기.
CORNER_FAST보다 느리지만 더 안정적인 키포인트를 생성합니다.
AprilTag 패밀리¶
다음의 조합을 비트 OR로 결합하여 Image.find_apriltags() 에 families 인수로 전달하세요. 각 패밀리는 펌웨어에서 자체 빌드 옵션으로 제어됩니다; 지원되지 않는 패밀리는 항상-0이 아니라 런타임에 부재합니다.
바코드 심볼로지¶
Image.find_barcodes() 가 반환하는 항목에 대해 BarCode.type 에 보고되는 값입니다.
- image.PDF417: int¶
PDF417 2D 적층형 바코드. 이 상수는 완전성을 위해 존재하지만, 바코드 디코더는 현재 PDF417을 구현하지 않습니다 –
Image.find_barcodes()는 이 타입의 검출을 반환하지 않습니다.