내맘대로 공부기록.

[ C++ ]

[ openCV | C++ ] HoughLinesP 함수 사용 방법. (+HoughLines함수와 비교)

fwanggus 2021. 3. 28. 16:49
반응형

어떤 함수  🤔 

직선을 추출하는 개념으로는 HoughLines과 같습니다. 하지만 이 함수에서는 확률적인 방법으로 접근하는데요. 구체적으로 말하자면 직선 속성을 추출하기 위해 픽셀을 랜덤 하게 선택하는 거죠.(기본 허프 변환에서는 모든 픽셀에 대한 알고리즘 검사를 하게 되기 때문에, 계산에 대한 비용이 매우 큽니다.) 그래서 기본 HoughLines 함수에다가 P(Probabilistic, 확률적인.)만 덧붙이는 형태로 구분됩니다. 간단하게 Probabilistic Hough transform 알고리즘을 써서 직선을 검출하는 겁니다. 알고리즘에 대한 공부는 각자 해보도록 합시다.

 

HoughLinesP(
	타겟이미지,
	직선속성변수(vector<Vec4i> 타입의 어레이 변수),
	r 방향변위값(경계값),
	회전방향각도(경계값),
	최소픽셀수(경계값),
	직선최소길이,
	픽셀간허용최대갭(동일직선상)
)

 

매개변수 (설명)

📌 타겟이미지 : 직선을 검출하기 위해 이미지를 지정합니다. Mat 형태의 이진화된 이미지를 입력하세요.

 

📌 직선 속성 변수(vector<Vec4i> 타입의 어레이 변수) : 검출된 직선의 양끝 점 좌표를 반환합니다. (x1, y1, x2, y2)의 벡터 형태로 좌표값을 반환합니다. 좌표값의 형태는 integer, float 형태 둘 다 가능한 것 같습니다.

 

📌 r 방향변위값(경계값) : 직선 검출에 사용되는 픽셀의 r방향 경계값을 지정합니다. 즉, 지정한 r변위 값 범위 내의 픽셀에서 직선을 찾으러 갑니다.

 

📌 회전방향각도(경계값) : 위의 r방향 경계값과 같은 개념으로, 직선의 회전(θ)에 따른 민감도를 설정하게 됩니다. θ값 역시 지정한 각도보다 작은 범위에서 직선을 검출할 수 있습니다.

 

📌 최소픽셀수(경계값) : 같은 직선에 있는 최소 픽셀 수를 지정합니다. 직선 검출은 여기서 지정하는 최소 픽셀 수 이상일 때만 직선의 속성을 반환해 줍니다.

 

📌 직선 최소 길이 : 검출된 직선 길이가 지정한 최소 길이보다 작을 경우, 직선은 검출되지 않습니다.

 

📌 픽셀 간 허용 최대 갭(동일 직선상) : 픽셀 간 최대 갭(gap) 경계값을 지정합니다. 이웃하는 픽셀 간 거리가 최대 허용 갭보다 크게 되면, 인지하지 못하게 됩니다.

 

 

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

 

OpenCV: Feature Detection

corners=cv.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]]) corners=cv.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance, mask, blockSize, gradientSize[, corners[, us

docs.opencv.org

 

DEMO. ( Detail Code 🔗 )

일반 허프 변환 함수와 비교하기 위해 같은 형상으로 진행했습니다.

    ...
    
    vector<Vec4i> linePoints;
    while(true){
    
    ...

        /* 1. preprocessing img. */
        imgEdge = preProcessing(img);

        /* 2. Probabilistic Hough line Transform

         1 unit parameter converts for HoughlinesP function.*/
        double rho_px = double(rho_unit) / 5;
        double theta_radian = (double(theta_degree_unit) / 10) * toRadian;

        HoughLinesP(imgEdge, linePoints, rho_px, theta_radian, ptr_votes_thres, minLineLen, maxGap);
        showCurrentParmas(rho_px, theta_radian, ptr_votes_thres, minLineLen, maxGap);
        drawHoughLinesP(linePoints);
				
    ...
    
    }

 

HoughLinesP 함수 파라미터를 변경하면서, 직선 검출 결과를 파악하기 위해 트랙 바를 이용하였습니다. 아래와 같이 5개 파라미터에 대해서 트랙 바를 생성하고 조금씩 조절해가면서, 직선 검출을(리얼타임으로) 확인합니다. 사실 이 형상에 대해서는, 노이즈가 크게 없기 때문에 큰 의미는 없었습니다. 실제 도로 이미지 또는 영상을 이용할 경우에는 효과적으로 사용할 수 있지 않을까 하는 생각이 듭니다.

 

검출에 사용한 원본 이미지

 

좌:캐니 엣지 검출, 우:HoughLinesP 함수적용 후 직선 그린 결과, 하단:트랙바를 이용해서, 직선을 찾아주는 파라미터를 리얼타임(?)으로 찾아감.

 

HoughLines 함수(일반형태)와 다른 점 비교.

구분 HoughLines(일반형태 함수) HoughLinesP
개념적 모든 픽셀을 검사 확률적으로 픽셀을 검사(랜덤)
함수형태 기본 기본+인수 2개 추가 (직선의 경계조건 추가 설정)
직선 속성 반환값 r, θ : Hough 도메인 속성 값 P1, P2 : 직선의 양끝 포인트 좌표
직선 유형 무한 직선 유한 직선

결국 직선 속성 반환값이 가장 중요한 요소로 작용할 것 같습니다. 쉽게 말해서 일반형태의 함수에서는 직선의 기울기와 y절편과 같은 개념으로 정보를 제공합니다. 그렇기 때문에 사용자가 직선의 시점과 종점(양 끝단)을 직접적으로 정해줘야 하는 번거로움이 있게되죠.

반면에 HoughLinesP 함수를 사용할 경우, 직선의 시점과 종점의 좌표데이터를 직접적으로 반환해주기 때문에 사용자로써는 매우 편리하고 빠르게 사용할 수 있는 장점이 있는 것 같습니다. 무한 직선(Infinite Line)과 유한 직선(Finite Line)으로써 그 유형을 구분하는 것도 가능할 것 같네요.

 

HoughLines 함수(일반형태)는 아래를 참고 부탁드립니다.

 

[ openCV | C++ ] HoughLines 함수 사용 방법. (차선 검출 준비단계)

어떤 함수 ❓ 🤔 직선을 "검출하는" 함수입니다. 직선을 검출하는 방법으로 Hough Line Transform 알고리즘이 사용되었습니다. 이진화된 이미지(엣지 검출 데이터)를 기반으로, 픽셀 포인트가 같은

fwanggu-lee.tistory.com

반응형