내맘대로 공부기록.

[ C++ ]

[ openCV | C++ ] approxPolyDP 함수 사용 방법.

fwanggus 2021. 3. 17. 23:49

어떤 함수  🤔 

"형상을 근사" 하는 함수입니다. 검출된 형상(외곽선)을 표현하기 위해, 점 데이터가 사용되어지는데요. 그 데이터 수를 수많은 어레이 점 데이터에서,  보다 적은 점으로 커브 또는 다각형 형상을 표현할 수 있게 됩니다. 

조금 더 쉽게 풀어 얘기하면, 사각형 물체의 컨투어(외곽선)를 점 20개로 세밀하게 표현했다고 합시다. 하지만 우리는 사실 사각형(다각형)을 표현하기 위해 꼭지점 네 점만 있으면 되죠. 즉, 사각형(특정 형상)을 표현하기 위한 최소 데이터를 20에서 4개로 근사화 했다 ! 라고 하는 작업을 해주는 함수입니다. 

(근사 정확도 설정에 따라서, 커브 또는 점 데이터 갯수는 변경될 수 있습니다.)

 

  approxPolyDP(
    	컨투어 포인트 어레이,
        근사된 포인트 어레이,
        근사 정확도,
        근사 커브의 개폐여부설정
        )

 

매개변수 (설명)

 

☑️  필요한 사전작업 : findContours() 함수

 

🔑  컨투어 포인트 어레이 : 컨투어를 구성하는 포인트 어레이의 어레이 입니다. 한 이미지 프레임에서 검출된 각각(복수)의 컨투어를 구성하는 점 데이터를  의미합니다. findContours()에서 반환되는 컨투어 어레이 값이 바로 이 값입니다. 변수의 타입은 다음과 같습니다. 어레이의 어레이.

    vector<vector<Point>>

 

🔑  근사된 포인트 어레이 : 보다 적은 수로 근사된 포인트 어레이의 어레이입니다. 위에서 입력된 컨투어 포인트 어레이 사이즈와 같아야 하겠죠. 왜냐하면, 한 이미지 프레임에 3개의 물체가 검출 되면, 근사화되는 물체의 컨투어도 3개 이기 때문입니다. 각 컨투어를 표현하는 점 데이터 수는 줄어듭니다. 하지만 근사 작업을 하는 컨투어 대상의 수는 같아야 합니다. 간단하죠.

 

🔑  근사 정확도 : 근사 정확도를 정의합니다. double 타입 변수이며 작은 수 일수록 원래 컨투어 형상과 비슷한 방향으로 근사합니다(정확도 상승). 정확하게 근사한다는 것은 보다 많은 점 또는 커브를 사용하게 된다는 말과 일맥상통합니다. 예를 들어, 원 형상을 갖는 물체를 검출하는 경우, 그 형상을 표현하기 위해 5개 커브보다는 10개 커브를 가지는 다각형이 그 정확도가 높겠죠. 그런 의미로 사용되는 부분입니다.

(자세한 부분은 DEMO . 이후 확인 할 수 있습니다.)

 

🔑  근사 커브의 개폐여부설정 : fisrt Point, Last Point를 이어줄지 아닐지를 지정합니다. boolean 타입의 변수이며, True 이면, 커브는 닫힘 상태가 됩니다.

 

공홈 링크는 다음과 같습니다.

 

OpenCV: Structural Analysis and Shape Descriptors

lineOutput line parameters. In case of 2D fitting, it should be a vector of 4 elements (like Vec4f) - (vx, vy, x0, y0), where (vx, vy) is a normalized vector collinear to the line and (x0, y0) is a point on the line. In case of 3D fitting, it should be a v

docs.opencv.org

 

DEMO. ( Detail Code 🔗 )

 

    ...
    
    for (int i = 0; i < contours.size(); i++)
    {

    ...
    
    	approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true);
    
    	if (conPoly[i].size() == 4)
    	{
        	drawContours(img, conPoly, i, Scalar(255, 0, 255), 20);
    	}
    
    ...

 

 

다음 그림은 근사 정확도에 따라 원 도형을 어떻게 근사하는지 보여줍니다. 먼저 그림 우측 하단에 있는 빨간 원 도형에 대해서 mask 작업을 진행합니다.

좌 : 원본, 우 : 마스크 적용(붉은색 원형)

 

approxPolyDP 함수 세 번째 인수인 '근사 정확도' 값을 변경 함에 따라 원 도형을 근사하는 커브 갯수에서 차이가 나는 것을 확인할 수 있습니다. 근사 정확도는 이런 개념으로 이해하면 될 것 같습니다.

            approxPolyDP(contours[i], conPoly[i], 0.01 * peri, true);

좌 : x0.06(가장 낮음), 중앙 : x0.02, 우 : x0.01(가장 정확)

 

반응형