detectMarkers 함수를 실행한 결과, Marker 인식이 잘 안돼서

detectorParms를 조정하여 Marker를 잘 검출하고자 파라미터들을 정리해봤습니다.

 


[ Thresholding ]

 

- adaptiveThreshWinSizeMin / adaptiveThreshWinSizeMax

: minimum window size for adaptive thresholding before finding contours (default 3).

: 윤곽(contour) 검출 전 Adaptive thresholding을 적용할 최소/최대 커널 사이즈 지정

 

- adaptiveThreshWinSizeStep

: increments from adaptiveThreshWinSizeMin to adaptiveThreshWinSizeMax during the thresholding (default 10).

: Tresholding 중의 Win 사이즈의 increments

 

예) adaptiveThreshWinSizeMin=5, adaptiveThreshWinSizeMax=21, adaptiveThreshWinSizeStep = 4 일때,

 5, 9, 13, 17, 21의 window Size로 thresholding을 각각 수행하고 

각 thresholding 이미지에서 Marker의 후보들이 검출된다.

 

작은 크기의 윈도우일 때 Marker 크기가 너무 크면 Marker의 테두리가 아래 그림과 같이 깨질 수 있다.

반면, 큰 크기의 윈도우 같을 때 Marker 크기가 너무 작으면 위와 동일한 현상이 발생하며 성능이 떨어질 수 있다.

 

 

이 문제를 해결하는 가장 간단한 방법은

각 thresholding 단계에서 adaptiveThresholdMin과 adaptiveThresholdMax이 동일한 값을 사용하도록 한다.

그리고 과한 thrsholding step은 성능을 떨어뜨릴 수 있으니 Step보다는 window의 range를 조절하는 것이 더 좋다.

 

Defualt value

  • int adaptiveThreshWinSizeMin = 3, int adaptiveThreshWinSizeMax = 23,
  • int adaptiveThreshWinSizeStep = 10

 

- adaptiveThreshConstant

: thresholding operation에 추가된 constant value.(see OpenCV threshold() function for more details).

default 값이 대부분 가장 좋은 성능을 보였다.

 

Defualt value

  • int adaptiveThreshConstant = 7

 

[ Contour filtering ]

: Thresholding 후에, contour를 검출하는데 모든 contour가 marker의 후보가 되는 것은 아니다.

여러 과정을 거쳐 Marker처럼 보이지 않는 contour는 discard한다.

하지만 이 과정 중 실제 Marker contour가 discard되어 후에 detect되지 않을 수 있으니 유의해야 한다.

 

 

- minMarkerPerimeterRate / maxMarkerPerimeterRate

marker의 최소 및 최대 둘레(Periemter) 크기를 결정하는데 이들은 입력 이미지의 최대 치수에 비례하여 결정된다.

 

예) 이미지의 크기가 640x480이고 minMarkerPerimeterRate가 0.05일 때, minimum marker 둘레로 640x0.05 = 32 pixel을 가진다. 

 

minMarkerPerimeterRate이 너무 작으면 많은 contour를 추출하여 검출 성능을 떨어뜨릴 수 있다.

(maxMarkerPerimeterRate은 크게 영향을 미치지 않는다.)

minMarkerPerimeterRate=0이고 maxMarkerPerimeterRate≥4이면 영상의 모든 contour들을 검출가능할수 있지만 성능 상의 이유로 추천하지 않는다.

 

Defualt value

  • double minMarkerPerimeterRate= 0.03
  • double maxMarkerPerimeterRate= 4.0

 

- polygonalApproxAccuracyRate

 polygonal approximation이 적용되는 정사각형의 형태를 가진 후보들의 최대 오차를 결정한다.

(see approxPolyDP() function for more information).

 

pixel 단위의 candidiate 길이에 상대적인 값을 가진다.

예) candiate's perimeter =100, polygonalApproxAccuracyRate= 0.04일 때,

최대 error는 100x0.04= 5.4 pixel이다.

 

대부분 default에 정상적으로 작동하지만, 왜곡이 심한 영상의 경우 높은 값을 필요로 할 수 있다.

 

Default value

  • double polygonalApproxAccuracyRate= 0.05

 

- minCornerDistanceRate

동일한 마커의 모서리 쌍 사이의 최소 거리(= Perimeter * minCornerDistanceRate.)

 

Default value

  • double minCornerDistanceRate = 0.05

 

- minMarkerDistanceRate

서로 다른 두 마커 간의 최소 거리. 너무 가까우면 작은 후보가 무시된다.

 

Default value:

  • double minMarkerDistanceRate = 0.05

 

- minDistanceToBorder

이미지 테두리까지의 마커 모서리의 최소 거리로, 부분적으로 가려진 마커가 올바르게 감지될 수 있도록 한다.

하지만 모서리 중 하나가 가려진 경우에는 이미지 경계 근처에 잘못된 position에 코너가 배치된다.

 

Default value:

int minDistanceToBoarder= 3

 

 

[ Bits Extraction ]

candidate detection 후, candidate의 비트를 분석하여 마커인지 아닌지를 판단한다.

perspective distortion을 제거하고 Otsu 임계값을 사용하여 흑백 픽셀을 분리한다.

그리고 마커의 비트 수와 셀 수가 같은 그리드로 영상을 나눈다.

각 셀에서, 픅백 픽셀의 수는 셀에 할당된 비트 값을 결정하기 위해 함께 count된다.

이 프로세스를 사용자가 정의할 수 있는 매개변수들은 다음과 같다.

 

- markerBorderBits

마커의 boarder를 의미한다.

 

예) markerBorderBits=2 이면, 테두리의 너비가 내부 비트 2개를 갖는다.

 

이 파라미터는 현재 사용중인 마커의 테두리 크기와 일치해야 하고 테두리 크기는 마커 생성할 때 지정할 수 있다.(drawMarker())

 

Default value:

  • int markerBorderBits = 1

 

- minOtsuStdDev

Otsu 알고리즘을 수행하기 위한 최소 표준 편차를 결정한다.

편차가 낮다는 것은 모든 사각형이 검은색이라는 것으로 Otsu를 적용할 수 없다.

 

평균 값이 128보다 높거나 낮은지 여부에 따라 모든 비트가 0이나 1로 결정된다.

Default value:

  • double minOtsuStdDev = 5.0

 

- perspectiveRemovePixelPerCell

This parameter determines the number of pixels (per cell) in the obtained image after removing perspective distortion (including the border). This is the size of the red squares in the image above.

For instance, let’s assume we are dealing with markers of 5x5 bits and border size of 1 bit (see markerBorderBits). Then, the total number of cells/bits per dimension is 5 + 2*1 = 7 (the border has to be counted twice). The total number of cells is 7x7.

If the value of perspectiveRemovePixelPerCell is 10, then the size of the obtained image will be 10*7 = 70 -> 70x70 pixels.

A higher value of this parameter can improve the bits extraction process (up to some degree), however it can penalize the performance.

Default value:

  • int perspectiveRemovePixelPerCell = 4

 

작성

중.. 

https://docs.opencv.org/master/d5/dae/tutorial_aruco_detection.html