v2.1.0

v2.1.0은 대규모 API 현대화 릴리스입니다. FREAK 키포인트 디스크립터를 ORB로 교체하고, find_blobs() / 히스토그램 / 통계를 객체 기반 API로 재작업하며, sensor의 자동 노출/게인/화이트밸런스 함수의 이름을 변경하고, QR 코드 검출과 OV7725 렌즈 보정을 추가하며, 초기 OpenMV Cam M7 보드를 브링업합니다. 많은 API가 변경되었습니다 — 아래의 호환성 변경 사항을 읽어보세요.

주요 사항

  • ORB 키포인트 — FREAK 디스크립터가 ORB로 교체되었습니다(find_keypoints() / match_descriptor() 재작업).

  • 객체 APIfind_blobs(), get_histogram(), get_statistics()가 이제 명명된 접근자를 가진 객체를 반환합니다.

  • QR 코드image.find_qrcodes() 검출이 추가되었습니다.

  • OpenMV Cam M7 — 초기 보드 지원.

  • Sensorset_auto_whitebal() / set_auto_gain() / set_auto_exposure()(이름 변경됨)와 set_lens_correction().

  • 호환성: 키포인트/디스크립터, 블롭/히스토그램/통계, 센서 자동 함수, 그 외 여러 API가 변경되었습니다 — 호환성 변경 사항을 참조하세요.

새로운 기능

  • OpenMV Cam M7 — 초기 OpenMV 3(M7) 보드 지원을 추가했습니다.

  • QR 코드qrcodes.py 예제와 함께 image.find_qrcodes()를 추가했습니다.

  • ORB 키포인트 — 새로운 ORB 디스크립터 시스템: corner_detector 인자(CORNER_FAST / CORNER_AGAST), max_keypoints / scale_factor를 갖춘 find_keypoints(); filter_outliers 키워드와 회전 추정치를 갖춘 match_descriptor(); 키포인트 저장/로드.

  • 객체 APIimage.get_histogram() / get_statistics() / get_percentile()가 히스토그램/통계 객체를 반환합니다; find_blobs()area_threshold / pixels_threshold / merge / margin / invertx_stride / y_stride를 갖춘 블롭 객체(rect() / cx() / cy() / code() / area() / pixels())를 반환합니다.

  • Sensor — OV7725 렌즈 셰이딩을 위한 sensor.set_lens_correction(enable, radi, coef)를 추가했습니다, sensor.set_windowing()이 이제 (w, h) 튜플도 받습니다(자동 중앙 정렬), 그리고 image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

  • 색상 추적, Arduino SPI/I2C 슬레이브, 키포인트, 히스토그램/통계 예제 스크립트를 추가했습니다.

기타 변경 및 개선 사항

  • IDE가 이제 실행 중인 main.py를 인터럽트할 수 있습니다; 더 빠른 find_blobs() / find_qrcodes() / get_statistics(); ORB는 popcount 해밍 거리를 사용합니다; 렌즈 보정이 RAM을 더 적게 사용합니다; Linux udev 규칙이 ModemManager가 시리얼 포트를 점유하는 것을 막습니다.

버그 수정

카메라 및 이미징:

  • M7 DMA 캐시 클린/무효화(프레임 손상), 각 프레임 끝의 가짜 추가 라인, JPEG 프레임버퍼 오버플로 경계, compress() 실패 시 프레임버퍼 해제, ORB 정확도 / ROI / 빈 집합 처리, 그리고 load_image(copy_to_fb=True) 지오메트리를 수정했습니다.

시스템:

  • F7 ADC 지원, OV7725 레지스터 이름, 부트로더/USB 타이밍을 수정하고, 스냅샷을 기다리는 동안 WFI를 사용했으며, MJPEG 스트리머 예제를 클라이언트별 타임아웃을 갖춘 논블로킹 방식으로 만들었습니다.

하드웨어 및 보드 지원

  • OpenMV Cam M7 (OpenMV 3) — 초기 보드 지원.

  • OV7725 — 렌즈 보정(셰이딩) 지원.

호환성을 깨는 API 변경

v2.0.0과 v2.1.0 사이의 사용자에게 보이는 API 변경 사항입니다. 범위: modules/의 Python C 모듈과 scripts/libraries/의 Python 라이브러리.

각 변경 사항에는 영향도가 태그로 표시되어 있습니다:

  • major — 해당 기능을 사용한 대부분의 스크립트에 영향을 줍니다; 코드를 포팅해야 합니다.

  • minor — 좁은 API; 이를 사용한 스크립트에만 영향을 줍니다.

  • behavior — 동일한 API, 다른 결과; 조정된 스크립트를 다시 확인하세요.

변경 사항은 그 순서대로 영향도별로 분류되어 있습니다. 코드를 포팅하기만 하면 된다면, 끝부분의 마이그레이션 체크리스트로 건너뛰세요. 각 커밋 해시는 GitHub의 해당 diff로 연결됩니다.

FREAK가 ORB로 교체됨; 디스크립터 API 재작업 (major)

FREAK 키포인트 디스크립터가 제거되고 ORB로 교체되었습니다: image.FREAK는 더 이상 존재하지 않습니다(image.ORB를 사용하세요). image.match_descriptor() / save_descriptor() / load_descriptor()는 더 이상 선두의 디스크립터 타입 인자를 받지 않으며(객체로부터 추론됨), match_descriptor()는 이제 8개 요소 튜플 (cx, cy, x, y, w, h, match_count, rotation)을 반환하고(마지막 요소는 백분율이 아닌 원시 개수임), draw_keypoints()는 원시 (x, y, angle) 리스트 대신 키포인트 객체를 요구합니다. find_keypoints()는 변경된 기본값과 함께 corner_detector / max_keypoints / scale_factor를 추가했습니다.

커밋: e2d0c4840, bba8e5a9e, 6000684cb

센서 자동 함수 이름 변경 (major)

sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl()sensor.set_auto_whitebal() / set_auto_gain() / set_auto_exposure()로 이름이 변경되었습니다(기존 이름은 제거됨). 각 함수는 자동 대신 수동 값을 설정하기 위한 선택적 value= 키워드를 추가했습니다.

커밋: 1b22a2961

히스토그램 / 통계가 객체 API로 재작업됨 (major)

히스토그램/통계 인터페이스가 히스토그램/통계 객체를 반환하는 객체 기반 image.get_histogram() / get_statistics() / get_percentile()로 재작업되었습니다. 기존의 평면적인 히스토그램/통계 결과와 bin_count / l_bin_count / a_bin_count / b_bin_count 메서드는 제거되었습니다(len(histogram.bins()) 등을 사용하세요).

커밋: 011108412, 9f37c83de

find_features()scale 이름 변경 (major)

image.find_features()(Haar)가 scale= 키워드를 scale_factor=로 이름 변경했습니다. find_features(cascade, scale=...) 호출을 scale_factor=...로 갱신하세요.

커밋: 96e4f770c

find_blobs()가 객체를 반환함; find_markers() 제거됨 (minor)

image.find_blobs()가 이제 명명된 접근자를 가진 블롭 객체를 반환하며(하위 호환성을 위해 인덱스 접근도 여전히 동작함), image.find_markers()는 제거되었습니다 — 대신 find_blobs(..., merge=True, margin=...)를 사용하세요. 고급 색상 블롭 필터 콜백은 더 이상 지원되지 않습니다.

커밋: af15ec6eb

img.copy_to_fb()가 교체됨 (minor)

img.copy_to_fb() 메서드가 image.Image / load_image()copy_to_fb= 키워드로 교체되었습니다. 큰 이미지를 프레임버퍼로 바로 로드하려면 image.Image(path, copy_to_fb=True)를 사용하세요.

커밋: 1645ab94b

compress()가 범위를 벗어난 품질을 거부함 (behavior)

image.compress() / compressed()는 이제 quality가 1–100 범위를 벗어나면 조용히 클램프하는 대신 오류를 발생시킵니다. 호출하기 전에 quality를 1–100으로 클램프하세요. 별도로, OpenMV 3 JPEG 버퍼가 64 KB에서 23000 바이트로 줄어들었으므로, 큰 프레임은 이제 메모리 부족을 일으킬 수 있습니다 — JPEG 품질이나 프레임 크기를 낮추세요.

커밋: 9efd7474a, 9a7c3defc

lens_corr() 줌이 이제 작동함 (behavior)

image.lens_corr()가 이제 실제로 zoom 인자를 적용합니다(이전에는 파싱되었지만 효과가 없었음). 따라서 기본값이 아닌 줌을 전달한 스크립트는 출력이 달라집니다. lens_corr() 튜닝을 다시 확인하세요.

커밋: d6b49adef

마이그레이션 체크리스트

v2.1.0으로 깔끔하게 포팅하려면 일반적으로 다음 작업이 필요합니다:

  1. image.FREAKimage.ORB로 교체하고, 디스크립터 타입 인자를 제거하며, match_descriptor() 튜플 언패킹 / draw_keypoints()를 키포인트 객체에 맞게 갱신하세요 (ORB 재작업).

  2. sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl()set_auto_* 형태로 이름 변경하세요 (자동 함수 이름 변경).

  3. 히스토그램/통계 코드를 객체 메서드로 옮기세요 (히스토그램/통계 재작업).

  4. find_features()scale=scale_factor=로 이름 변경하세요 (find_features 이름 변경).

  5. 블롭 객체 접근자를 사용하고 find_markers()find_blobs(merge=True, ...)로 교체하세요 (find_blobs 변경); img.copy_to_fb()copy_to_fb= 키워드로 교체하세요 (copy_to_fb 변경).

  6. compress() 품질을 1–100으로 클램프하고 OpenMV 3에서 JPEG 크기를 다시 확인하세요 (compress 변경); lens_corr() 줌을 재조정하세요 (lens_corr 변경).

그 외 모든 스크립트는 변경 없이 실행됩니다.