1. 程式人生 > >OpenCV(C++) 基礎(四)-- 邊緣檢測與霍夫變換

OpenCV(C++) 基礎(四)-- 邊緣檢測與霍夫變換

1. 邊緣檢測

Sobel():靈活調整水平或者垂直邊緣檢測,基於高斯平滑和微分求導

void Sobel(src, dst, depth, dx, dy, ksize=3);
// depth: 對應影象型別
// dx, dy: x,y方向的差分階數,控制在x,y軸上的邊緣檢測程度
// case:
Sobel(src, dst, CV_16S, 0, 1, 3);

Canny(): 低錯誤率+高定位性+最小響應

void Canny(src, dst, threshold_1, threshold_2, apertureSize=3);
// threshold_1, threshold_2: 較大的值用於控制強邊緣連線,較小的值用與控制弱邊緣連線
// apertureSize: Sobel運算元的孔徑大小
// case:
Canny(src, edge, 3, 9, 3);

Laplacian():原圖減去其Laplacian運算元可以增強對比度

void Laplacian(src, dst, depth, ksize=1, double scale=1, 
               double delta=0, borderType=BORDER_DEFAULT);
// scale: 縮放因子
// case: 後面三個引數為預設引數
Laplacian(src, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);

scharr濾波器:

void Scharr(src, dst, depth, dx, dy, scale=1, delta=1, borderType=BORDER_DEFAULT);
// case:
Scharr(src, dst, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);

2.霍夫變換

用於檢測直線 / 曲線 / 圓

標準霍夫變換(檢測直線) HoughLines():

void HoughLines(src, dst, double rho, double theta, threshold, double srn=0, double stn=0);
// rho: 直線搜尋尺寸的單位半徑
// theta: 角度精度,以弧度為單位
// thresold: 判定為直線所需的累加直線值
// srn / stn: 預設為0,適用於多尺度霍夫變換
// case: 繪製直線
vector<Vec2f>lines;
HoughLines(src, dst, 1, CV_PI/180, 150, 0, 0);
for(size_t i=0; i<lines.size(); i++){
    float rho = lines[i][0], theta = lines[i][1];
    Point pt1, pt2;
    double a = cos(theta), b = sin(theta);
    double x0 = a*rho, y0 = b*rho;
    pt1.x = cvRound(x0 + 1000*(-b));
    pt1.y = cvRound(y0 + 1000*a);
    pt2.x = cvRound(x0 - 1000*(-b));
    pt2.y = cvRound(y0 - 1000*a);
    line(dst, pt1, pt2, Scalar(255,255, 0), 1, LINE_AA);
}

累計概率霍夫變換 HoughLinesP():

void HoughLinesP(src, dst, rho, theta, threshold, minLineLength=0, maxLineGap=0);
// minLineLength: 最短線段長度
// maxLineGap: 線段最短斷裂距離
// case:
HoughLinesP(src, dst, 1, CV_PI/180, 80, 50, 10);

霍夫圓變換 HoughCircles():檢測灰度圖中的圓

void HoughCircles(src, dst, method, dp, minDist, 
                  param1=100, param2=100, minRadius=0, maxRadius=0);
// method: 檢測方法,目前可用 HOUGH_GRADIENT
// dp: 用於檢測圓心的累加器影象的解析度與輸入影象之比的倒數,
// dp=1則解析度相同,dp=2則累加器有輸入影象的一半的寬高
// param1:method的對應引數,傳遞給Canny運算元的高低閾值
// param2: method的對應引數,越大則檢測的圓更接近完美,否則檢測出越多不完美的圓
// minRadius / maxRadius: 檢測出的圓半徑的最大最小值
// case:
HoughCircles(src, dst, HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);