溫馨提示×

溫馨提示×

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

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

C++ OpenCV如何實現輪廓發現

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

C++ OpenCV如何實現輪廓發現

概述

在圖像處理和計算機視覺領域,輪廓發現是一個非常重要的任務。輪廓是指圖像中物體的邊界,通過輪廓發現,我們可以提取出圖像中的物體形狀、大小、位置等信息。OpenCV是一個強大的計算機視覺庫,提供了豐富的函數和工具來實現輪廓發現。本文將詳細介紹如何使用C++和OpenCV來實現輪廓發現。

準備工作

在開始之前,確保你已經安裝了OpenCV庫,并且配置好了C++開發環境。你可以通過以下命令來安裝OpenCV:

sudo apt-get install libopencv-dev

讀取圖像

首先,我們需要讀取一張圖像。OpenCV提供了imread函數來讀取圖像文件。以下是一個簡單的代碼示例:

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

using namespace cv;
using namespace std;

int main() {
    // 讀取圖像
    Mat image = imread("example.jpg", IMREAD_COLOR);

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

    // 顯示原始圖像
    namedWindow("Original Image", WINDOW_AUTOSIZE);
    imshow("Original Image", image);

    waitKey(0);
    return 0;
}

在這個示例中,我們讀取了一張名為example.jpg的圖像,并在窗口中顯示出來。

圖像預處理

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

灰度化

灰度化是將彩色圖像轉換為灰度圖像的過程。OpenCV提供了cvtColor函數來實現這一操作:

Mat grayImage;
cvtColor(image, grayImage, COLOR_BGR2GRAY);

// 顯示灰度圖像
namedWindow("Gray Image", WINDOW_AUTOSIZE);
imshow("Gray Image", grayImage);

二值化

二值化是將灰度圖像轉換為黑白圖像的過程。OpenCV提供了threshold函數來實現這一操作:

Mat binaryImage;
threshold(grayImage, binaryImage, 128, 255, THRESH_BINARY);

// 顯示二值圖像
namedWindow("Binary Image", WINDOW_AUTOSIZE);
imshow("Binary Image", binaryImage);

在這個示例中,我們將灰度圖像轉換為二值圖像,閾值為128。

輪廓發現

在完成圖像預處理后,我們可以使用OpenCV的findContours函數來發現圖像中的輪廓。findContours函數的基本用法如下:

vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binaryImage, contours, hierarchy, RETR_TREE, CHN_APPROX_SIMPLE);
  • binaryImage:輸入的二值圖像。
  • contours:輸出的輪廓點集。
  • hierarchy:輸出的輪廓層次結構。
  • RETR_TREE:輪廓檢索模式,表示檢索所有輪廓并重建完整的層次結構。
  • CHN_APPROX_SIMPLE:輪廓近似方法,表示壓縮水平、垂直和對角線段,只保留它們的端點。

繪制輪廓

發現輪廓后,我們可以使用drawContours函數將輪廓繪制到圖像上:

Mat contourImage = Mat::zeros(binaryImage.size(), CV_8UC3);
for (size_t i = 0; i < contours.size(); i++) {
    drawContours(contourImage, contours, (int)i, Scalar(0, 255, 0), 2, LINE_8, hierarchy, 0);
}

// 顯示輪廓圖像
namedWindow("Contours", WINDOW_AUTOSIZE);
imshow("Contours", contourImage);

在這個示例中,我們將所有輪廓繪制到一張黑色背景的圖像上,輪廓顏色為綠色。

輪廓分析

發現輪廓后,我們還可以對輪廓進行進一步的分析,例如計算輪廓的面積、周長、邊界框等。

計算輪廓面積

OpenCV提供了contourArea函數來計算輪廓的面積:

for (size_t i = 0; i < contours.size(); i++) {
    double area = contourArea(contours[i]);
    cout << "Contour " << i << " area: " << area << endl;
}

計算輪廓周長

OpenCV提供了arcLength函數來計算輪廓的周長:

for (size_t i = 0; i < contours.size(); i++) {
    double perimeter = arcLength(contours[i], true);
    cout << "Contour " << i << " perimeter: " << perimeter << endl;
}

計算邊界框

OpenCV提供了boundingRect函數來計算輪廓的邊界框:

for (size_t i = 0; i < contours.size(); i++) {
    Rect boundingBox = boundingRect(contours[i]);
    rectangle(contourImage, boundingBox, Scalar(255, 0, 0), 2);
}

在這個示例中,我們計算了每個輪廓的邊界框,并將其繪制到輪廓圖像上。

完整代碼示例

以下是一個完整的C++ OpenCV輪廓發現代碼示例:

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

using namespace cv;
using namespace std;

int main() {
    // 讀取圖像
    Mat image = imread("example.jpg", IMREAD_COLOR);

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

    // 顯示原始圖像
    namedWindow("Original Image", WINDOW_AUTOSIZE);
    imshow("Original Image", image);

    // 灰度化
    Mat grayImage;
    cvtColor(image, grayImage, COLOR_BGR2GRAY);

    // 顯示灰度圖像
    namedWindow("Gray Image", WINDOW_AUTOSIZE);
    imshow("Gray Image", grayImage);

    // 二值化
    Mat binaryImage;
    threshold(grayImage, binaryImage, 128, 255, THRESH_BINARY);

    // 顯示二值圖像
    namedWindow("Binary Image", WINDOW_AUTOSIZE);
    imshow("Binary Image", binaryImage);

    // 輪廓發現
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(binaryImage, contours, hierarchy, RETR_TREE, CHN_APPROX_SIMPLE);

    // 繪制輪廓
    Mat contourImage = Mat::zeros(binaryImage.size(), CV_8UC3);
    for (size_t i = 0; i < contours.size(); i++) {
        drawContours(contourImage, contours, (int)i, Scalar(0, 255, 0), 2, LINE_8, hierarchy, 0);
    }

    // 顯示輪廓圖像
    namedWindow("Contours", WINDOW_AUTOSIZE);
    imshow("Contours", contourImage);

    // 輪廓分析
    for (size_t i = 0; i < contours.size(); i++) {
        double area = contourArea(contours[i]);
        double perimeter = arcLength(contours[i], true);
        Rect boundingBox = boundingRect(contours[i]);

        cout << "Contour " << i << " area: " << area << ", perimeter: " << perimeter << endl;
        rectangle(contourImage, boundingBox, Scalar(255, 0, 0), 2);
    }

    // 顯示分析結果
    namedWindow("Analysis", WINDOW_AUTOSIZE);
    imshow("Analysis", contourImage);

    waitKey(0);
    return 0;
}

總結

本文詳細介紹了如何使用C++和OpenCV來實現輪廓發現。我們從圖像讀取、預處理、輪廓發現、繪制輪廓到輪廓分析,逐步講解了每個步驟的實現方法。通過這些步驟,你可以輕松地在自己的項目中實現輪廓發現功能。希望本文對你有所幫助!

向AI問一下細節

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

AI

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