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

C++opencv找圓心?看著一篇,一定有你要(邊緣輪廓檢測,擬合,凸包)找出相應的輪廓或者全部輪廓畫外界圓輪廓并且標出輪廓中心

這篇具有很好參考價值的文章主要介紹了C++opencv找圓心?看著一篇,一定有你要(邊緣輪廓檢測,擬合,凸包)找出相應的輪廓或者全部輪廓畫外界圓輪廓并且標出輪廓中心。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一,利用面積對輪廓進行篩選

注意這種面積篩選有一個弊端就是比如有兩個輪廓,

A輪廓為500

B輪廓為300

當面積設置為 area<400時就可以篩選出面積小于300的所有輪廓

反之大于300的輪廓 如果有兩個圓輪廓一大一小,可能就只能保留一個了

如果知道這兩個形狀的輪廓面積,或許可以利用 邏輯與? 進行篩選。

效果圖

opencv找圓,c++,opencv,計算機視覺

//圓心
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    //載入圖像
    Mat src = imread("D:\\Besktop\\faimage\\Image\\21_25_27.bmp");
    Mat src_clone = src.clone();
    if (src.empty()) 
    {
        cout << "圖片為空" << endl;
        return 0;
    }
    imshow("src", src);
    //轉灰度圖
    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    //圖像二值化
    threshold(gray, gray, 0, 255, THRESH_BINARY | THRESH_OTSU);
    imshow("threshold", gray);
    //執(zhí)行形態(tài)學開操作去除噪點
    /*Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1, -1));
    morphologyEx(gray, gray, MORPH_OPEN, kernel, Point(-1, -1), 1);
    imshow("morphologyEx", gray);*/

    //邊緣檢測
    Canny(gray, gray, 0, 255);
    Mat graycanny;
    resize(gray, graycanny, Size(600, 600));
    imshow("canny", graycanny);

    //輪廓發(fā)現(xiàn)
    vector<vector<Point>> contours;
    vector<Vec4i> her;
    findContours(gray, contours, her, RETR_TREE, CHAIN_APPROX_SIMPLE);
    //獲取某一輪廓重心點
    Moments M;
    M = moments(contours[0]);
    double cX = double(M.m10 / M.m00);
    double cY = double(M.m01 / M.m00);

    //Mat resultImage = Mat::zeros(gray.size(), CV_8UC3);
    RNG rng(12345);
    double area = 0.0;
    Point pRadius;
    for (int i = 0; i < contours.size(); i++) {
        double area = contourArea(contours[i], false);
        //根據(jù)面積及縱橫比過濾輪廓
        if (area > 200) {
            Rect rect = boundingRect(contours[i]);
            float scale = float(rect.width) / float(rect.height);
            if (scale < 1 && scale>0) {
                drawContours(gray, contours, i, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1);
                int x = rect.width / 2;
                int y = rect.height / 2;
                //找出圓心并繪制
                pRadius = Point(rect.x + x, rect.y + y);
                circle(gray, pRadius, 15, Scalar(0, 0, 255), 15);
            }
            
        }
    }
    Mat graycanny1;
    resize(gray, graycanny1, Size(600, 600));
    imshow("resultImage", graycanny1);
    //imshow("resultImage", resultImage);
    //在原圖上繪制圓心
    circle(src_clone, pRadius, 15, Scalar(0, 0, 255), 15);
    cout << "圓心坐標:" << cX << "" << cY << endl;
    //cout <<"[x,y]" << pRadius << endl;
    Mat graycanny2;
    resize(src_clone, graycanny2, Size(600, 600));
    imshow("src_clone", graycanny2);
    //imshow("src_clone", src_clone);
    waitKey(0);
    return 0;
}

二,利用邊緣檢測和輪廓篩選找出輪廓

這一種則是利用輪廓的中心點對輪廓進行擬合,從而達到尋找輪廓

opencv找圓,c++,opencv,計算機視覺

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

int main()
{
    Mat img = imread("D:\\Besktop\\faimage\\測試原圖\\22_21_27.bmp");
    //String dest = "D:\\Besktop\\1\\";
    /*string path = "D:\\Besktop\\faimage\\測試原圖\\";
    String dest = "D:\\Besktop\\1\\";
    String savedfilename;
    int len = path.length();
    vector<cv::String> filenames;
    cv::glob(path, filenames);
    for (int i = 0; i < filenames.size(); i++)
    
        Mat frame;
        frame = imread(filenames[i], i);
        savedfilename = dest + filenames[i].substr(len);*/
     
        Mat gray_img, thresh_img;
        //灰度
        cvtColor(img, gray_img, COLOR_BGR2GRAY);
        threshold(gray_img, thresh_img, 0, 255, THRESH_TRIANGLE);
        //開運算
        Mat ellipse = getStructuringElement(MORPH_ELLIPSE, Size(13, 13));
        morphologyEx(thresh_img, thresh_img, MORPH_OPEN, ellipse, Point(-1, -1), 2);

        //尋找輪廓
        vector<vector<Point>> contours;
        vector<Vec4i> hierarchy1;
        findContours(thresh_img, contours, hierarchy1, RETR_LIST, CHAIN_APPROX_NONE, Point());

        //獲取某一輪廓重心點
        Moments M;
        M = moments(contours[0]);
        double cX = double(M.m10 / M.m00);
        double cY = double(M.m01 / M.m00);
        //繪制輪廓
        drawContours(img, contours, 0, Scalar(0, 255, 0), 2, 8, hierarchy1);
        //顯示輪廓重心并提取坐標點
        circle(img, Point2d(cX, cY), 6, Scalar(0, 255, 0), 2, 8);

        namedWindow("Center Point", CV_WINDOW_NORMAL);
        imshow("Center Point", img);
        //imwrite("D:\\Besktop\\1\\22_21_27.bmp", img);
        putText(img, "center", Point2d(cX - 20, cY - 20), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1, 8);
        cout << "重心坐標:" << cX << " " << cY << endl << endl;
        waitKey(0);
    
    return 0;
}

三,這一種方法類似于第一種的面積篩選唯一不同的時候增加了幾步形態(tài)學處理

?opencv找圓,c++,opencv,計算機視覺

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//第二步 通過面積過濾,通過縱橫比的測量,圓形的縱橫比應該在1:1左右,如果不是1:1,就把它過濾掉
Mat srcImg, binaryImg, dstImg;
void test()
{
    srcImg = imread("D:\\Besktop\\faimage\\Image\\21_25_27.bmp", IMREAD_GRAYSCALE);
    if (srcImg.empty())
    {
        cout << "could not load image...\n" << endl;
    }
    namedWindow("Original image", CV_WINDOW_NORMAL);  //CV_WINDOW_NORMAL 使得鼠標可以控制顯示窗口的大小
    imshow("Original image", srcImg);

    //二值化
    threshold(srcImg, binaryImg, 0, 255, THRESH_BINARY | THRESH_OTSU);
    namedWindow("Binary Result", CV_WINDOW_NORMAL);
    imshow("Binary Result", binaryImg);

    //形態(tài)學操作,開操作,去掉小的對象,閉操作,連接里面的洞(開閉操作要先獲得結構元素)
    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));  //Point(-1, -1)是中心點,這里是 2 x 2位置
    morphologyEx(binaryImg, dstImg, MORPH_CLOSE, kernel, Point(-1, -1));
    namedWindow("Close Result", CV_WINDOW_NORMAL);
    imshow("Close Result", dstImg);

    kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
    morphologyEx(dstImg, dstImg, MORPH_OPEN, kernel, Point(-1, -1));
    namedWindow("Open Result", CV_WINDOW_NORMAL);
    imshow("Open Result", dstImg);

    //輪廓發(fā)現(xiàn)
    vector<vector<Point>> contours;  //存儲輪廓
    vector<Vec4i> hireachy;
    findContours(dstImg, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

    //通過面積過濾,通過縱橫比的測量,圓形的縱橫比應該在1:1左右,如果不是1:1,就把它過濾掉
    Mat resultImg = Mat::zeros(srcImg.size(), CV_8SC3);
    Point cc;
    for (int i = 0; i < contours.size(); i++)
    {
        //面積過濾
        double area = contourArea(contours[i]);  //循環(huán)獲取指定的面積
        if (area < 100)  //通過循環(huán)過濾掉小于100的面積
            continue;
        //橫縱比過濾
        Rect rect = boundingRect(contours[i]);
        float ratio = float(rect.width) / float(rect.height);
        if (ratio < 1.1 && ratio> 0.9)  //把滿足條件的保留畫出來
        {
            drawContours(resultImg, contours, i, Scalar(0, 0, 255), -1, 8, Mat(), 0, Point());  //畫出來 第五個參數(shù)改為 -1 ,使得整個圓形填充
            cout << "circle area: " << area << endl;  //面積和周長打印出來(像素度量)
            cout << "circle length: " << arcLength(contours[i], true) << endl;

            //找中心點
            int x = rect.x + rect.width / 2;
            int y = rect.y + rect.height / 2;
            cc = Point(x, y);
            circle(resultImg, cc, 2, Scalar(0, 0, 255), 2, 8, 0);  //畫出中心點
        }
    }
    namedWindow("Final Result", CV_WINDOW_NORMAL);
    imshow("Final Result", resultImg);

    //在原圖上定位顯示中心點
    Mat circleImg = srcImg.clone();
    cvtColor(circleImg, circleImg, COLOR_GRAY2BGR);
    circle(circleImg, cc, 20, Scalar(0, 0, 255), 2, 8, 0);

    namedWindow("Center Point", CV_WINDOW_NORMAL);
    imshow("Center Point", circleImg);
}

int main()
{
    test();
    waitKey(0);
    return 0;
}

這三種方法都是opencv中的一些方法,有任何建議和問題均可評論區(qū)提問,說不定你的建議正是我疑惑的地方?。?!

四,利用輪廓擬合的方法對圖片中的某個輪廓進行擬合(這里主要是圓心)

此方法運行環(huán)境為opencv4.5.5

opencv找圓,c++,opencv,計算機視覺

?相關代碼

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    // 讀取圖片
    Mat src = imread("圖片路徑");

    // 轉換為灰度圖
    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);

    // 進行邊緣檢測
    Mat edge;
    Canny(gray, edge, 100, 200);

    // 圓形擬合
    vector<Vec3f> circles;
    HoughCircles(edge, circles, HOUGH_GRADIENT, 1, edge.rows / 16, 100, 30, 10, 50);

    // 繪制圓形和圓心
    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, radius, Scalar(0, 0, 255), 2);
        circle(src, center, 3, Scalar(0, 255, 0), -1);
    }

    // 顯示結果
    namedWindow("src", WINDOW_NORMAL);
    imshow("src", src);
    waitKey(0);

    return 0;
}

#endif // 1

五,這種是利用凸包 對圓形進行擬合并且將所有的輪廓都繪制外界圓

opencv4.5.5

opencv找圓,c++,opencv,計算機視覺

?代碼

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    // 讀取圖片
    Mat img = imread("圖片路徑");

    // 轉換為灰度圖
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    // 進行二值化處理
    Mat thresh;
    threshold(gray, thresh, 128, 255, THRESH_BINARY);

    // 找到所有輪廓
    vector<vector<Point>> contours;
    findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    // 遍歷輪廓,找到圓形輪廓
    for (size_t i = 0; i < contours.size(); i++)
    {
        // 只考慮凸包
        vector<Point> hull;
        convexHull(contours[i], hull);

        // 嘗試將輪廓擬合為圓形
        Point2f center;
        float radius;
        //bool isCircle = fitCircle(hull, center, radius);
        minEnclosingCircle(hull, center, radius);
        cout << center.x << "," << center.y << endl;
        // 標出圓心
        circle(img, center, 5, Scalar(0, 255, 0), -1);
        // 繪制圓形
        circle(img, center, radius, Scalar(0, 0, 255), 2);

    }
    // 顯示結果
    Mat ss;
    resize(img, ss, Size(600, 600));
    imshow("Contours", ss);
    waitKey();
}
#endif // 0

有問題歡迎評論區(qū)討論文章來源地址http://www.zghlxwxcb.cn/news/detail-675107.html

到了這里,關于C++opencv找圓心?看著一篇,一定有你要(邊緣輪廓檢測,擬合,凸包)找出相應的輪廓或者全部輪廓畫外界圓輪廓并且標出輪廓中心的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • C++如何用OpenCV中實現(xiàn)圖像的邊緣檢測和輪廓提???

    C++如何用OpenCV中實現(xiàn)圖像的邊緣檢測和輪廓提取?

    主要實現(xiàn)代碼:

    2024年02月07日
    瀏覽(25)
  • 數(shù)字圖像處理【11】OpenCV-Canny邊緣提取到FindContours輪廓發(fā)現(xiàn)

    數(shù)字圖像處理【11】OpenCV-Canny邊緣提取到FindContours輪廓發(fā)現(xiàn)

    本章主要介紹圖像處理中一個比較基礎的操作:Canny邊緣發(fā)現(xiàn)、輪廓發(fā)現(xiàn) 和 繪制輪廓。概念不難,主要是結合OpenCV 4.5+的API相關操作,為往下 \\\"基于距離變換的分水嶺圖像分割\\\" 做知識儲備。 在講述輪廓之前,要花點時間學學邊緣檢測提取的一個著名算法——Canny邊緣提取算法

    2024年02月16日
    瀏覽(24)
  • 【Ai工具合集,一定有你需要的!】

    【Ai工具合集,一定有你需要的!】

    花費了一天的時間測試了市面上各大Ai工具,然后幫大家整理總結出來了這些工具,一定記得點贊收藏保存,后面肯定會用到! 1.部分Ai工具需要魔法上網,請自行解決;部分工具需要收費,可以嘗試用chatgpt代替這些功能 2.下列總結的Ai工具均已測試篩選,剔除掉了很多不實用

    2024年02月05日
    瀏覽(19)
  • 十大開源測試工具和框架,一定有你需要的

    十大開源測試工具和框架,一定有你需要的

    目錄 前言 Katalon Studio Selenium Appium JMeter SOAP UI Robot Framework Watir JUnit Robotium Citrus 總結 免費的開源框架和工具由于其開源特性,現(xiàn)在逐漸成為自動化測試的首選解決方案。區(qū)別在于,你是喜歡使用類庫編寫一個全新的自動化測試框架,或者喜歡使用一個現(xiàn)成的工具。 ? Katalon

    2024年02月16日
    瀏覽(20)
  • JSX看著一篇足以入門

    JSX看著一篇足以入門

    JSX 介紹 學習目標: 能夠理解什么是 JSX,JSX 的底層是什么 概念: JSX 是 javaScriptXML(HTML) 的縮寫,表示在 JS 代碼中書寫 HTML 結構 作用: 在 React 中創(chuàng)建 HTML 結構(頁面 UI 結構) 優(yōu)勢: ?1. 采用類似 HTML 的語法,降低學習成本,會 HTML 就會 JSX ?2. 充分利用 JS 自生的可編程能

    2024年02月08日
    瀏覽(19)
  • OpenCV找出圖片中的圓并標注圓心

    OpenCV找出圖片中的圓并標注圓心

    案例:輸入一張圖片找到圖片中的一個圓,并標注圓心 實現(xiàn)步驟: 1.輸入原圖 2.圖像圖像灰度化 3.圖像二值化 4.執(zhí)行形態(tài)學操作去除噪點 5.邊緣檢測 6.輪廓發(fā)現(xiàn) 7.根據(jù)面積和縱橫比過濾目標輪廓 8.找出圓心并繪制圓心 9.在原圖上也繪制圓心并輸出 ? 本文福利, 莬 費領取Qt開

    2024年02月11日
    瀏覽(22)
  • AI:164- python獲取圖像邊緣輪廓

    AI:164- python獲取圖像邊緣輪廓

    本文收錄于專欄:精通AI實戰(zhàn)千例專欄合集 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 每一個案例都附帶關鍵代碼,詳細講解供大家學習,希望可以幫到大家。正在不斷更新中~ 在圖像處理中,邊緣檢測是

    2024年04月26日
    瀏覽(20)
  • Halcon中亞像素邊緣,輪廓提取處理的各種方法

    Halcon中亞像素邊緣,輪廓提取處理的各種方法

    在圖像處理中,提取圖像特征主要從兩個角度,區(qū)域或者邊緣。提取亞像素邊緣有三種思路,提取過后再用邊緣模板匹配,連接與分割都可以。這里不涉及邊緣對用作視覺測量類的算子,僅對剛學習halcon的新人而言。 這幅圖代表著在項目的過程中使用邊緣的三種思路。之前某

    2024年02月14日
    瀏覽(16)
  • c# OpenCvSharp 檢測(斑點檢測、邊緣檢測、輪廓檢測)(五)

    c# OpenCvSharp 檢測(斑點檢測、邊緣檢測、輪廓檢測)(五)

    在C#中使用OpenCV進行圖像處理時,可以使用不同的算法和函數(shù)來實現(xiàn)斑點檢測、邊緣檢測和輪廓檢測。 斑點檢測 邊緣檢測 輪廓檢測 斑點檢測是指在圖像中找到明亮或暗的小區(qū)域(通常表示為斑點),并標記它們的位置??梢允褂肙penCV中的函數(shù)SimpleBlobDetector來實現(xiàn)斑點檢測。

    2024年02月04日
    瀏覽(12)
  • 【opencv】 利用圖像輪廓函數(shù)填充輪廓內部

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包