TiDB Operator 和 Operator Dashboard

这篇具有很好参考价值的文章主要介绍了TiDB Operator 和 Operator Dashboard。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

V1

为了演示如何编写 TiDB Operator 和 Operator Dashboard,我们将分别介绍它们的概念和实现。

TiDB Operator

TiDB Operator 是一种 Kubernetes Operator,它负责在 Kubernetes 上部署和管理 TiDB 集群。它可以自动化管理 TiDB 集群的生命周期,包括创建、扩容、缩容和升级等操作。

概念

TiDB Operator 的核心概念包括:

  • TiDBCluster:一个 TiDB 集群的抽象,包括 TiDB、TiKV 和 PD 组件。
  • TiDBMonitor:一个 TiDB 集群的监控组件,它可以采集集群的监控数据,并提供可视化的监控界面。
  • TiDBBackup:一个 TiDB 集群的备份组件,它可以将集群数据备份到云存储或本地存储中。

实现

为了实现 TiDB Operator,我们需要完成以下工作:

  1. 编写 CRD(Custom Resource Definition)文件,定义 TiDBCluster、TiDBMonitor 和 TiDBBackup 的资源模型和 API。
  2. 编写 Controller,监听 TiDBCluster、TiDBMonitor 和 TiDBBackup 的事件,并根据事件类型执行相应的操作。
  3. 编写 Operator 的部署文件,将 Controller 部署到 Kubernetes 集群中。

下面是一个简单的 TiDBCluster CRD 的定义:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: tidbclusters.pingcap.com
spec:
  group: pingcap.com
  version: v1alpha1
  scope: Namespaced
  names:
    plural: tidbclusters
    singular: tidbcluster
    kind: TiDBCluster
  subresources:
    status: {}
  additionalPrinterColumns:
    - name: Phase
      type: string
      description: The current phase of the TiDB Cluster.
      JSONPath: .status.phase

这段代码定义了一个 Kubernetes 自定义资源类型 TiDBCluster。

  • apiVersion: 定义 YAML 文件使用的 Kubernetes API 版本。
  • kind: 定义了 CustomResourceDefinition 对象的类型。
  • metadata: 定义了资源对象的元数据,包括名称和标签等。
  • spec: 定义了资源对象的规范,包括 API 组、版本、作用域和名称等。
  • group: 定义 API 组的名称。
  • version: 定义 API 版本的名称。
  • scope: 定义资源对象的作用域,这里是 Namespaced,表示它是一个命名空间级别的资源。
  • names: 定义了资源对象的名称,包括复数形式、单数形式和类型名称。
  • subresources: 定义了资源对象的子资源,这里只定义了状态子资源。
  • additionalPrinterColumns: 定义了额外的输出列,这里只定义了一个名为 Phase 的列,用于显示 TiDB Cluster 的当前状态。

在 Controller 中,我们需要监听 TiDBCluster 的事件,并根据事件类型执行相应的操作。例如,当 TiDBCluster 被创建时,我们需要创建 TiDB、TiKV 和 PD 组件:

func (r *TiDBClusterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
    // 获取 TiDBCluster 对象
    var tc tidbv1alpha1.TiDBCluster
    if err := r.Get(ctx, req.NamespacedName, &tc); err != nil {
        if errors.IsNotFound(err) {
            // TiDBCluster 被删除,忽略该事件
            return ctrl.Result{}, nil
        }
        // 处理错误
        return ctrl.Result{}, err
    }

    // 判断 TiDBCluster 是否已经被删除
    if !tc.ObjectMeta.DeletionTimestamp.IsZero() {
        // TiDBCluster 已经被删除,执行清理操作
        return r.cleanup(ctx, tc)
    }

    // 判断 TiDBCluster 是否已经创建
    if tc.Status.Phase == "" {
        // TiDBCluster 还没有创建,创建 TiDB、TiKV 和 PD 组件
        return r.create(ctx, tc)
    }

    // 更新 TiDBCluster 状态
    return r.updateStatus(ctx, tc)
}

在 create 函数中,我们使用 Helm Chart 创建 TiDB、TiKV 和 PD 组件:

func (r *TiDBClusterReconciler) create(ctx context.Context, tc tidbv1alpha1.TiDBCluster) (ctrl.Result, error) {
    // 安装 TiDB、TiKV 和 PD 组件
    if err := r.installComponents(ctx, tc); err != nil {
        return ctrl.Result{}, err
    }

    // 更新 TiDBCluster 状态
    tc.Status.Phase = "Running"
    if err := r.Status().Update(ctx, &tc); err != nil {
        return ctrl.Result{}, err
    }

    return ctrl.Result{}, nil
}

func (r *TiDBClusterReconciler) installComponents(ctx context.Context, tc tidbv1alpha1.TiDBCluster) error {
    // 使用 Helm Chart 安装 TiDB、TiKV 和 PD 组件
    chartPath := filepath.Join("charts", "tidb-operator")
    chart, err := loader.Load(chartPath)
    if err != nil {
        return err
    }
    vals := map[string]interface{}{
        "clusterName": tc.Name,
        "pd": map[string]interface{}{
            "replicas": tc.Spec.PD.Replicas,
        },
        "tikv": map[string]interface{}{
            "replicas": tc.Spec.TiKV.Replicas,
        },
        "tidb": map[string]interface{}{
            "replicas": tc.Spec.TiDB.Replicas,
        },
    }
    installer := action.NewInstall(&action.Configuration{})
    _, err = installer.Run(chart, vals)
    if err != nil {
        return err
    }

    return nil
}

Operator Dashboard

Operator Dashboard 是 TiDB Operator 的可视化管理界面,它可以帮助用户更方便地管理 TiDB 集群。它提供了 TiDB 集群的状态监控、配置管理、备份恢复等功能。

概念

Operator Dashboard 的核心概念包括:

  • TiDBCluster 状态监控:展示 TiDB 集群的运行状态、监控数据等信息。
  • TiDBCluster 配置管理:允许用户修改 TiDB 集群的配置,包括 TiDB、TiKV 和 PD 的配置。
  • TiDBCluster 备份恢复:允许用户备份和恢复 TiDB 集群数据。

实现

为了实现 Operator Dashboard,我们需要完成以下工作:

  1. 编写前端代码,实现 TiDBCluster 状态监控、配置管理和备份恢复等功能。
  2. 编写后端代码,实现与 TiDB Operator 的交互,并提供 REST API。
  3. 部署前端和后端代码,构建 Operator Dashboard。

下面是一个简单的 TiDBCluster 状态监控的前端代码:

<!DOCTYPE html>
<html>
<head>
  <title>TiDBCluster Dashboard</title>
  <script src="https://cdn.jsdelivr.net/npm/echarts@5.2.1/dist/echarts.min.js"></script>
</head>
<body>
  <div id="chart" style="width: 600px; height: 400px;"></div>
  <script>
    var chart = echarts.init(document.getElementById('chart'));
    chart.setOption({
      title: {
        text: 'TiDBCluster Monitoring',
      },
      tooltip: {
        trigger: 'axis',
      },
      legend: {
        data: ['TiDB', 'TiKV', 'PD'],
      },
      xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
      },
      yAxis: {
        type: 'value',
      },
      series: [
        {
          name: 'TiDB',
          type: 'line',
          data: [820, 932, 901, 934, 1290, 1330, 1320],
        },
        {
          name: 'TiKV',
          type: 'line',
          data: [820, 932, 901, 934, 1290, 1330, 1320],
        },
        {
          name: 'PD',
          type: 'line',
          data: [820, 932, 901, 934, 1290, 1330, 1320],
        },
      ],
    });
  </script>
</body>
</html>

在后端代码中,我们需要提供 REST API,该 API 可以获取 TiDBCluster 的状态数据:

func getTiDBClusterStatus(w http.ResponseWriter, r *http.Request) {
    // 获取 TiDBCluster 对象
    var tc tidbv1alpha1.TiDBCluster
    if err := r.Get(ctx, req.NamespacedName, &tc); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // 返回 TiDBCluster 状态数据
    data := map[string]interface{}{
        "phase": tc.Status.Phase,
        "tikv": map[string]interface{}{
            "replicas":    tc.Status.TiKV.Replicas,
            "available":   tc.Status.TiKV.AvailableReplicas,
            "unavailable": tc.Status.TiKV.UnavailableReplicas,
        },
        "pd": map[string]interface{}{
            "replicas":    tc.Status.PD.Replicas,
            "available":   tc.Status.PD.AvailableReplicas,
            "unavailable": tc.Status.PD.UnavailableReplicas,
        },
        "tidb": map[string]interface{}{
            "replicas":    tc.Status.TiDB.Replicas,
            "available":   tc.Status.TiDB.AvailableReplicas,
            "unavailable": tc.Status.TiDB.UnavailableReplicas,
        },
    }

    // 返回数据
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(data)
}

最后,我们需要将前端和后端代码一起打包,并部署到 Kubernetes 集群中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: operator-dashboard
spec:
  replicas: 1
  selector:
    matchLabels:
      app: operator-dashboard
  template:
    metadata:
      labels:
        app: operator-dashboard
    spec:
      containers:
        - name: frontend
          image: operator-dashboard-frontend:latest
          ports:
            - name: http
              containerPort: 80
        - name: backend
          image: operator-dashboard-backend:latest
          env:
            - name: TIDB_OPERATOR_ENDPOINT
              value: "http://tidb-operator:2379"
          ports:
            - name: http
              containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: operator-dashboard
spec:
  selector:
    app: operator-dashboard
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: http
    - name: api
      protocol: TCP
      port: 8080
      targetPort: http

V2

思路

可以为您提供一个大致的指导,帮助您编写一个 TiDB ARM 的 Operator 和 Operator Dashboard。

  1. TiDB ARM Operator

TiDB ARM Operator 可以使用 Operator SDK 和 Helm Charts 来创建。以下是 TiDB ARM Operator 的大致步骤:

  • 创建一个新的 Operator 项目
  • 使用 Helm Chart 来定义 TiDB ARM 的安装和升级过程
  • 在 Operator 中创建 Custom Resource Definition (CRD),以便用户可以使用 kubectl apply 命令来创建 TiDB ARM 集群
  • 在 Operator 中实现逻辑,以便在 CRD 创建或更新时,调用 Helm Chart 安装或升级 TiDB ARM
  • 在 Operator 中实现逻辑,以便在 CRD 删除时,调用 Helm Chart 卸载 TiDB ARM
  1. TiDB ARM Operator Dashboard

TiDB ARM Operator Dashboard 可以使用 React 和 Kubernetes API 来创建。以下是 TiDB ARM Operator Dashboard 的大致步骤:

  • 创建一个新的 React 项目
  • 使用 Kubernetes API 来获取 TiDB ARM 集群的状态和信息
  • 在 Dashboard 中实现逻辑,以便用户可以查看 TiDB ARM 集群的状态、监控数据和日志
  • 在 Dashboard 中实现逻辑,以便用户可以执行操作,如扩容、升级、备份和恢复 TiDB ARM 集群

以上是大致的步骤,具体实现可能会有所不同。希望这些指导能够帮助您编写 TiDB ARM Operator 和 Operator Dashboard。

实例代码

可以为您提供一些示例代码,并加上注释来帮助您理解代码。

TiDB ARM Operator

以下是使用 Operator SDK 和 Helm Charts 创建 TiDB ARM Operator 的步骤:

  1. 创建一个新的 Operator 项目:
operator-sdk init --plugins=helm --domain=mycompany.com --group=tidb --version=v1alpha1 --kind=TidbCluster

这个命令将创建一个新的 Operator 项目,其中包括 CRD 和控制器代码。--plugins=helm 表示我们将使用 Helm Charts 来定义 TiDB ARM 的安装和升级过程。--domain=mycompany.com 表示您的公司域名,--group=tidb 表示您的 Operator 的 API 组名,--version=v1alpha1 表示 API 版本,--kind=TidbCluster 表示自定义资源的类型。

  1. 使用 Helm Chart 来定义 TiDB ARM 的安装和升级过程:

deploy/charts 目录中创建一个 Helm Chart,定义 TiDB ARM 的安装和升级过程。

Helm Chart 是一种 Kubernetes 应用程序包管理器,它可以定义一组 Kubernetes 资源,以便在 Kubernetes 上安装、升级和卸载应用程序。在 deploy/charts 目录中创建一个 Helm Chart,定义 TiDB ARM 的安装和升级过程。

  1. 在 Operator 中创建 Custom Resource Definition (CRD):

api/v1alpha1/tidbcluster_types.go 中创建 CRD,定义 TiDB ARM 集群的规范。

CRD 是 Kubernetes API 的一部分,它允许您定义自定义资源的 API 规范。在 api/v1alpha1/tidbcluster_types.go 中创建 CRD,定义 TiDB ARM 集群的规范。

以下是 tidbcluster_types.go 的示例代码:

// TidbClusterSpec defines the desired state of TidbCluster
type TidbClusterSpec struct {
    // Size is the size of the TiDB ARM cluster
    Size int32 `json:"size"`

    // Version is the version of TiDB ARM to be installed
    Version string `json:"version"`

    // StorageClassName is the name of the storage class to use for TiDB ARM storage
    StorageClassName string `json:"storageClassName"`
}

// TidbClusterStatus defines the observed state of TidbCluster
type TidbClusterStatus struct {
    // Nodes is the list of TiDB ARM nodes
    Nodes []string `json:"nodes"`

    // Version is the actual version of TiDB ARM installed
    Version string `json:"version"`

    // Conditions describes the current state of the TiDB ARM cluster
    Conditions []metav1.Condition `json:"conditions"`
}

// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:resource:path=tidbclusters,scope=Namespaced,shortName=tc

// TidbCluster is the Schema for the tidbclusters API
type TidbCluster struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   TidbClusterSpec   `json:"spec,omitempty"`
    Status TidbClusterStatus `json:"status,omitempty"`
}

// +kubebuilder:object:root=true

// TidbClusterList contains a list of TidbCluster
type TidbClusterList struct {
    metav1.TypeMeta `json:",inline"`
    metav1.ListMeta `json:"metadata,omitempty"`
    Items           []TidbCluster `json:"items"`
}
  1. 在 Operator 中实现逻辑:

controllers/tidbcluster_controller.go 中实现逻辑,以便在 CRD 创建或更新时,调用 Helm Chart 安装或升级 TiDB ARM;在 CRD 删除时,调用 Helm Chart 卸载 TiDB ARM。

以下是 tidbcluster_controller.go 的示例代码:

// Reconcile reads that state of the cluster for a TidbCluster object and makes changes based on the state read
// and what is in the TidbCluster.Spec
func (r *TidbClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    // Fetch the TidbCluster instance
    var tc v1alpha1.TidbCluster
    if err := r.Get(ctx, req.NamespacedName, &tc); err != nil {
        return ctrl.Result{}, client.IgnoreNotFound(err)
    }

    // Get the Helm release name for this TidbCluster
    releaseName := tc.Name

    // Get the namespace for this TidbCluster
    namespace := tc.Namespace

    // Get the values for the Helm Chart
    values := map[string]interface{}{
        "size":              tc.Spec.Size,
        "version":           tc.Spec.Version,
        "storageClassName":  tc.Spec.StorageClassName,
    }

    // Get the chart directory
    chartDir := filepath.Join(r.ChartDir, "tidb-arm")

    // Get the chart values
    chartValues, err := chartutil.ValuesFromMap(values)
    if err != nil {
        return ctrl.Result{}, err
    }

    // Install or upgrade the Helm Chart
    release, err := r.HelmClient.InstallOrUpgrade(releaseName, chartDir, namespace, chartValues)
    if err != nil {
        return ctrl.Result{}, err
    }

    // Update the TidbCluster status
    tc.Status.Nodes = release.Resources
    tc.Status.Version = release.Chart.Metadata.Version
    tc.Status.Conditions = []metav1.Condition{
        {
            Type:               "Ready",
            Status:             metav1.ConditionTrue,
            LastTransitionTime: metav1.Now(),
        },
    }
    if err := r.Status().Update(ctx, &tc); err != nil {
        return ctrl.Result{}, err
    }

    return ctrl.Result{}, nil
}

在这个控制器中,我们首先获取了 TidbCluster 实例,然后获取了 Helm 发布名称、命名空间和值。然后,我们使用 Helm 客户端来安装或升级 Helm Chart。最后,我们更新了 TidbCluster 的状态。

TiDB ARM Operator Dashboard

以下是使用 React 和 Kubernetes API 创建 TiDB ARM Operator Dashboard 的步骤:

  1. 创建一个新的 React 项目:
npx create-react-app tidb-arm-operator-dashboard

这个命令将创建一个新的 React 项目。

  1. 使用 Kubernetes API 来获取 TiDB ARM 集群的状态和信息:

使用 Kubernetes API 来获取 TiDB ARM 集群的状态和信息。您可以使用 Kubernetes API 客户端库,如 @kubernetes/client-node

以下是获取 TiDB ARM 集群状态和信息的示例代码:

const kc = new k8s.KubeConfig();
kc.loadFromDefault();

const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
const tidbApi = kc.makeApiClient(k8s.CustomObjectsApi);

const tidbClusterList = await tidbApi.listNamespacedCustomObject(
    'tidb.pingcap.com',
    'v1alpha1',
    'default',
    'tidbclusters'
);

const podList = await k8sApi.listPodForAllNamespaces();

const serviceList = await k8sApi.listServiceForAllNamespaces();
  1. 在 Dashboard 中实现逻辑:

在 Dashboard 中实现逻辑,以便用户可以查看 TiDB ARM 集群的状态、监控数据和日志;以及执行操作,如扩容、升级、备份和恢复 TiDB ARM 集群。

以下是获取 TiDB ARM 集群状态和信息的示例代码:

import React, { useState, useEffect } from 'react';
import * as k8s from '@kubernetes/client-node';

const kc = new k8s.KubeConfig();
kc.loadFromDefault();

const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
const tidbApi = kc.makeApiClient(k8s.CustomObjectsApi);

function App() {
  const [tidbClusters, setTidbClusters] = useState([]);
  const [pods, setPods] = useState([]);
  const [services, setServices] = useState([]);

  useEffect(() => {
    const fetchTidbClusters = async () => {
      const tidbClusterList = await tidbApi.listNamespacedCustomObject(
        'tidb.pingcap.com',
        'v1alpha1',
        'default',
        'tidbclusters'
      );
      setTidbClusters(tidbClusterList.body.items);
    };
    const fetchPods = async () => {
      const podList = await k8sApi.listPodForAllNamespaces();
      setPods(podList.body.items);
    };
    const fetchServices = async () => {
      const serviceList = await k8sApi.listServiceForAllNamespaces();
      setServices(serviceList.body.items);
    };
    fetchTidbClusters();
    fetchPods();
    fetchServices();
  }, []);

  return (
    <div>
      <h1>TiDB ARM Operator Dashboard</h1>
      <h2>TiDB ARM Clusters</h2>
      <ul>
        {tidbClusters.map((tc) => (
          <li key={tc.metadata.name}>
            {tc.metadata.name} ({tc.status.phase})
          </li>
        ))}
      </ul>
      <h2>Pods</h2>
      <ul>
        {pods.map((pod) => (
          <li key={pod.metadata.name}>
            {pod.metadata.namespace}/{pod.metadata.name} ({pod.status.phase})
          </li>
        ))}
      </ul>
      <h2>Services</h2>
      <ul>
        {services.map((svc) => (
          <li key={svc.metadata.name}>
            {svc.metadata.namespace}/{svc.metadata.name} ({svc.spec.type})
          </li>
        ))}
      </ul>
    </div>
  );
}

export default App;

在这个示例中,我们使用 useStateuseEffect 钩子来获取 TiDB ARM 集群、Pod 和服务的状态和信息。然后,我们在页面上显示这些信息。文章来源地址https://www.toymoban.com/news/detail-430079.html

到了这里,关于TiDB Operator 和 Operator Dashboard的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Idea Community社区版如何添加Run Dashboard

    最近在学习spring cloud,跟着视频添加run dashboard,发现里面介绍的方法无法适用于idea community(社区版)。 然后自己研究了一下,成功添加,下面分享自己的方法。 如图,我的项目里添加了两个module,我想通过run dashboard同时启动这两个module 注:每个module都有@SpringBootApplication主方

    2024年01月24日
    浏览(40)
  • IDEA中run Dashboard面板如何出现?实现批量运行微服务

    目录 前言 一、应用场景 在我们使用微服务做架构的时候,会出现多个工程模块同时启动,所以如果要启动多个服务的话,那如何查看控制台呢? 二、查看idea中是否有service 2.1添加service实现run Dashboard面板  2.2没有service情况 1:需要找到自己的项目路径下的 -------------------》

    2024年02月03日
    浏览(48)
  • minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案_已设置图床

    此处运行排查问题 检查一下节点日志 把节点需要的镜像拉取了就好,这边给出本人使用的解决方法,比较拐弯莫叫,仅供参考 拉取了所需要的镜像到本地 接下来把这个镜像制作成压缩包 在当前终端运行这个来使得当前终端的镜像构建与minikube同步,这个命令可以将本地的镜

    2024年02月07日
    浏览(41)
  • Photoshop如何使用通道之实例演示?

      因科研等多场景需要进行绘图处理,笔者对PS进行了学习,本文通过《Photoshop2021入门教程》及其配套素材结合网上相关资料进行学习笔记总结,本文对通道使用进行阐述。    最终结果图       (1)准备素材       (2)将素材导入PS       (3)执行“图层

    2024年02月02日
    浏览(33)
  • 如何使用 PowerPoint 2021 制作演示文稿(PPT)?

    软件安装: 办公神器office2021安装教程,让你快速上手_正经人_____的博客-CSDN博客   引言         PowerPoint 是一款非常常用的演示文稿制作工具,它可以帮助您创建漂亮的幻灯片,展示您的想法和信息。如果您是 PowerPoint 的新手,下面是一些入门指南,以帮助您使用 Powe

    2024年02月10日
    浏览(60)
  • PhotoShop如何使用图层之实例演示?

      因科研等多场景需要进行绘图处理,笔者对PS进行了学习,本文通过《Photoshop2021入门教程》及其配套素材结合网上相关资料进行学习笔记总结,本文对图层使用进行阐述。    最终结果图       (1)准备素材    ①背景       ②阴影       ③书籍   

    2024年02月01日
    浏览(33)
  • OpenCV标定演示,及如何生成标定板图片

    标定的程序在官方的源码里有, opencv-4.5.5samplescpptutorial_codecalib3dcamera_calibration 很多小白不知道怎么跑起来,这个也怪OpenCV官方,工作没做完善,其实的default.xml是要自己手动改的,输入的图片也要自己去拍摄,还有那个VID5.xml也要改成可以直接找到图片的路径; 我这里拍

    2024年02月06日
    浏览(33)
  • Photoshop如何使用蒙版之实例演示?

      因科研等多场景需要进行绘图处理,笔者对PS进行了学习,本文通过《Photoshop2021入门教程》及其配套素材结合网上相关资料进行学习笔记总结,本文对蒙版使用进行阐述。    最终结果图       (1)准备素材    ①素材01       ②素材02       (2)将素材

    2024年02月06日
    浏览(44)
  • 随手笔记——演示如何提取 ORB 特征并进行匹配

    演示如何提取 ORB 特征并进行匹配 特征点由关键点(Key-point)和描述子(Descriptor)两部分组成。 ORB 特征亦由关键点和描述子两部分组成。它的关键点称为“Oriented FAST”,是一种改进的 FAST 角点。它的描述子称为 BRIEF(Binary Robust Independent Elementary Feature)。因此,提取ORB 特征

    2024年02月16日
    浏览(39)
  • 如何使用 ChatGPT 将文本转换为 PowerPoint 演示文稿

    推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 第一步涉及指示 ChatGPT 根据给定的文本生成具有特定数量幻灯片的演示文稿。首先,您必须向 ChatGPT 提供要转换的文本。 使用以下提示指示 ChatGPT 创建演示文稿: 请将以下文本转换为十张幻灯片的演示文稿:

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包