OpenCV circle函數全面解析

一、什麼是OpenCV circle函數

OpenCV是一個基於BSD許可(開源)發行的跨平台的計算機視覺庫,包含了非常多的圖像處理和計算機視覺算法。OpenCV circle函數是OpenCV庫中用來繪製圓形的函數,其API如下:

void circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=LINE_8, int shift=0)

其中,各個參數的含義如下:

  • img:需要繪製圓形的圖像
  • center:圓形的中心點坐標
  • radius:圓形的半徑
  • color:圓形的顏色
  • thickness:圓形的線條粗細
  • lineType:圓形線條的類型
  • shift:圓形線條位置的小數位數

二、如何在圖片中繪製圓形

在OpenCV中繪製圓形有兩種方式,一種是將圓形繪製在原圖上,另一種是將圓形繪製在新的空白圖片上。

三、在原圖上繪製圓形

在原圖上繪製圓形的主要步驟如下:

  1. 讀取一張圖片,使用circle函數繪製圓形
  2. 顯示繪製後的圖片

具體代碼如下:

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat img = imread("test.jpg");
    circle(img, Point(img.cols / 2, img.rows / 2), 50, Scalar(0, 0, 255), 2);
    imshow("img", img);
    waitKey(0);
    return 0;
}

四、在空白圖片上繪製圓形

在空白圖片上繪製圓形的主要步驟如下:

  1. 創建一張空白的圖片,使用circle函數繪製圓形
  2. 顯示繪製後的圖片

具體代碼如下:

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat img = Mat::zeros(Size(500, 500), CV_8UC3);
    circle(img, Point(img.cols / 2, img.rows / 2), 50, Scalar(0, 0, 255), 2);
    imshow("img", img);
    waitKey(0);
    return 0;
}

五、如何繪製多個圓形

需要繪製多個圓形時,只需要多次使用circle函數即可。

具體代碼如下:

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat img = imread("test.jpg");
    circle(img, Point(100, 100), 50, Scalar(0, 0, 255), 2);
    circle(img, Point(200, 200), 50, Scalar(0, 255, 0), 2);
    circle(img, Point(300, 300), 50, Scalar(255, 0, 0), 2);
    imshow("img", img);
    waitKey(0);
    return 0;
}

六、實際案例:在視頻中實時檢測並標註圓形

在實際應用中,需要實時檢測並標註一些目標,比如檢測一個運動的球並畫出其軌跡。具體步驟如下:

  1. 打開攝像頭,讀取視頻流
  2. 對每一幀圖像進行處理,使用circle函數檢測並繪製目標圓形
  3. 顯示處理後的每一幀圖像

具體代碼如下:

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    VideoCapture cap(0);
    if (!cap.isOpened())
    {
        std::cout << "Cannot open camera!" << std::endl;
        return -1;
    }
    namedWindow("img", WINDOW_AUTOSIZE);

    int last_x = -1, last_y = -1;
    while (true)
    {
        Mat frame;
        cap >> frame;
        if (frame.empty()) break;

        Mat gray, canny;
        cvtColor(frame, gray, COLOR_BGR2GRAY);
        Canny(gray, canny, 50, 150, 3);

        std::vector<Vec3f> circles;
        HoughCircles(canny, circles, HOUGH_GRADIENT, 1, canny.rows / 8, 150, 30, 0, 0);

        if (!circles.empty())
        {
            for (const auto& circle : circles)
            {
                int x = (int)circle[0];
                int y = (int)circle[1];
                int radius = (int)circle[2];
                circle(frame, Point(x, y), radius, Scalar(0, 0, 255), 2);

                if (last_x != -1 && last_y != -1)
                    line(frame, Point(x, y), Point(last_x, last_y), Scalar(0, 255, 0), 2);

                last_x = x;
                last_y = y;
            }
        }
        else
        {
            last_x = -1;
            last_y = -1;
        }

        imshow("img", frame);
        if (waitKey(30) == 'q') break;
    }

    return 0;
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/254479.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 17:42
下一篇 2024-12-14 17:42

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29

發表回復

登錄後才能評論