QT實現簡約美觀的動畫Checkbox

*最終效果:
*在這里插入圖片描述
一共三個文件: main.cpp , FancyCheckbox.h , FancyCheckbox.cpp
main.cpp

#include <QApplication>
#include "FancyCheckbox.h"
#include <QGridLayout>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget* w = new QWidget;w->setWindowTitle("cool checkbox");w->resize(600,400);auto* layout = new QGridLayout;layout->addWidget(new CheckboxSimple,0,0);layout->addWidget(new CheckboxLollipop,0,1);layout->addWidget(new CheckboxNike,0,2);layout->addWidget(new CheckboxTransform,1,0);layout->addWidget(new CheckboxBanner,1,1);layout->addWidget(new CheckboxMark,1,2);w->setLayout(layout);w->show();return a.exec();
}

FancyCheckbox.h

#ifndef CHECKBOXSIMPLE_H
#define CHECKBOXSIMPLE_H
#include <QPropertyAnimation>
#include <QWidget>
#include <QPaintEvent>
#include <QMouseEvent>class CheckboxBase:public QWidget
{Q_OBJECTQ_PROPERTY(qreal angle READ angle WRITE setAngle)
public:CheckboxBase(QWidget* parent=nullptr);virtual ~CheckboxBase();qreal angle()const;void setAngle(qreal an);protected:void enterEvent(QEvent* e);void leaveEvent(QEvent* e);QPropertyAnimation mAnim;qreal mAngle;bool mChecked;
};class CheckboxSimple : public CheckboxBase
{Q_OBJECT
public:explicit CheckboxSimple(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent* e);void mouseReleaseEvent(QMouseEvent* e);
};
class CheckboxLollipop : public CheckboxBase
{Q_OBJECT
public:explicit CheckboxLollipop(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent* e);void mouseReleaseEvent(QMouseEvent* e);
};
class CheckboxNike: public CheckboxBase{Q_OBJECT
public:explicit CheckboxNike(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent* e);void mouseReleaseEvent(QMouseEvent* e);
};
class CheckboxTransform: public CheckboxBase{Q_OBJECT
public:explicit CheckboxTransform(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent* e);void mouseReleaseEvent(QMouseEvent* e);
};class CheckboxBanner: public CheckboxBase{Q_OBJECT
public:explicit CheckboxBanner(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent* e);void mouseReleaseEvent(QMouseEvent* e);
};class CheckboxMark: public CheckboxBase{Q_OBJECT
public:explicit CheckboxMark(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent* e);void mouseReleaseEvent(QMouseEvent* e);
};#endif // CHECKBOXSIMPLE_H

FancyCheckbox.cpp

#include "FancyCheckbox.h"
#include <QPainter>
#include <QPainterPath>
#include <QPalette>
#include <math.h>
CheckboxBase::CheckboxBase(QWidget* parent):QWidget(parent),mAngle(0),mChecked(false)
{mAnim.setPropertyName("angle");mAnim.setTargetObject(this);mAnim.setDuration(2000);mAnim.setLoopCount(1);mAnim.setEasingCurve(QEasingCurve::Linear);setMouseTracking(true);
}
CheckboxBase::~CheckboxBase(){}qreal CheckboxBase::angle()const{ return mAngle;}
void CheckboxBase::setAngle(qreal an){mAngle = an;update();
}
void CheckboxBase::enterEvent(QEvent* e){setCursor(Qt::PointingHandCursor);
}
void CheckboxBase::leaveEvent(QEvent* e){setCursor(Qt::ArrowCursor);
}CheckboxSimple::CheckboxSimple(QWidget *parent) : CheckboxBase(parent)
{setFixedSize(40,24);mAnim.setDuration(100);mAngle = 360;
}void CheckboxSimple::paintEvent(QPaintEvent* e){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);int w = width();int h = height();painter.setPen(Qt::NoPen);if(mChecked){painter.setBrush(QBrush(QColor("lightgreen")));}else{painter.setBrush(QBrush(QColor("lightgray")));}painter.drawRoundedRect(rect(),h/2,h/2);painter.setBrush(QBrush(QColor("white")));const int gap = 3;if(mChecked){painter.translate((w-h)*mAngle/360+h/2,h/2);}else{painter.translate(w-h/2-(w-h)*mAngle/360 , h/2);}painter.drawEllipse(QPoint(0,0),h/2-gap,h/2-gap);
}
void CheckboxSimple::mouseReleaseEvent(QMouseEvent* e){if(mAnim.state() == QAbstractAnimation::Running) return;mChecked = !mChecked;mAnim.setStartValue(0);mAnim.setEndValue(360);mAnim.start();
}
CheckboxLollipop::CheckboxLollipop(QWidget *parent) : CheckboxBase(parent)
{setFixedSize(80,72);mAnim.setDuration(160);mAngle = 360;
}void CheckboxLollipop::paintEvent(QPaintEvent* e){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);int w = width();int h = height();painter.setPen(Qt::NoPen);if(mChecked){painter.setBrush(QBrush(QColor("cornflowerblue")));}else{painter.setBrush(QBrush(QColor("gray")));}const auto r = 0.16 * h;const auto R = r + 0.25*w;painter.translate(0.25*w,0.4*h);if(mChecked){if(mAngle <= 180){//move to rightsidepainter.drawRoundedRect(QRectF(0,0,0.5*w,0.2*h),0.1*h,0.1*h);painter.setBrush(QBrush(QColor("blueviolet")));painter.translate((0.5*w - 2*r) * mAngle / 180 + r , 0.1*h);painter.drawEllipse(QPointF(0,0),r,r);}else{//boom!painter.translate(0.5*w - r,0.1*h);QRadialGradient rad(QPointF(0,0),R,QPointF(0,0));QColor base("blueviolet");base.setAlphaF(0.3);rad.setColorAt(0,base);rad.setColorAt(1,"transparent");QColor eraseColor("white");QWidget * pa = dynamic_cast<QWidget*>( parent() );if(pa){eraseColor = pa->palette().color(QPalette::Window);}painter.setBrush(rad);painter.drawEllipse(QPointF(0,0) , R , R);//畫一個固定的漸變圈painter.setBrush(QBrush(eraseColor));auto out = r + (R -r) * ( mAngle - 180) / 180;painter.drawEllipse(QPointF(0,0), out,out);//畫一個逐漸變大的圈把漸變圈覆蓋掉painter.resetTransform();painter.translate(0.25*w,0.4*h);painter.setBrush(QBrush(QColor("cornflowerblue")));painter.drawRoundedRect(QRectF(0,0,0.5*w,0.2*h),0.1*h,0.1*h);painter.setBrush(QBrush(QColor("blueviolet")));painter.translate((0.5*w - r)  , 0.1*h);painter.drawEllipse(QPointF(0,0),r,r);}}else{painter.drawRoundedRect(QRectF(0,0,0.5*w,0.2*h),0.1*h,0.1*h);painter.setBrush(QBrush(QColor("white")));painter.translate(0.5*w-r-((0.5*w-2*r) * mAngle/360),0.1*h);painter.drawEllipse(QPointF(0,0),r,r);}}
void CheckboxLollipop::mouseReleaseEvent(QMouseEvent* e){if(mAnim.state() == QAbstractAnimation::Running) return;mChecked = !mChecked;mAnim.setStartValue(0);mAnim.setEndValue(360);mAnim.start();
}CheckboxNike::CheckboxNike(QWidget *parent){setFixedSize(32,32);mAngle = 360;
}void CheckboxNike::paintEvent(QPaintEvent* e){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setPen(Qt::NoPen);const int w = width();const int h = height();const int r = 8;if(mChecked){painter.setBrush(QBrush(QColor("lightblue")));painter.drawRoundedRect(rect() , r,r);QPainterPath cover;cover.addRect(QRectF(0,0,w*mAngle/360,h));painter.setClipPath(cover);painter.setPen(Qt::white);painter.setFont(QFont("Microsoft YaHei",12));painter.drawText(rect() , Qt::AlignCenter , "?");}else{QColor baseBack("lightblue");QColor baseFront("white");baseBack.setAlphaF(1 - mAngle / 360);baseFront.setAlphaF(1 - mAngle / 360);painter.setBrush(baseBack);painter.drawRoundedRect(rect() , r,r);painter.setPen(baseFront);painter.setFont(QFont("Microsoft YaHei",12));painter.drawText(rect() , Qt::AlignCenter , "?");QPen pen(QBrush("lightblue"),4);painter.setPen(pen);painter.setBrush(Qt::NoBrush);painter.drawRoundedRect(rect().adjusted(2,2,-2,-2) , r,r);}
}
void CheckboxNike::mouseReleaseEvent(QMouseEvent* e){if(mAnim.state() == QAbstractAnimation::Running) return;mChecked = !mChecked;mAnim.setStartValue(0);mAnim.setEndValue(360);if(mChecked){mAnim.setDuration(200);}else{mAnim.setDuration(100);}mAnim.start();
}CheckboxTransform::CheckboxTransform(QWidget *parent){setFixedSize(40,40);mAngle = 360;mAnim.setDuration(200);
}void CheckboxTransform::paintEvent(QPaintEvent* e){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);QPen pen("black");pen.setWidth(2);painter.setPen(pen);painter.setBrush(Qt::NoBrush);const double w = width();const double h = height();painter.translate(0.25*w,0.75*h);static constexpr int N = 20;if(mChecked){double theta = -M_PI_4 * mAngle / 360;//在數學中,逆時針角度是正,在計算機中,y軸朝下,逆時針的角度為負數double scale = 1 - (2-sqrt(2)/2)/2 / 360 * mAngle;for(int i = 0 ;i <= N;++i){double x = 0;double y = -h/2/N * i;auto x2 = scale * ( cos(theta) * x - sin(theta) * y);auto y2 = scale * ( sin(theta) * x + cos(theta) * y);painter.drawPoint(QPointF(x2,y2));}theta *= -1;for(int i = 0;i <= N;++i){double x = w/2/N*i;double y = 0;auto x2 = scale * ( cos(theta) * x - sin(theta) * y);auto y2 = scale * ( sin(theta) * x + cos(theta) * y);painter.drawPoint(QPointF(x2,y2));}painter.resetTransform();painter.translate(0.75*w, 0.25*h);theta = atan(2.0/3) * mAngle / 360;scale = 1- (2-sqrt(3.25))/2 * mAngle / 360;double dx = -0.125*w * mAngle / 360;double dy = 0.25*h * mAngle / 360;for(int i = 0;i <= N;i++){double x = 0;double y = 0.5*h/N * i;auto x2 = scale * ( cos(theta) * x - sin(theta) * y) + dx;auto y2 = scale * ( sin(theta) * x + cos(theta) * y) + dy;painter.drawPoint(QPointF(x2,y2));}theta = -atan(1.5) * mAngle / 360;dx *= -1;dy = -0.125*h * mAngle / 360;for(int i = 0;i <= N;i++){double x = -0.5*w * i / N;double y = 0;auto x2 = scale * ( cos(theta) * x - sin(theta) * y) + dx;auto y2 = scale * ( sin(theta) * x + cos(theta) * y) + dy;painter.drawPoint(QPointF(x2,y2));}}else{double theta = M_PI_4 * mAngle / 360;double scale = 1+ (2*sqrt(2) - 1) * mAngle / 360;for(int i = 0 ;i <= N;++i){double x = -0.125*w/N * i;double y = -0.125*h/N * i;auto x2 = scale * ( cos(theta) * x - sin(theta) * y);auto y2 = scale * ( sin(theta) * x + cos(theta) * y);painter.drawPoint(QPointF(x2,y2));}theta *= -1;for(int i = 0 ;i <= N;++i){double x = 0.125*w/N * i;double y = 0.125*h/N * i;auto x2 = scale * ( cos(theta) * x - sin(theta) * y);auto y2 = scale * ( sin(theta) * x + cos(theta) * y);painter.drawPoint(QPointF(x2,y2));}painter.resetTransform();painter.translate(0.625*w, 0.5*h);theta = -atan(2.0/3) * mAngle / 360;scale = 1 + (2.0/sqrt(3.25) - 1) * mAngle / 360;double dx = 0.125*w * mAngle / 360;double dy = -0.25*h * mAngle / 360;for(int i = 0;i <= N;i++){double x = -0.25*w * i/N;double y = 0.375*h * i / N;auto x2 = scale * ( cos(theta) * x - sin(theta) * y) + dx;auto y2 = scale * ( sin(theta) * x + cos(theta) * y) + dy;painter.drawPoint(QPointF(x2,y2));}theta = atan(1.5) * mAngle / 360;dx= -0.375*w * mAngle / 360;dy = -0.25*h * mAngle / 360;for(int i = 0;i <= N;i++){double x = 0.25*w * i / N;double y = -0.375*h * i / N;auto x2 = scale * ( cos(theta) * x - sin(theta) * y) + dx;auto y2 = scale * ( sin(theta) * x + cos(theta) * y) + dy;painter.drawPoint(QPointF(x2,y2));}}
}
void CheckboxTransform::mouseReleaseEvent(QMouseEvent* e){if(mAnim.state() == QAbstractAnimation::Running) return;mChecked = !mChecked;mAnim.setStartValue(0);mAnim.setEndValue(360);mAnim.start();
}CheckboxBanner::CheckboxBanner(QWidget *parent){setFixedSize(75,30);mAnim.setDuration(300);mAngle = 360;
}void CheckboxBanner::paintEvent(QPaintEvent* e){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setPen(Qt::NoPen);const int w = width();const int h = height();if(mChecked){painter.setBrush(QBrush("lightgreen"));}else{painter.setBrush(QBrush("gray"));}QPainterPath pp;pp.moveTo(w/6,0);pp.lineTo(w,0);pp.lineTo(5.0/6*w,h);pp.lineTo(0,h);pp.lineTo(w/6,0);pp.closeSubpath();painter.drawPath(pp);QPen pen("white");pen.setWidth(4);painter.setPen(pen);painter.setFont(QFont("Microsoft YaHei",12));if(mChecked){//move to leftpainter.translate(w*(1 - sin(M_PI_2 * mAngle/360)),0);painter.drawText(QRect(0,0,w,h),Qt::AlignCenter, "ON");}else{painter.translate(w*(sin(M_PI_2 * mAngle/360) -1),0);painter.drawText(QRect(0,0,w,h),Qt::AlignCenter, "OFF");}
}
void CheckboxBanner::mouseReleaseEvent(QMouseEvent* e){if(mAnim.state() == QAbstractAnimation::Running) return;mChecked = !mChecked;mAnim.setStartValue(0);mAnim.setEndValue(360);mAnim.start();
}CheckboxMark::CheckboxMark(QWidget *parent){setFixedSize(40,40);mAnim.setDuration(300);mAngle = 360;
}void CheckboxMark::paintEvent(QPaintEvent* e){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setBrush(Qt::NoBrush);const int w = width();const int h = height();QPen pen;pen.setWidth(2);if(mChecked){pen.setColor("lightgreen");}else{pen.setColor("gray");}painter.setPen(pen);painter.translate(0,0.2*h);painter.drawRoundedRect(QRectF(0,0,0.8*w,0.8*h).adjusted(2,2,-2,-2),4,4);painter.resetTransform();painter.translate(0.125*w,0.5*h);if(mChecked){QPen pen("lightgreen");pen.setWidth(6);pen.setCapStyle(Qt::RoundCap);pen.setJoinStyle(Qt::RoundJoin);painter.setPen(pen);if(mAngle <= 120){int dw = 0.25*w * mAngle / 120;int dh = 0.25*h * mAngle / 120;painter.drawLine(0,0,dw,dh);}else{painter.drawLine(0,0,0.25*w,0.25*h);auto rat = (mAngle - 120) / 240.0;painter.resetTransform();painter.translate(0.375*w,0.75*h);int dw = 0.5*w * rat;int dh = 0.5*h * rat;painter.drawLine(0,0,dw,-dh);}}else{}}
void CheckboxMark::mouseReleaseEvent(QMouseEvent* e){if(mAnim.state() == QAbstractAnimation::Running) return;mChecked = !mChecked;mAnim.setStartValue(0);mAnim.setEndValue(360);mAnim.start();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72342.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

arm | lrzsz移植記錄

1 我的使用場景 開發板無網絡, 無奈只得用U盤拷貝文件 文件不大, 每次都插拔U盤, 很繁瑣 原來的環境不支持rz等命令 就需要移植這個命令來使用 下載地址 https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 2 編譯腳本 # 主要內容在這里 configure_for_arm(){mkdir -p $PA…

Hadoop之01:HDFS分布式文件系統

HDFS分布式文件系統 1.目標 理解分布式思想學會使用HDFS的常用命令掌握如何使用java api操作HDFS能獨立描述HDFS三大組件namenode、secondarynamenode、datanode的作用理解并獨立描述HDFS讀寫流程HDFS如何解決大量小文件存儲問題 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…

矩陣 trick 系列 題解

1.AT_dp_r Walk&#xff08;矩陣圖論&#xff09; 題意 一個有向圖有 n n n 個節點&#xff0c;編號 1 1 1 至 n n n。 給出一個二維數組 A 1... n , 1... n A_{1...n,1...n} A1...n,1...n?&#xff0c;若 A i , j 1 A_{i,j}1 Ai,j?1 說明節點 i i i 到節點 j j j …

使用AoT讓.NetFramework4.7.2程序調用.Net8編寫的庫

1、創建.Net8的庫&#xff0c;雙擊解決方案中的項目&#xff0c;修改如下&#xff0c;啟用AoT&#xff1a; <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><OutputType>Library</OutputType><PublishAot>true</PublishAot>&…

Goby 漏洞安全通告| Ollama /api/tags 未授權訪問漏洞(CNVD-2025-04094)

漏洞名稱&#xff1a;Ollama /api/tags 未授權訪問漏洞&#xff08;CNVD-2025-04094&#xff09; English Name&#xff1a;Ollama /api/tags Unauthorized Access Vulnerability (CNVD-2025-04094) CVSS core: 6.5 風險等級&#xff1a; 中風險 漏洞描述&#xff1a; O…

端到端自動駕駛——cnn網絡搭建

論文參考&#xff1a;https://arxiv.org/abs/1604.07316 demo 今天主要來看一個如何通過圖像直接到控制的自動駕駛端到端的項目&#xff0c;首先需要配置好我的仿真環境&#xff0c;下載軟件udacity&#xff1a; https://d17h27t6h515a5.cloudfront.net/topher/2016/November…

藍橋杯試題:二分查找

一、問題描述 給定 n 個數形成的一個序列 a&#xff0c;現定義如果一個連續子序列包含序列 a 中所有不同元素&#xff0c;則該連續子序列便為藍橋序列&#xff0c;現在問你&#xff0c;該藍橋序列長度最短為多少&#xff1f; 例如 1 2 2 2 3 2 2 1&#xff0c;包含 3 個不同的…

網絡空間安全(7)攻防環境搭建

一、搭建前的準備 硬件資源&#xff1a;至少需要兩臺計算機&#xff0c;一臺作為攻擊機&#xff0c;用于執行攻擊操作&#xff1b;另一臺作為靶機&#xff0c;作為被攻擊的目標。 軟件資源&#xff1a; 操作系統&#xff1a;如Windows、Linux等&#xff0c;用于安裝在攻擊機和…

DeepSpeek服務器繁忙?這幾種替代方案幫你流暢使用!(附本地部署教程)

作者&#xff1a;后端小肥腸 目錄 1. 前言 2. 解決方案 2.1. 納米AI搜索&#xff08;第三方平臺&#xff09; 2.2. Github&#xff08;第三方平臺&#xff09; 2.3. 硅基流動&#xff08;第三方API&#xff09; 3. 本地部署詳細步驟 3.1. 運行配置需求 3.2. 部署教程 4…

prisma+supabase報錯無法查詢數據

解決方案&#xff0c;在DATABASE_URL后面增加?pgbouncertrue

c語言中return 數字代表的含義

return 數字的含義&#xff1a;表示函數返回一個整數值&#xff0c;通常用于向調用者&#xff08;如操作系統或其他程序&#xff09;傳遞程序的執行狀態或結果。 核心規則&#xff1a; return 0&#xff1a; 含義&#xff1a;表示程序或函數正常結束。 示例&#xff1a; int m…

Spark內存迭代計算

一、寬窄依賴 窄依賴&#xff1a;父RDD的一個分區數據全部發往子RDD的一個分區 寬依賴&#xff1a;父RDD的一個分區數據發往子RDD的多個分區&#xff0c;也稱為shuffle 二、Spark是如何進行內存計算的&#xff1f;DAG的作用&#xff1f;Stage階段劃分的作用&#xff1f; &a…

Linux知識-第一天

Linux的目錄機構為一個樹型結構 其沒有盤符這個概念&#xff0c;只有一個根目錄&#xff0c;所有文件均在其之下 在Linux系統中&#xff0c;路徑之間的層級關系 使用 / 開頭表示根目錄&#xff0c;后面的表示層級關系 Linux命令入門 Linux命令基礎 Linux命令通用格式 comman…

QT實現單個控制點在曲線上的貝塞爾曲線

最終效果: 一共三個文件 main.cpp #include <QApplication> #include "SplineBoard.h" int main(int argc,char** argv) {QApplication a(argc, argv);SplineBoard b;b.setWindowTitle("標準的貝塞爾曲線");b.show();SplineBoard b2(0.0001);b2.sh…

繪制思維導圖畫布選型

在實現思維導圖/知識圖譜的繪制時&#xff0c;選擇合適的「畫布」技術方案至關重要。以下是不同技術路線的對比分析和推薦方案&#xff1a; 一、技術方案對比 技術類型實現方式優點缺點適用場景普通DOM元素使用<div>CSS布局&#x1f539; 開發簡單&#x1f539; 天然支持…

運維Splunk面試題及參考答案

目錄 通過轉發器導入數據的優勢有哪些(如帶寬控制、負載均衡等) 描述 Universal Forwarder 與 Heavy Forwarder 的差異 如何配置轉發器實現數據的過濾與預處理 轉發器的本地緩存機制如何保證數據可靠性 如何通過部署服務器統一管理多個轉發器的配置 什么是 “查找表(L…

年后寒假總結及計劃安排

年后寒假總結 年后主要學習了微服務&#xff0c;nacos (服務注冊中心)&#xff0c;feign&#xff08;遠程調用&#xff09;&#xff0c;網關&#xff0c;雙token&#xff08;相較于之前更加規范&#xff0c;更加符合企業級&#xff09;&#xff0c;配置管理 &#xff0c;mybati…

word中交叉引用多篇參考文獻格式[1-2]或[1-4]操作

劃重點 更改左域名&#xff0c;輸入 \#"[0" 更改中間域名&#xff0c;輸入\#"" 更改右域名&#xff0c;輸入 \#"0]" 1.[2-3]格式 首先點擊交叉引用&#xff0c;引用參考文獻 右擊鼠標&#xff0c;點擊切換域代碼&#xff0c;對于左域名 刪除 * …

【銀河麒麟高級服務器操作系統】服務器測試業務耗時問題分析及處理全流程分享

更多銀河麒麟操作系統產品及技術討論&#xff0c;歡迎加入銀河麒麟操作系統官方論壇 https://forum.kylinos.cn 了解更多銀河麒麟操作系統全新產品&#xff0c;請點擊訪問 麒麟軟件產品專區&#xff1a;https://product.kylinos.cn 開發者專區&#xff1a;https://developer…

opencv 模板匹配方法匯總

在OpenCV中&#xff0c;模板匹配是一種在較大圖像中查找特定模板圖像位置的技術。OpenCV提供了多種模板匹配方法&#xff0c;通過cv2.matchTemplate函數實現&#xff0c;該函數支持的匹配方式主要有以下6種&#xff0c;下面詳細介紹每種方法的原理、特點和適用場景。 1. cv2.T…