2차원 영상 좌표에서의 직선의 방정식을 파라미터 공간으로 변환하여 직선을 찾는 알고리즘
축적 배열(accumulation array)
직선의 방정식 를 사용할 때의 문제점
y축과 평행한 수직선을 표현하지 못함 -> 극좌표계 직선의 방정식을 사용
허프 변환의 파라메터들은 로, 앞선 를 로 변환시켰을 때 처럼 축, 축으로 변환해 곡선의 형태를 띠는 그래프를 만들게 된다. 이 때 겹쳐지는 한 점이 바로 일 때, 극대값을 갖는다.
void HoughLines(InputArray image, OutputArray lines,
double rho, double theta, int threshold,
double srn=0, double stn=0,
double min_theta=0, double max_theta=CV_PI);
image
: 그레이스케일 엣지 영상lines
: 직선의 파라미터(rho, theta)를 저장할 출력 벡터. vector<Vec2f>
rho
: theta
: 축적 배열에서 theta 값의 간격. 라디안 단위. ex) CV_PI/180 : 1도 간격threshold
: 축적 배열에서 직선으로 판단할 임계값srn
: 멀티스케일 허프 변환에서 rho 해상도와 rho/srn 해상도를 각각 이용하여 멀티스케일 허프 변환을 수행. srn과 stn이 모두 0이면 일반 허프 변환을 수행stn
: 멀티스케일 허프 변환에서 theta 해상도를 나누는 값min_theta
: 검출할 직선의 최소 theta 값max_theta
: 검출할 직선의 최대 theta 값void HoughLinesP(InputArray image, OutputArray lines,
double rho, double theta, int threshold,
double minLineLength=0, double maxLineGap=0);
image
: 그레이스케일 엣지 영상lines
: 선분의 시작, 끝 좌표 (x1,y1,x2,y2), 저장할 출력 벡터 vector<Vec4i>
rho
: theta
: 축적 배열에서 theta 값의 간격. 라디안 단위. ex) CV_PI/180 : 1도 간격threshold
: 축적 배열에서 직선으로 판단할 임계값minLineLength
: 검출할 선분의 최소 길이maxLineGap
: 직선으로 간주할 최대 엣지 점 간격, 중간에 끊긴 점 픽셀을 얼마까지 용인할 것인지
원의 방정식 : -> 3차원 축적 평면?
속도 향상을 위해 Hough gradient method 사용
void HoughCircles(InputArray image, OutputArray circles,
int method, double dp,
double minDist=0, double param1=100, double param2=100,
int minRadius=0, int maxRadius=0);
image
: 그레이스케일 일반 영상circles
: 원의 파라미터(cx, cy, r)를 저장할 출력 벡터. Mat (CV_32FC3
) 또는 vector<Vec3f>
method
: HOUGH_GRADIENT
또는 HOUGH_GRADIENT_ALT
지정HOUGH_GRADIENT_ALT
: OpenCV 4.3 부터 지원하며, HOUGH_GRADIENT
보다 더 좋은 성능을 나타냄dp
: 입력 영상과 축적 배열의 크기 비율1
: 동일 크기2
: 입력 영상의 가로와 세로 크기의 1/2 크기의 축적 배열 사용minDist
: 검출된 원 중심점들의 최소 거리, 동일한 원을 여러번 검출 하지 않도록 값을 잘 조정할 수 있음param1
: 케니 엣지 검출기의 큰 임계값(), 는 절반 값으로 자동 설정됨 HOUGH_GRADIENT_ALT
는 Sharr 필터를 사용하므로 Sobel 필터를 사용하는 HOUGH_GRADIENT
방법(100~200)보다 큰 임계값을 지정(300~400)param2
: 축적 배열에서 이 값보다 큰 위치의 중심점 좌표를 선택하도록 설정 HOUGH_GRADIENT
방법에서는 축적 배열 임계값HOUGH_GRADIENT_ALT
방법에서는 원의 perfectness
값 (1에 가까울수록 완벽한 원, 0.8~1.0 사이 값 지정)minRadius
: 검출할 원의 최소 반지름maxRadius
: 검출할 원의 최대 반지름
void cornerHarris(InputArray src, OutputArray dst, int blockSize,
int ksize, double k, int borderType=BORDER_DEFAULT);
src
: 입력 영상, 단일채널, 8비트 또는 실수형 영상
dst
: 해리스 코너 응답 계수 값 행렬, 입력 영상과 같은 크기, CV_32FC1
size | description |
---|---|
엣지 픽셀 | |
is small | 평탄한 영역 |
코너, local maximum 선택 |
blockSize
: 내부 연산에서 사용되는 이웃 픽셀 크기. 주변 blockSize x blockSize 이웃 픽셀을 이용
ksize
: (미분을 위한) 소벨 연산자 커널 크기
k
: 해리스 코너 검출 상수 (보통 0.04)
borderType
: 가장자리 픽셀 확장 방식
void goodFeaturesToTrack(InputArray image, OutputArray corners,
int maxCorners, double qualityLevel,
double minDistance, InputArray mask=noArray(),
int blockSize=3, bool useHarrisDetector=false,
double k=0.04);
image
: 입력 영상, 단일채널, 8비트 또는 실수형(32비트) 영상corners
: 검출된 코너점 좌표, vector<Point2f>
maxCorners
: 최대 코너 개수. maxCorners <= 0 이면 무제한 검출qualityLevel
: 코너점 결정을 위한 값. 보통 0.01~0.1 사이의 값을 지정하며, 이 값이 커질수록 더욱 엄격하게 코너를 검출함minDistance
: 코너점 사이의 최소 거리, 이보다 작은 거리에 코너들이 있을 시 하나만을 추출하도록 함mask
: 마스크 영상, 일부 영역만을 검출 가능blockSize
: 내부 연산에서 사용되는 이웃 픽셀 크기. 주변 blockSize x blockSize 이웃 픽셀을 이용useHarrisDetector
: 해리스 코너 응답 함수 사용 여부k
: 해리스 코너 응답 함수 사용 시 사용되는 파라미터void FAST(InputArray image, std::vector<KeyPoint>& keypoints,
int threshold, bool nonmaxSuppresion=true);
image
: 입력 영상, 단일채널, 8비트 또는 실수형(32비트) 영상keypoints
: 검출된 키포인트, KeyPoint 클래스의 pt 멤버(Point2f
)를 이용하여 코너 좌표에 접근 가능threshold
: 중심 픽셀 값과 주변 픽셀 값과의 차이 임계값nonmaxSuppression
: 비최대 억제 수행 여부