OpenCV

OpenCV+Unity 마커 검출

Dean83 2022. 4. 15. 20:15

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;