Aruco 에서 미리 정의한 마커들을 검출하는 기능
1. 간략 설명
- 검출할 마커의 미리 정의한 데이터 획득
- 원본 이미지를 grayscale로 변환
- 미리 정의한 데이터와 기본 DetectorParameter 클래스 값을 이용하여 이미지에서 마커 검출
- 마커 검출은 내부적으로 AdaptiveThreshold 와 Canny를 통한 Edge를 찾는다.
- 원본 이미지 에서 마커 표시하기
- AdaptiveThreshold와 Canny로 파악한 Edge 정보를 기준으로 원본 이미지에서 마커를 표시한다.
2. 상세
- 마커 인식에 필요한 DetectorParameters 클래스 변수 생성
DetectorParameters detectorParameters = DetectorParameters.Create();
- 맴버변수들. 사실 잘 몰라도 된다. 손댈일은 잘 없을거라고 본다.
* 기본값이 더블형인 경우에는, 실제 원본 이미지의 최대 치수 값을 곱해야 기본값이 나온다.
* 최대 치수란, 가로 세로 길이중 더 긴쪽의 치수. 640*480 이미지일 경우 640이 기준값.
- AdaptiveThreshWinSizeMin : 기본값 3. binary 변환인 AdaptiveThreshold 최소값
- AdaptiveThreshWinSizeMax : 기본값 23. binary 변환인 AdaptiveThreshold 최대값
- AdaptiveThreshWinSizeStep : 기본값 10. binary 변환인 AdaptiveThreshold에서 min 에서 max 로 가는 증가단위
- AdaptiveThreshConstant : 기본값 7. AdaptiveThreshold의 상수값
- MinMarkerPerimeterRate : 기본값 0.03. 마커의 윤곽선 검출시 최소 둘레 길이 ((최대 치수에 비례)
- MaxMarkerPerimeterRate : 기본값 4.0. 마커의 윤곽선 검출시 최대 둘레 길이 (최대 치수에 비례)
- PolygonalApproxAccuracyRate : approxPolyDP의 오차값.
- MinCornerDistanceRate : 기본값 0.05. 인식된 마커의 각 코너의 최소 거리값 (최대 치수에 비례)
- MinDistanceToBorder: 기본값 3. 마커의 아무 코너와 이미지 경계선 과의 최소 거리값으로, 마커가 부분적으로
보였을 경우 인식하도록 한다. (픽셀 거리 기준)
- MinMarkerDistanceRate : 기본값 0.05. 두개의 마커가 인식되었을경우, 이 최소거리 안에 있다면, 작은 마커를
무시한다. (최대 치수에 비례)
- DoCornerRefinement : 마커 코너가 제대로 인식되지 않았을 경우, 픽셀을 추가하여 보정할것인지 여부
- CornerRefinementWinSize : 기본값 5. 코너 복원 계산에 사용될 윈도우 크기
- CornerRefinementMaxIterations : 기본값 30. 코너 복원시 반복하여 수행을 하게되는데, 작업중단 반복횟수
- CornerRefinementMinAccuracy : 기본값 0.1. 코너 복원 반복작업을 멈추기 위한 최소 에러값
- MarkerBorderBits : 기본값 1. 마커의 테두리 비트수. 값이 클수록 두꺼운 테두리로 판단. 1비트는 1픽셀로 보면됨
- PerspectiveRemovePixelPerCell : 기본값 8. 기울어진 이미지를 원근법을 통해 재조절할때 마커의 비트 수
- PerspectiveRemoveIgnoredMarginPerCell : 기본값 0.13. 각 셀의 margin (간격) 픽셀 수
- MaxErroneousBitsInBorderRate : 기본값 0.35 마커의 테두리에서 수용가능한 오류 최대치값 (35% 를 의미)
예 : 테두리에 흰색비트(255) 가 얼마나 포함되어도 되는가
- MinOtsuStdDev : 기본값 5.0. Otsu threshold 알고리즘을 수행하기 위한 최소 표준편차값.
Otsu 알고리즘은 Threshold 함수에서 type로 설정 가능.
- ErrorCorrectionRate : 기본값 6.0. 각 Dictionary에 오류 수정을 할 수 있는 최대 capability 값
- 검출할 마커의 미리 정의한 데이터 획득
- 17개의 기본 마커가 있음. 6x6은 내부 행렬 크기이다. 6x6은 36bit로 구성된다.
Dictionary dictionary = CvAruco.GetPredefinedDictionary (PredefinedDictionaryName.Dict6X6_250);
- Dictionary : 마커에 대한 정보가 들어있는 클래스
- 맴버변수 들
- BytesList : Mat 변수
- MarkerSize : 마커의 각 차원의 사이즈 (bit 수)
- MaxCorrectionBits : 수정 될 수 있는 비트의 최대 수 (?)
- IntPtr 변수도 가지고 있음.
- 이미지 Mat로 변환 및 GrayScale로 변환
Mat mat = Unity.TextureToMat (this.texture);
Mat grayMat = new Mat ();
Cv2.CvtColor (mat, grayMat, ColorConversionCodes.BGR2GRAY);
- 마커 검출
- grayscale 변환한 이미지에서, 미리 정의한 마커의 정보(Dictionary) 와 마커인식 파라메터(DetectorParameters) 를
참고하여 마커를 찾는다.
Point2f[][] corners;
int[] ids;
Point2f[][] rejectedImgPoints;
CvAruco.DetectMarkers (grayMat, dictionary, out corners, out ids, detectorParameters, out rejectedImgPoints);
- 마커 그리기
- 검출된 마커의 코너 좌표값, 마커id를 이용하여, 원본 이미지 위에 마커를 그린다. (초록색 테두리)
DrawDetectedMarkers(image, corners, ids, new Scalar(0, 255, 0));
- 화면에 표시하기
Texture2D outputTexture = Unity.MatToTexture (mat);
RawImage rawImage = gameObject.GetComponent<RawImage> ();
rawImage.texture = outputTexture;
'OpenCV' 카테고리의 다른 글
OpenCV+Unity 실시간 마커 검출 (카메라 사용) (0) | 2022.04.15 |
---|---|
OpenCV+Unity Mat에서 Texture로 변경시 유의점 (0) | 2022.04.15 |
OpenCV+Unity Gaussian, Median Blur와 Canny 내용 재정리 (0) | 2022.04.14 |
OpenCV+Unity 실시간으로 영상에 필터효과 적용하기 (0) | 2022.04.14 |
Opencv+Unity 이용하여 문서인식 앱 만들기 (0) | 2022.04.12 |