1. 程式人生 > >OpenCV學習代碼記錄——Hough線段檢測

OpenCV學習代碼記錄——Hough線段檢測

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線段檢測