어떤 함수 ❓ 🤔
직선을 "검출하는" 함수입니다. 직선을 검출하는 방법으로 Hough Line Transform 알고리즘이 사용되었습니다. 이진화된 이미지(엣지 검출 데이터)를 기반으로, 픽셀 포인트가 같은 직선상에 있다는 조건을 만족하면, 직선의 속성(r, θ) 값을 반환해줍니다.
이론 편은 다음 글을 참고하세요.
HoughLines(
타겟이미지,
직선속성변수(vector<Vec2f> 타입의 어레이 변수),
r 방향변위값(경계값),
회전방향각도(경계값),
최소픽셀수(경계값),
그외 멀티스케일 변환을 위한 변수들
.
.
)
매개변수 (설명)
📌 타겟이미지 : 직선을 검출하기 위해 이미지를 지정합니다. Mat 형태의 이진화된 이미지를 입력하세요.
📌 직선속성변수(vector<Vec2f> 타입의 어레이 변수) : 검출된 Hough Line의 속성인 r, θ 값을 반환하여 저장합니다. 후 처리 작업은 이 변수를 이용해서 해줍니다. θ 값은 라디안 형태로 반환해서 입력해야 합니다.( 1° = CV_PI/180 을 곱하세요.)
📌 r 방향변위값(경계값) : 직선 검출에 사용되는 픽셀의 r방향 경계값을 지정합니다. 즉, 지정한 r 변위 값 범위 내에서 선택되는 모든 픽셀 값에 대해서 직선을 찾으러 갑니다.(이때 각도 θ는 고정값이라는 가정하에 직선을 찾기 시작할 것 같습니다.) 선택되는 픽셀을 기준으로 r 값이 부여되기 때문에, 이 값이 크면 클수록 노이즈가 증가하게 됩니다. 반면에 r 값이 작으면 작을수록 검출되는 직선의 개수는 감소하며, 정교하게 직선을 찾아낼 수 있을 것 같습니다.
📌 회전방향각도(경계값) : 직선의 회전(θ)에 따른 민감도를 설정하게 됩니다. 지정한 각도 θ값 안에 위치한 모든 픽셀에 대해서 직선 하나를 검출해 줍니다.(r 방향 변위 값과 상반되는 개념.)
예를 들어 3도를 지정했다고 하면, 한 점에 대해서 시계방향, 반시계 방향으로 3도 이내에 있는 모든 직선을 하나의 직선으로 검출합니다. 반환하는 직선의 속성은 어떤 픽셀을 대표 속성으로 결정되는지 명확하게 설명할 순 없네요. (시계방향, 반시계 방향 단순 산술 평균값? 또는 각도 범위 내 타겟이 된 복수 픽셀에 대해서 평균적인 계산으로 해주지 않았을까 하는 추측입니다.) 실제로 각도를 증가시키면서 검출되는 직선의 각도 방향 폭을 확인해보면 점점 그 폭이 작아지는 것을 확인할 수 있었습니다. (Trackbar, namedWindow를 while문에 집어넣어서 확인 완료.)
📌 최소픽셀수(경계값) : 같은 직선에 있는 최소 픽셀 수를 지정합니다. 직선 검출은 여기서 지정하는 최소 픽셀수 이상일 때만 직선의 속성을 반환해 줍니다.
공홈 링크는 다음과 같습니다.
DEMO. ( Detail Code 🔗 )
1️⃣ preProcessing(이미지 이진화, 함수 작성)
2️⃣ HoughLines 함수 사용(직선 요소 검출하고, 속성 데이터 저장)
3️⃣ 원본 이미지에 직선 그리기(함수 작성)
...
// 1. preprocessing img.
imgEdge = preProcessing(img);
// 2. Hough line Transform
// float 값 두개를 가지는 lines 벡터 변수 선언.
vector<Vec2f> lines;
HoughLines(imgEdge, lines, rho_thres, theta_thres, ptr_votes_thres);
showInformation(imgEdge, lines);
drawHoughLines(lines);
imshow("img", img);
imwrite("data/output/HoughLines_ini.png", img);
...
자세한 함수 내용은 Detail Code 링크를 참고하세요.
아래 그림에서 r 방향 변위 값과 회전 방향 경계값(θ)은 각각 1px, 1 radian을 사용했습니다. 회전 방향으로 두껍게 표시되는 부분이 있긴 하네요. 이런 부분은 파라미터를 최적화? 해서 픽셀에 의한 검출 정확도를 조절해주면 될 것 같습니다.
'[ C++ ]' 카테고리의 다른 글
[ openCV | C++ ] 기본기만 배우고 차선검출 하는 방법. (0) | 2021.04.17 |
---|---|
[ openCV | C++ ] HoughLinesP 함수 사용 방법. (+HoughLines함수와 비교) (0) | 2021.03.28 |
[ openCV | C++ ] Hough Line Transform 이론편.개념정리. (2) | 2021.03.23 |
[ openCV | C++ ] approxPolyDP 함수 사용 방법. (0) | 2021.03.17 |
[ 머신 비전 ] 자율 주행을 구현하기 위해 필요한 것들.(feat. openCV) (0) | 2021.03.15 |