只用來記錄學習筆記
霍夫直線變換:
r=xcosθ+ysinθ
任取一個點,做0-180度(或者0-360)直線,每條直線有一個(θ,r),這樣就能繪製出如圖的曲線:
如果有三個點的(θ,r)曲線都交於一點(假設(θ=1,r=8)),那就說明三個點在一條直線上,那條直線就是相交的那個點(θ=1,r=8)所代表的直線。
cv::HoughLines(
InputArray src, // 輸入圖像,必須8-bit的灰度圖像
OutputArray lines, // 輸出的極座標來表示直線
double rho, // 生成極座標時候的像素掃描步長
double theta, //生成極座標時候的角度步長,一般取值CV_PI/180
int threshold, // 閾值,只有獲得足夠交點的極座標點才被看成是直線
double srn=0;// 是否應用多尺度的霍夫變換,如果不是設置0表示經典霍夫變換
double stn=0;//是否應用多尺度的霍夫變換,如果不是設置0表示經典霍夫變換
double min_theta=0; // 表示角度掃描範圍 0 ~180之間, 默認即可
double max_theta=CV_PI
)
代碼:
- 提取邊緣:
Canny(src, gray_src, 150, 200);
cvtColor(gray_src, dst, CV_GRAY2BGR);
提取邊緣的筆記:opencv學習筆記17-邊緣檢測-Canny算法
- 霍夫直線檢測:
vector<Vec4f> plines;
HoughLinesP(gray_src, plines, 1, CV_PI / 180.0, 10, 2, 10);
//gray_src:輸入圖像,必須8-bit的灰度圖像
//plines:輸出的極座標來表示直線
//1:生成極座標時候的像素掃描步長
//CV_PI / 180.0:生成極座標時候的角度步長,一般取值CV_PI/180
// 10:閾值,只有獲得足夠交點的極座標點才被看成是直線
//2:最小直線長度,小於2的都不能算作直線
//10:最大間隔 一條直線中允許間斷的最大像素爲10,
- 將獲得的直線顯示出來,用line函數畫直線
Scalar color = Scalar(0, 0, 255);
for (size_t i = 0; i < plines.size(); i++) {
Vec4f hline = plines[i];
line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);
}
imshow("final image", dst);
畫直線的筆記:opencv學習筆記5-劃線、矩陣、圓、橢圓等
效果圖: