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

Qt+opencv 鼠標(biāo)畫線實(shí)現(xiàn)幾何圖形識別并動態(tài)創(chuàng)建

這篇具有很好參考價值的文章主要介紹了Qt+opencv 鼠標(biāo)畫線實(shí)現(xiàn)幾何圖形識別并動態(tài)創(chuàng)建。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前言

使用Qt + OpenCV實(shí)現(xiàn),通過鼠標(biāo)畫線繪制幾何圖形,然后通過opencv進(jìn)行圖形輪廓識別,返回圖形頂點(diǎn),然后創(chuàng)建對應(yīng)的幾何圖形添加到場景中。繪制使用QGraphics體系完成。

看效果圖:
Qt+opencv 鼠標(biāo)畫線實(shí)現(xiàn)幾何圖形識別并動態(tài)創(chuàng)建


本文demo在這里
點(diǎn)擊下載

環(huán)境: Qt5.15.2 + vs2019 64bit文章來源地址http://www.zghlxwxcb.cn/news/detail-496834.html


支持圖形:直線、圓、橢圓、矩形、三角形。
快捷鍵:數(shù)字3 清屏

正文

demo的功能實(shí)現(xiàn)流程如下:

在臨時畫線層繪制,然后將繪制的圖形保存成一張臨時圖片,再將其傳給opencv進(jìn)行輪廓檢測,返回輪廓點(diǎn)后再計算出輪廓頂點(diǎn)坐標(biāo),將坐標(biāo)交給Qt層動態(tài)創(chuàng)建幾何圖形,添加到scene中。

opencv下載

本文中需要用到opencv的輪廓識別,所以先要準(zhǔn)備好opencv的庫,本文下載的是當(dāng)前最新版本V4.6.0
opencv下載地址

Qt+opencv 鼠標(biāo)畫線實(shí)現(xiàn)幾何圖形識別并動態(tài)創(chuàng)建安裝后,將其頭文件和動態(tài)庫拷貝到自己的工程項目中,并創(chuàng)建一個pri文件進(jìn)行管理,也方便其他項目使用。

Qt+opencv 鼠標(biāo)畫線實(shí)現(xiàn)幾何圖形識別并動態(tài)創(chuàng)建
這里用到的動態(tài)庫是opencv_world460.dll

opencv.pri

INCLUDEPATH += $$PWD/include

win32 {
CONFIG(release, debug|release) {
LIBS += -L$$PWD/lib/ -lopencv_world460
}

CONFIG(debug, debug|release) {
LIBS += -L$$PWD/lib/ -lopencv_world460d
}
}

OpenCV輪廓提取算法使用findContours()接口,詳情可參考這里

繪制

本文使用QGraphics體系進(jìn)行鼠標(biāo)畫線,是在之前的博客文章代碼基礎(chǔ)上復(fù)用的
詳情參考:

Qt 鼠標(biāo)/觸屏繪制平滑曲線,支持矢量/非矢量方式
Qt實(shí)現(xiàn)桌面畫線、標(biāo)記,流暢繪制,支持鼠標(biāo)和多點(diǎn)觸控繪制

檢測

調(diào)用opencv的接口進(jìn)行檢測

void ShapeDetecter::shapeDetect(string path_to_image)
{
    RNG rng(123);
    // Read image
    Mat3b src = imread(path_to_image);
    // Convert to grayscale
    Mat1b gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    // Binarize
    Mat1b bin;
    threshold(gray, bin, 175, 255, THRESH_OTSU|THRESH_BINARY_INV);
    // Perform thinning
    _thinning(bin, bin);
    // Create result image
//    Mat3b res = src.clone();
    // Find contours
    vector<vector<Point>> contours;
    findContours(bin.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
    // For each contour

    if(contours.size() <=0)
        return;
    vector<Point> contour = contours[0];
    for (vector<Point>& contour : contours)
    {
        // Compute convex hull
        vector<Point> hull;
        convexHull(contour, hull);

        // Compute circularity, used for shape classification
        double area = contourArea(hull);
        double perimeter = arcLength(hull, true);
        double circularity = (4 * CV_PI * area) / (perimeter * perimeter);
        // Shape classification
        qDebug() << __FUNCTION__ << "circularity" << circularity;

        if(circularity > 0.85)
        {
            // circle
              RotatedRect rect = fitEllipse(contour);
             _drawCircle(rect.boundingRect());

        }
        else if(circularity > 0.68)
        {
            // Minimum oriented bounding box ...
            RotatedRect rect = minAreaRect(contour);
            Point2f pts[4];
            rect.points(pts);

            QVector<QPoint> points;
            for (int i = 0; i < 4; ++i)
            {
               points.push_back(QPoint( pts[i].x,pts[i].y));
            }

            emit sigDrawPolygon(points);

        }
        else if (circularity > 0.5)
        {
            // TRIANGLE
            // Select the portion of the image containing only the wanted contour
            Rect roi = boundingRect(contour);
            Mat1b maskRoi(bin.rows, bin.cols, uchar(0));
            rectangle(maskRoi, roi, Scalar(255), FILLED);
            Mat1b triangle(roi.height, roi.height, uchar(0));
            bin.copyTo(triangle, maskRoi);

            // Find min encolsing circle on the contour
            Point2f center;
            float radius;
            minEnclosingCircle(contour, center, radius);

            // decrease the size of the enclosing circle until it intersects the contour
            // in at least 3 different points (i.e. the 3 vertices)
            vector<vector<Point>> vertices;
            do
            {
                vertices.clear();
                radius--;

                Mat1b maskCirc(bin.rows, bin.cols, uchar(0));
                circle(maskCirc, center, radius, Scalar(255), 5);

                maskCirc &= triangle;
                findContours(maskCirc.clone(), vertices, RETR_LIST, CHAIN_APPROX_NONE);

            } while (vertices.size() < 3);

            qDebug() << __FUNCTION__ <<"TRIANGLE "<< "vertices_size = " <<vertices.size();
            // Just get the first point in each vertex blob.
            // You could get the centroid for a little better accuracy
            QVector<QPoint> points;
            points.push_back(QPoint(vertices[0][0].x,vertices[0][0].y));
            points.push_back(QPoint(vertices[1][0].x,vertices[1][0].y));
            points.push_back(QPoint(vertices[2][0].x,vertices[2][0].y));
//            emit sigDrawTriangle(points);
            emit sigDrawPolygon(points);
        }
        else
        {
           _drawLine(contours.at(0), boundingRect(contours.at(0)));
        }
    }
}

動態(tài)創(chuàng)建圖形

從opencv返回頂點(diǎn)接口后,這里直接快捷創(chuàng)建QGraphicsLineItem、QGraphicsEllipseItemQGraphicsPolygonItem,也可以自定義QGraphicsItem 然后在paint中進(jìn)行繪制,自由度更高,比如設(shè)置平滑及其他參數(shù)等。
可以參考之前的博客
Qt鼠標(biāo)拖動繪制基本幾何圖形

void WbCanvasItem::onDrawLine(const QPoint &point1, const QPoint &point2)
{
    auto item = new QGraphicsLineItem(QLineF(point1,point2),this);
    item->setPen(QPen(Qt::red,5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    m_pChildItems.append(item);
}

void WbCanvasItem::onDrawCircle(const QRect &rect)
{
    auto item = new QGraphicsEllipseItem(rect,this);
    item->setPen(QPen(Qt::red,5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    m_pChildItems.append(item);
}

void WbCanvasItem::onDrawPolygon(const QVector<QPoint> &pointVec)
{
    auto item = new QGraphicsPolygonItem(QPolygonF(pointVec),this);
    item->setPen(QPen(Qt::red,5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    m_pChildItems.append(item);
}

本示例通過簡單演示整個流程,若運(yùn)用到實(shí)際項目中需要進(jìn)一步優(yōu)化。


本文demo在這里
點(diǎn)擊下載

環(huán)境: Qt5.15.2 + vs2019 64bit


到了這里,關(guān)于Qt+opencv 鼠標(biāo)畫線實(shí)現(xiàn)幾何圖形識別并動態(tài)創(chuàng)建的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • PostGIS:幾何圖形輸出

    5.9.1. Well-Known Text (WKT) 5.9.1.1. ST_AsEWKT ST_AsEWKT -返回具有SRID元數(shù)據(jù)的幾何體的已知文本(WKT)表示。 5.9.1.1.1. 概要 5.9.1.1.2. 描述 返回以SRID為前綴的幾何圖形的知名文本表示形式??蛇x參數(shù)可用于減少輸出中使用的浮點(diǎn)數(shù)后的最大十進(jìn)制位數(shù)(默認(rèn)為15)。 此函數(shù)支持3d,并且不會刪

    2024年02月16日
    瀏覽(19)
  • 圖形幾何學(xué)——圓形:圓弧與曲率

    圖形幾何學(xué)——圓形:圓弧與曲率

    A、B、C分別是參考線的某三個連續(xù)的離散點(diǎn),abc分別是其對邊。根據(jù)三角形外接圓相關(guān)性質(zhì),通過作三條邊的中垂線的交點(diǎn)可以求得三角形的外接圓心。連接CO并延長交圓周于點(diǎn)D,由于 近似認(rèn)為 ∣ P 1 ? ∣ = ∣ P 2 P 3 ? ∣ = d s |vec{P_1}| = |vec{P_2P_3}| = ds ∣ P 1 ? ? ∣ = ∣

    2024年04月27日
    瀏覽(26)
  • Procedural Mesh: 創(chuàng)建復(fù)雜的3D幾何圖形

    Procedural Mesh 是一個用于創(chuàng)建復(fù)雜3D幾何圖形的開源庫,由 Morten Nobel 開發(fā)并維護(hù)。它允許開發(fā)者通過程序化的方式生成各種形狀和結(jié)構(gòu),無需手動設(shè)計每個頂點(diǎn)和面。 Procedural Mesh 提供了一系列函數(shù)和工具,可以幫助開發(fā)者輕松地生成自定義的3D網(wǎng)格。這些功能包括: 基礎(chǔ)形狀

    2024年03月15日
    瀏覽(39)
  • 幾何引擎 & 約束求解器 & 3D仿真物理引擎 & 圖形引擎

    幾何引擎 & 約束求解器 & 3D仿真物理引擎 & 圖形引擎

    四大技術(shù)圖譜就像四座護(hù)法金剛,形成了深不可測的技術(shù)鴻溝。這對于任何一個工業(yè)軟件企業(yè),十年發(fā)展的沉淀,那還只是開始。這條路,太漫長了。 Software Vendor Domain 3D-kernel 4MCAD IntelliCAD 4M S.A., Greece CAD, AEC Open CASCADE Technology Adams MSC Software, USA CAE Parasolid ADEM ADEM, Russia-Israel

    2024年02月08日
    瀏覽(47)
  • 計算機(jī)視覺 圖像形成 幾何圖形和變換 3D到2D投影

    ????????現(xiàn)在我們知道如何表示2D和3D幾何圖元以及如何在空間上轉(zhuǎn)換它們,我們需要指定如何將 3D圖元投影到圖像平面上。 我們可以使用線性3D到2D投影矩陣來做到這一點(diǎn)。最簡單的模型是正交法,它不需要除法就可以得到最終的(不均勻的)結(jié)果。更常用的模型是透視,

    2023年04月08日
    瀏覽(100)
  • CG3-v2.0-圖形幾何變換

    (1) 理解幾何變換基本原理, 掌握平移、旋轉(zhuǎn)、縮放變換的方法; (2) 根據(jù)平移算法原理補(bǔ)全translation、scale、rotation_x、rotation_y和rotation_z函數(shù); (3) 根據(jù)幾何變換基本原理,將main函數(shù)中的translation、scale、rotation_z參數(shù)補(bǔ)充完整。

    2024年02月08日
    瀏覽(37)
  • 圖形編輯器開發(fā):一些會用到的簡單幾何算法

    圖形編輯器開發(fā):一些會用到的簡單幾何算法

    大家好,我是前端西瓜哥。 開發(fā)圖形編輯器,你會經(jīng)常要解決一些算法問題。本文盤點(diǎn)一些我開發(fā)圖形編輯器時遇到的簡單幾何算法問題。 判斷兩個矩形是否發(fā)生碰撞(或者說相交),即兩個矩形有重合的區(qū)域。 常見使用場景: 使用選擇工具 框選 圖形(框選策略除了相交

    2024年02月16日
    瀏覽(23)
  • 基于EasyX學(xué)習(xí)圖形學(xué)中的三維幾何變換【全】

    基于EasyX學(xué)習(xí)圖形學(xué)中的三維幾何變換【全】

    本文開始學(xué)習(xí)幾何變換中的三維變換,對于各種變換的定義方法基本和二維變換一樣,在此我就不過多贅述了。 三維變換矩陣 由于二維變換矩陣為三階矩陣,所以三維變換矩陣為四階矩陣 以下例子均在此正方體基礎(chǔ)上 坐標(biāo)表示 矩陣表示 變換矩陣 核心代碼 效果展示 坐標(biāo)表

    2024年02月09日
    瀏覽(27)
  • 【干貨分享】如何一鍵打造理想露營地?春日露營,即刻出發(fā)!Python | 建模 | 3D | 圖形引擎| 幾何引擎

    【干貨分享】如何一鍵打造理想露營地?春日露營,即刻出發(fā)!Python | 建模 | 3D | 圖形引擎| 幾何引擎

    在這個快節(jié)奏的時代,我們都渴望找到一片屬于自己的寧靜角落。 你是否曾暢想在星空下,與大自然親密接觸,享受露營的樂趣?? 但是,想到搭建帳篷、生火、布置燈光等一系列繁瑣的準(zhǔn)備工作,又望而卻步?? 想象一下 大包小包,拖家?guī)Э?,還要為應(yīng)對各種突發(fā)情況準(zhǔn)備

    2024年03月23日
    瀏覽(26)
  • SVG的一些基礎(chǔ)知識,包括SVG坐標(biāo)系統(tǒng)、支持的幾何圖形和樣式,動畫的基礎(chǔ)知識,包括基本動畫和路徑動畫

    SVG(可縮放矢量圖形)是一種使用XML格式定義的圖像格式,它可以將二維圖像呈現(xiàn)為任意大小的圖像,而不會產(chǎn)生像素化。由于它的矢量設(shè)計,SVG成為了實(shí)現(xiàn)各種圖形和動畫的理想平臺。在本文中,我們將探討如何使用SVG實(shí)現(xiàn)圖形和動畫。 在開始之前,讓我們首先了解一下

    2024年02月03日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包