OpenCV學習代碼記錄——Hough線段檢測
阿新 • • 發佈:2018-04-05
point -m ann art uri 失敗 pen detection 讀取
很久之前學習過一段時間的OpenCV,當時沒有做什麽筆記,但是代碼都還在,這裏把它貼出來做個記錄。
代碼放在碼雲上,地址在這裏https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
// http://blog.csdn.net/zhaocj/article/details/50281537
int houghLineDetection()
{
// 加載原圖像
cv::Mat src = cv::imread("../Image/houghline2.jpg");
if (src.empty()) {
puts("原圖像讀取失敗!!!");
return -1;
}
cv::Mat gray(src.size(), CV_8UC1); // 原圖的灰度圖像
cv::cvtColor(src, gray, CV_BGR2GRAY);
cv::Mat edge(src.size(), CV_8UC1); // 邊緣圖像
cv::Mat dst(src.size(), src.type());// 繪制直線的目標圖像、
cv::cvtColor(gray, dst, CV_GRAY2BGR); // 從灰度圖轉過來,便於後面繪制紅色的線條
// 進行Canny邊緣檢測
cv::Canny(gray, edge, 50, 200, 3);
#if 0
// 定義輸出數組,用於存儲直線的角度和距離這兩個變量
std::vector<cv::Vec2f> lines;
// 距離分辨率為1,角度分辨率為π/180,閾值為215
// 閾值的選取直接影響到輸出直線的數量
cv::HoughLines(edge, lines, CV_HOUGH_PROBABILISTIC,
CV_PI / 180.0,215,0,0);
// 畫直線
for (size_t i = 0; i < lines.size(); ++i) {
// 提取出距離和角度
float rho = lines[i][0];
float theta = lines[i][1];
// 定義兩個點,確定一條直線
cv::Point p1, p2;
// 計算得到兩個點的坐標
// (ρcosθ-1000sinθ,ρsinθ+1000cosθ),(ρcosθ+1000sinθ,ρsinθ-1000cosθ)
double a = cos(theta);
double b = sin(theta);
double x0 = a*rho;
double y0 = b*rho;
p1.x = cvRound(x0 + 1000 * (-b));
p1.y = cvRound(y0 + 1000 * a);
p2.x = cvRound(x0 - 1000 * (-b));
p2.y = cvRound(y0 - 1000 * a);
// 在灰度圖上畫寬度為2的紅線
cv::line(dst, p1, p2, cv::Scalar(0, 0, 255), 2, 8);
}
#else
std::vector<cv::Vec4i> lines;
cv::HoughLinesP(edge, lines, CV_HOUGH_PROBABILISTIC,
CV_PI / 180.0, 80, 30, 10);
for (size_t i = 0; i < lines.size(); ++i) {
cv::line(dst, cv::Point(lines[i][0], lines[i][1]),
cv::Point(lines[i][2], lines[i][3]), cv::Scalar(0, 0, 255), 2, 8);
}
#endif
// 創建窗口顯示原圖和目標圖
cv::namedWindow("src");
cv::namedWindow("dst");
cv::imshow("src", src);
cv::imshow("dst", dst);
cv::imshow("edge", edge);
// 等待按鍵退出
cv::waitKey();
return 0;
}
OpenCV學習代碼記錄——Hough線段檢測