国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[C++] opencv - HoughCircles(霍夫圓查找)函數(shù)介紹和使用場景

這篇具有很好參考價值的文章主要介紹了[C++] opencv - HoughCircles(霍夫圓查找)函數(shù)介紹和使用場景。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

HoughCircles函數(shù)

HoughCircles函數(shù)用于在灰度圖像中使用霍夫變換查找圓。該函數(shù)通過修改霍夫變換來實現(xiàn),通常可以很好地檢測出圓的中心,但可能無法找到正確的半徑。可以通過指定半徑范圍(minRadius和maxRadius)來協(xié)助該函數(shù),或者在#HOUGH_GRADIENT方法中將maxRadius設(shè)置為負(fù)數(shù)以僅返回圓心而不進(jìn)行半徑搜索,并使用其他過程找到正確的半徑。此外,還可以對圖像進(jìn)行一定程度的平滑處理,除非它已經(jīng)很軟。例如,可以使用7x7內(nèi)核和1.5x1.5 sigma或類似的模糊處理來平滑圖像。

函數(shù)原型:

CV_EXPORTS_W void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0 );

參數(shù)說明:

image:輸入圖像,即源圖像,8位單通道圖像,如果使用彩色圖像,需要先轉(zhuǎn)換成灰度圖像;

circles:用來存儲HoughCircles的結(jié)果,類型為list,list中對象格式為x,y,r;
method:定義檢測圖像中圓的方法。目前唯一實現(xiàn)的方法是cv::HOUGH_GRADIENT;
dp:圖像像素分辨率與參數(shù)空間分辨率的比值(官方文檔上寫的是圖像分辨率與累加器分辨率的比值,它把參數(shù)空間認(rèn)為是一個累加器,畢竟里面存儲的都是經(jīng)過的像素點的數(shù)量),dp=1,則參數(shù)空間與圖像像素空間(分辨率)一樣大,dp=2,參數(shù)空間的分辨率只有像素空間的一半大;#通過設(shè)置dp可以減少計算量
minDist:檢測到的圓中心(x,y)坐標(biāo)之間的最小距離。如果minDist太小,則會保留大部分圓心相近的圓。如果minDist太大,則會將圓心相近的圓進(jìn)行合并(若兩圓心距離 < minDist,則認(rèn)為是同一個圓)。
param1:canny 邊緣檢測的高閾值,低閾值被自動置為高閾值的一半,默認(rèn)為 100。;
param2:累加平面某點是否是圓心的判定閾值。大于該閾值才判斷為圓。當(dāng)值設(shè)置的很小是,檢測到的圓越多。默認(rèn)值為 100;
minRadius:半徑的最小大?。ㄒ韵袼貫閱挝唬┠J(rèn)為 0;
maxRadius:半徑的最大大?。ㄒ韵袼貫閱挝唬┠J(rèn)為 0。

使用場景

HoughCircles 是一種圖像處理算法,用于檢測圖像中的圓?;舴驁A檢測能檢測出目標(biāo)圖像中存在的圓,但在實際使用中,參數(shù)調(diào)節(jié)存在很大的困難。

參數(shù)設(shè)置不合理會不僅導(dǎo)致計算量非常大,并且可能無法找不到你想保留的圓。

1)邊緣噪聲濾除

對圖像進(jìn)行 中值濾波 或者 均值濾波 或者 高斯濾波 優(yōu)化,減少圖像中存在的邊緣噪聲。

2)檢測參數(shù)如何設(shè)定

a. 檢索半徑設(shè)定

通過觀察原圖初步確定的圓的像素半徑范圍(對應(yīng)minRadius和maxRadius)。

b. 圓心累加值設(shè)定(對應(yīng)參數(shù)param2)

因為累加圓心(圓弧上的在圓心上的累加值,累加值超過該閾值則被認(rèn)為是一個圓)

c. 圓心距離設(shè)定(對應(yīng)參數(shù)miniDist)

通過觀察原圖所有希望找出的圓,然后確定2個圓心之間最小的距離。

使用案例

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

using namespace cv;
using namespace std;

int main()
{
    // 讀取原始圖像
    Mat src = imread("3480e7ce_mk_tk_a_c2_6400_4480.png", IMREAD_COLOR);
    if (src.empty())
    {
        cout << "無法讀取圖像" << endl;
        return -1;
    }

    // 轉(zhuǎn)換為灰度圖像
    Mat grayImage;
    cvtColor(src, grayImage, COLOR_BGR2GRAY);
    imshow("灰度圖", grayImage);
    waitKey(0);

    // 使用濾波器去噪
    Mat blurImage;
    // GaussianBlur(grayImage, blurImage, Size(9, 9), 2, 2); // 高斯濾波
    // medianBlur(grayImage, blurImage, 7); // 中值濾波
    blur(grayImage, blurImage, Size(7,7)); // 均值濾波
    imshow("模糊濾波", blurImage);
    waitKey(0);

    // 使用 Canny 邊緣檢測
    Mat edgesImage;
    Canny(blurImage, edgesImage, 50, 100);
    imshow("邊緣檢測", edgesImage);
    waitKey(0);
    
    clock_t t1 = clock();
    // 使用 HoughCircles 檢測圓
    vector<Vec3f> circles;
    // 設(shè)置Hough變換參數(shù)
    int minDist = 30;   // 最小距離
    int param1 = 100;     // Canny邊緣檢測高閾值  # 保持和和前面Canny的閾值一致
    int param2 = 15;     // Hough變換高閾值
    int minRadius = 10;   // 最小半徑
    int maxRadius = 100;   // 最大半徑
    HoughCircles(blurImage, circles, HOUGH_GRADIENT, 1, minDist,  param1, param2, minRadius, maxRadius);
    clock_t t2 = clock();
    // 在原圖上繪制檢測到的圓
    for (size_t i = 0; i < circles.size(); i++)
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0); // 繪制圓心
        circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0); //繪制空心圓
    }
    clock_t t3 = clock();
    double timeForHoughCircle = (double) (t2 - t1) / CLOCKS_PER_SEC * 1000;
	double timeForDrawCircle = (double) (t3 - t2) / CLOCKS_PER_SEC * 1000;
	cout << "HoughCircles:" << timeForHoughCircle << "ms, DrawCircle:" << timeForDrawCircle << "ms" <<endl;

    // 顯示結(jié)果
    imshow("霍夫圓檢測", src);
    waitKey(0);

    return 0;
}

灰度圖:

[C++] opencv - HoughCircles(霍夫圓查找)函數(shù)介紹和使用場景,opencv,C++,c++,opencv?模糊濾波:

[C++] opencv - HoughCircles(霍夫圓查找)函數(shù)介紹和使用場景,opencv,C++,c++,opencv?邊緣檢測:

[C++] opencv - HoughCircles(霍夫圓查找)函數(shù)介紹和使用場景,opencv,C++,c++,opencv?

霍夫圓檢測結(jié)果:

[C++] opencv - HoughCircles(霍夫圓查找)函數(shù)介紹和使用場景,opencv,C++,c++,opencv?

參考資料

opencv 十一 霍夫圓檢測原理及高級使用案例(含優(yōu)化步驟)

?文章來源地址http://www.zghlxwxcb.cn/news/detail-774084.html

到了這里,關(guān)于[C++] opencv - HoughCircles(霍夫圓查找)函數(shù)介紹和使用場景的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • [C++] opencv - drawContours(繪制輪廓)函數(shù)介紹和使用場景

    [C++] opencv - drawContours(繪制輪廓)函數(shù)介紹和使用場景

    OpenCV中的drawContours函數(shù)用于在圖像上繪制輪廓。其函數(shù)原型如下: 比較復(fù)制插入新建 參數(shù)說明: image: 輸出圖像,即繪制輪廓后的圖像。 contours: 輪廓集合,每個輪廓由一系列點組成。 contourIdx: 輪廓索引數(shù)組,指定要繪制哪些輪廓。如果為NULL,則繪制所有輪廓。 contourC

    2024年01月19日
    瀏覽(30)
  • [C++] opencv - Mat::convertTo函數(shù)介紹和使用場景

    [C++] opencv - Mat::convertTo函數(shù)介紹和使用場景

    Converts an array to another data type with optional scaling.? ? 該函數(shù)主要用于數(shù)據(jù)類型的相互轉(zhuǎn)換。 The method converts source pixel values to the target data type. saturate_cast is applied at the end to avoid possible overflows: m(x,y)=saturate_castrtype(α(?this)(x,y)+β)? ? 這是函數(shù)底層算法實現(xiàn)公式,了解算法方便我們

    2024年01月18日
    瀏覽(22)
  • [C++] opencv - approxPolyDP(多邊形擬合)函數(shù)介紹和使用場景

    [C++] opencv - approxPolyDP(多邊形擬合)函數(shù)介紹和使用場景

    OpenCV中的 approxPolyDP() 函數(shù)用于對形狀進(jìn)行逼近,以減少多邊形的頂點數(shù),可以用于對圖像輪廓點進(jìn)行多邊形擬合。 函數(shù)原型如下: 其中, curve 是輸入的點集,類型為 InputArray, 可以是 Mat 、 vectorPoint 等; approxCurve是輸出的點集,類型為 OutputArray, 也是 Mat 類型; epsilon 是精

    2024年03月14日
    瀏覽(91)
  • [C++] opencv - fillPoly(填充多邊形)函數(shù)介紹和使用場景

    [C++] opencv - fillPoly(填充多邊形)函數(shù)介紹和使用場景

    fillPoly() 函數(shù)是OpenCV中用于繪制填充多邊形的函數(shù)。函數(shù)原型如下: fillPoly() 函數(shù)適用于需要繪制填充多邊形的場景,例如在圖像上繪制一個封閉的圖形、制作一個簡單的遮罩等。 ? fillPoly() 函數(shù)是OpenCV中用于繪制填充多邊形的函數(shù)??梢杂脕砝L制實心三角形,實心矩形,實

    2024年02月19日
    瀏覽(575)
  • 【OpenCV-Python】——邊緣和輪廓&Laplacian/Sobel/Canny邊緣檢測&查找/繪制輪廓及輪廓特征&霍夫直線/圓變換

    【OpenCV-Python】——邊緣和輪廓&Laplacian/Sobel/Canny邊緣檢測&查找/繪制輪廓及輪廓特征&霍夫直線/圓變換

    目錄 前言: 1、邊緣檢測 1.1 Laplacian邊緣檢測 ?1.2 Sobel邊緣檢測 ?1.3 Canny邊緣檢測 2、圖像輪廓 2.1 查找輪廓 ?2.2 繪制輪廓 2.3 輪廓特征 3、霍夫變換 3.1 霍夫直線變換 ?3.2 霍夫圓變換 總結(jié): 圖像的邊緣是指圖像中灰度值急劇變化的位置,邊緣檢測的目的是為了繪制邊緣線條。

    2024年01月23日
    瀏覽(22)
  • opencv 十一 霍夫圓檢測原理及高級使用案例(含優(yōu)化步驟)

    opencv 十一 霍夫圓檢測原理及高級使用案例(含優(yōu)化步驟)

    霍夫圓檢測能檢測出目標(biāo)圖像中存在的圓,但在實際使用中,參數(shù)調(diào)節(jié)存在很大的困難,故在本博文中對霍夫圓檢測的原理、參數(shù)列表、優(yōu)化經(jīng)驗進(jìn)行分析總結(jié)。詳細(xì)的列出了各個參數(shù)的調(diào)節(jié)依據(jù),實現(xiàn)了在復(fù)雜背景下的霍夫圓檢測。 相關(guān)知識: 霍夫圓檢測與霍夫變換密切

    2024年02月04日
    瀏覽(16)
  • 基于Python OpenCV、使用霍夫變換的小車視覺循線識別

    基于Python OpenCV、使用霍夫變換的小車視覺循線識別

    ? ? ? ? 近期在做一個小車視覺循線的項目。小車將沿著一條線行駛,并用自帶的攝像頭拍攝道路前方的道路,行駛過程會遇到鈍角拐彎、弧線拐彎、直角拐彎這些特殊元素,小車需要在識別元素之后進(jìn)行合理地轉(zhuǎn)彎。 ????????在網(wǎng)上看到大部分的循線方法主要是二值化

    2024年02月16日
    瀏覽(16)
  • Opencv中inRange函數(shù)使用介紹

    inRange是OpenCV中的圖像閾值函數(shù),用于將圖像中的像素值限制在指定的范圍內(nèi)。它的輸入和輸出如下所述: 輸入值: src:輸入圖像,可以是灰度圖像或彩色圖像。 lowerb:表示下界的閾值,可以是一個標(biāo)量值或與輸入圖像通道數(shù)相同的數(shù)組。對于灰度圖像,lowerb是一個標(biāo)量值。

    2024年02月05日
    瀏覽(19)
  • [C++] opencv - copyTo函數(shù)介紹和使用案例

    [C++] opencv - copyTo函數(shù)介紹和使用案例

    copyTo 函數(shù)是OpenCV庫中的一個成員函數(shù),用于將一個Mat對象的內(nèi)容復(fù)制到另一個Mat對象中。 函數(shù)原型: 參數(shù)說明: m: 輸出數(shù)組,即目標(biāo)Mat對象,用于存儲源Mat對象的內(nèi)容。 mask:?圖像掩膜,用選定的圖像作為遮擋,來控制圖像處理的區(qū)域; 在這個例子中,我們首先讀取了一張

    2024年01月18日
    瀏覽(23)
  • [C++] opencv - resize函數(shù)介紹和使用案例

    C++ OpenCV中的resize函數(shù)用于調(diào)整圖像的大小。它可以根據(jù)指定的尺寸和插值方法對圖像進(jìn)行縮放。函數(shù)原型如下: 參數(shù)說明: src :輸入圖像,通常為 cv::Mat 類型。 dst :輸出圖像,與輸入圖像具有相同的類型。 size :目標(biāo)圖像的尺寸,表示為 (width, height) 。 fx :沿水平軸的縮放因子

    2024年04月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包