溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ OpenCV如何提取水平和垂直線

發布時間:2021-11-26 10:41:22 來源:億速云 閱讀:318 作者:小新 欄目:大數據

C++ OpenCV如何提取水平和垂直線

在圖像處理中,提取水平和垂直線是一個常見的任務。OpenCV 是一個強大的計算機視覺庫,提供了多種方法來實現這一目標。本文將介紹如何使用 C++ 和 OpenCV 來提取圖像中的水平和垂直線。

1. 準備工作

首先,確保你已經安裝了 OpenCV 庫,并且你的開發環境已經配置好。如果你還沒有安裝 OpenCV,可以參考官方文檔進行安裝。

2. 讀取圖像

在開始處理圖像之前,我們需要先讀取圖像。使用 cv::imread 函數可以輕松地讀取圖像。

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 讀取圖像
    cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);

    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    // 顯示原始圖像
    cv::imshow("Original Image", image);
    cv::waitKey(0);

    return 0;
}

3. 圖像預處理

在提取線條之前,通常需要對圖像進行一些預處理操作,例如二值化、模糊等。這些操作可以幫助我們更好地提取線條。

3.1 二值化

二值化是將圖像轉換為黑白圖像的過程。我們可以使用 cv::threshold 函數來實現二值化。

cv::Mat binaryImage;
cv::threshold(image, binaryImage, 128, 255, cv::THRESH_BINARY);

cv::imshow("Binary Image", binaryImage);
cv::waitKey(0);

3.2 模糊處理

模糊處理可以減少圖像中的噪聲,使得線條提取更加準確。我們可以使用 cv::GaussianBlur 函數來實現模糊處理。

cv::Mat blurredImage;
cv::GaussianBlur(binaryImage, blurredImage, cv::Size(5, 5), 0);

cv::imshow("Blurred Image", blurredImage);
cv::waitKey(0);

4. 提取水平和垂直線

OpenCV 提供了多種方法來提取圖像中的線條,例如霍夫變換、形態學操作等。本文將介紹如何使用形態學操作來提取水平和垂直線。

4.1 創建結構元素

形態學操作需要一個結構元素(kernel),我們可以使用 cv::getStructuringElement 函數來創建結構元素。

cv::Mat horizontalKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(image.cols / 30, 1));
cv::Mat verticalKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(1, image.rows / 30));

4.2 應用形態學操作

我們可以使用 cv::morphologyEx 函數來應用形態學操作。對于水平線,我們可以使用開運算(cv::MORPH_OPEN),對于垂直線,我們可以使用閉運算(cv::MORPH_CLOSE)。

cv::Mat horizontalLines;
cv::morphologyEx(blurredImage, horizontalLines, cv::MORPH_OPEN, horizontalKernel);

cv::Mat verticalLines;
cv::morphologyEx(blurredImage, verticalLines, cv::MORPH_OPEN, verticalKernel);

cv::imshow("Horizontal Lines", horizontalLines);
cv::imshow("Vertical Lines", verticalLines);
cv::waitKey(0);

4.3 合并水平和垂直線

如果需要將水平和垂直線合并在一起,可以使用 cv::bitwise_or 函數。

cv::Mat lines;
cv::bitwise_or(horizontalLines, verticalLines, lines);

cv::imshow("Combined Lines", lines);
cv::waitKey(0);

5. 結果展示

最后,我們可以將提取的線條疊加到原始圖像上,以便更直觀地觀察結果。

cv::Mat result;
cv::cvtColor(image, result, cv::COLOR_GRAY2BGR);
cv::addWeighted(result, 1, lines, 1, 0, result);

cv::imshow("Result", result);
cv::waitKey(0);

6. 完整代碼

以下是完整的代碼示例:

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 讀取圖像
    cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);

    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    // 顯示原始圖像
    cv::imshow("Original Image", image);
    cv::waitKey(0);

    // 二值化
    cv::Mat binaryImage;
    cv::threshold(image, binaryImage, 128, 255, cv::THRESH_BINARY);

    cv::imshow("Binary Image", binaryImage);
    cv::waitKey(0);

    // 模糊處理
    cv::Mat blurredImage;
    cv::GaussianBlur(binaryImage, blurredImage, cv::Size(5, 5), 0);

    cv::imshow("Blurred Image", blurredImage);
    cv::waitKey(0);

    // 創建結構元素
    cv::Mat horizontalKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(image.cols / 30, 1));
    cv::Mat verticalKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(1, image.rows / 30));

    // 提取水平線
    cv::Mat horizontalLines;
    cv::morphologyEx(blurredImage, horizontalLines, cv::MORPH_OPEN, horizontalKernel);

    cv::imshow("Horizontal Lines", horizontalLines);
    cv::waitKey(0);

    // 提取垂直線
    cv::Mat verticalLines;
    cv::morphologyEx(blurredImage, verticalLines, cv::MORPH_OPEN, verticalKernel);

    cv::imshow("Vertical Lines", verticalLines);
    cv::waitKey(0);

    // 合并水平和垂直線
    cv::Mat lines;
    cv::bitwise_or(horizontalLines, verticalLines, lines);

    cv::imshow("Combined Lines", lines);
    cv::waitKey(0);

    // 結果展示
    cv::Mat result;
    cv::cvtColor(image, result, cv::COLOR_GRAY2BGR);
    cv::addWeighted(result, 1, lines, 1, 0, result);

    cv::imshow("Result", result);
    cv::waitKey(0);

    return 0;
}

7. 總結

本文介紹了如何使用 C++ 和 OpenCV 來提取圖像中的水平和垂直線。通過二值化、模糊處理和形態學操作,我們可以有效地提取圖像中的線條。希望這篇文章對你有所幫助!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女