python里的demo是什么_Python类demo详解

Dog类,赋予每条小狗蹲下(sit())和打滚(roll_over())的能力

dog.py源码:

class Dog():

"""一次模拟小狗的简单尝试"""

def __init__(self, name, age):   """注意这里一共是4个_"""

"""初始化属性name和age"""

self.name = name

self.age = age

def sit(self):

"""模拟小狗被命令时蹲下"""

print(self.name.title() + " is now sitting.")

def roll_over(self):

"""模拟小狗被命令时打滚"""

print(self.name.title() + "rolled over!")

Dog类名:在python中,首字母大写的名称指的是类;这个类定义中的括号是空的,因为我们要从空白创建这个类。

"""一次模拟小狗的简单尝试""":文档字符串,对这个类的功能作了描述。

1、方法_init_()

类中的函数都成为方法;前面学习的函数的一切都使用于方法。

_init_()是一个特殊的方法,没当你根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中。开头和末尾有两个下划线,这是一种约定,旨在避免python默认方法与普通方法冲突。

我们将方法_init_定义成了包含三个参数:self、name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面。因为Python调用这个_init_方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,每个与类相关联的方法调用都自动传递实参self。它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

我们创建Dog实例时,Python将调用Dog类的方法_init_()。我们将通过实参向Dog()传递名字和年龄;self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。

self.name = name和selg.age = age 定义的变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。self.name = name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的示例。self.age = age的作用与此类似。像这样可以通过实例访问的变量称为属性。

Dog还定义了另外两个方法sit()和roll_over()。由于这些方法不需要额外的信息,如名字或年龄,因此他们只有一个形参self。我们后边将创建的实例能够访问这些方法,换句话说,它们都会蹲下和打滚。

在同一个文件中执行如下代码即创建了一个实例。

print("My dog's name is "+my_dog.name.title()+".")

print("My dog is " + str(my_dog.age)+" years old.\n\n")

my_dog.sit()

my_dog.roll_over()

输出结果:

上述例子中用到了双引号,单引号和3个双引号。双引号(" 字符串 ")和单引号( '字符串' )都用来表示一个字符串,无区别。三个双引号( """注释""" )用来表示注释。

他们区别参考链接:https://blog.csdn.net/woainishifu/article/details/76105667

===================注意事项==========================

1、类中的每个属性都必须又初始值,哪怕这个值是0或空字符串。

在某些情况下,如设置默认值时,在方法__init__内指定这种初始值是可行的;

如果你对某个属性这样做了,就无需包含为它提供初始值的形参。

eg: def __init__ (self, make)

self.make = make

self.model = model

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
demo.py 是 LoFTR 算法的主要测试文件,用于演示 LoFTR 算法在图像匹配和三维重建任务上的效果,下面我将对其中的关键代码进行详细解释。 首先是导入必要的包和模块: ```python import os import sys import time import argparse import numpy as np import cv2 import torch import matplotlib.pyplot as plt from utils.tools import ( Timer, str2bool, load_image, plot_keypoints, plot_matches, plot_reprojection, plot_trajectory, save_trajectory, ) from utils.evaluation import compute_repeatability, compute_precision_recall from models.loftr import LoFTR, default_cfg ``` 其中 `os`、`sys`、`time`、`argparse`、`numpy`、`cv2`、`torch`、`matplotlib.pyplot` 都是 Python 常用的标准库或第三方库,此处不再赘述。`plot_keypoints`、`plot_matches`、`plot_reprojection` 和 `plot_trajectory` 是自定义的用于可视化结果的函数。`compute_repeatability` 和 `compute_precision_recall` 是用于评估匹配和重建结果的函数,详见 `evaluation.py` 文件。`LoFTR` 是 LoFTR 模型的主要,`default_cfg` 是 LoFTR 模型的默认配置。 然后是解析命令行参数: ```python parser = argparse.ArgumentParser( description="LoFTR: Detector-Suppressor for 3D Local Features", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) parser.add_argument("img0_path", type=str, help="path to the reference image") parser.add_argument("img1_path", type=str, help="path to the query image") parser.add_argument("--weights", type=str, default=default_cfg["weights"], help="path to the pretrained model weights") parser.add_argument("--cfg", type=str, default=default_cfg["cfg"], help="path to the config file") parser.add_argument("--matcher", type=str, default=default_cfg["matcher"], help="feature matcher") parser.add_argument("--suppression", type=str, default=default_cfg["suppression"], help="feature suppressor") parser.add_argument("--top_k", type=int, default=default_cfg["top_k"], help="keep top_k keypoints") parser.add_argument("--max_length", type=int, default=default_cfg["max_length"], help="maximum sequence length") parser.add_argument("--resize", type=str2bool, nargs="?", const=True, default=True, help="resize input images") parser.add_argument("--show", type=str2bool, nargs="?", const=True, default=False, help="show results") parser.add_argument( "--eval", type=str2bool, nargs="?", const=True, default=False, help="evaluate repeatability and matching performance" ) parser.add_argument("--output_dir", type=str, default="outputs", help="output directory") args = parser.parse_args() ``` 其中 `img0_path` 和 `img1_path` 分别表示参考图像和查询图像的路径。`weights`、`cfg`、`matcher`、`suppression`、`top_k`、`max_length` 分别表示 LoFTR 模型的权重文件、配置文件、特征匹配器、特征抑制器、保留的关键点数量、序列的最大长度。`resize`、`show`、`eval`、`output_dir` 分别表示是否对输入图像进行缩放、是否显示结果、是否评估性能、输出结果的目录。 接下来是读取图像并将其转换为张量: ```python img0 = load_image(args.img0_path, resize=args.resize) img1 = load_image(args.img1_path, resize=args.resize) ``` 其中 `load_image` 函数用于加载图像,将其转换为 BGR 格式,并将其缩放到固定大小,返回值是一个 `torch.Tensor` 对象。 然后是加载 LoFTR 模型: ```python loftr = LoFTR(args.cfg, args.weights, args.matcher, args.suppression, args.top_k, args.max_length) ``` 这调用了 `LoFTR` ,传入参数表示加载指定的配置文件、权重文件、特征匹配器、特征抑制器、保留的关键点数量和序列的最大长度。该主要包含以下方法: - `__init__(self, cfg, weights, matcher, suppression, top_k, max_length)`:初始化函数,加载模型权重和配置文件。 - `extract_features(self, img)`:提取图像的局部特征,返回值是一个元组 `(keypoints, descriptors)`,其中 `keypoints` 是关键点坐标,`descriptors` 是关键点特征描述子。 - `match(self, ref_feats, query_feats)`:在参考图像和查询图像的局部特征之间进行匹配,返回值是一个元组 `(matches_ref, matches_query)`,其中 `matches_ref` 是参考图像中的匹配点坐标,`matches_query` 是查询图像中的匹配点坐标。 - `reconstruct(self, ref_img, ref_feats, query_img, query_feats, matches)`:利用 LoFTR 算法进行三维重建,返回值是一个元组 `(R, t, pts_ref, pts_query, pts_3d)`,其中 `R` 和 `t` 是参考图像到查询图像的旋转矩阵和平移向量,`pts_ref` 和 `pts_query` 是参考图像和查询图像中的匹配点坐标,`pts_3d` 是三维重建得到的点云坐标。 接下来是提取图像的局部特征: ```python timer = Timer() timer.start() kpts0, desc0 = loftr.extract_features(img0) kpts1, desc1 = loftr.extract_features(img1) timer.stop('extract features') ``` 这调用了 `extract_features` 方法,传入参数是加载的 LoFTR 模型和图像张量,返回值是两个元组 `(keypoints, descriptors)`,分别表示两幅图像的关键点坐标和特征描述子。这还使用了 `Timer` 来统计函数运行时间,方便后面的性能评估。 然后是在两幅图像之间进行特征匹配: ```python timer.start() matches0, matches1 = loftr.match((kpts0, desc0), (kpts1, desc1)) timer.stop('match features') ``` 这调用了 `match` 方法,传入参数是两个元组 `(keypoints, descriptors)`,分别表示参考图像和查询图像的关键点坐标和特征描述子。返回值也是两个元组 `(matches_ref, matches_query)`,分别表示参考图像和查询图像中的匹配点坐标。这同样使用了 `Timer` 来统计函数运行时间。 接下来是在两幅图像之间进行三维重建: ```python timer.start() R, t, pts0, pts1, pts3d = loftr.reconstruct(img0, (kpts0, desc0), img1, (kpts1, desc1), (matches0, matches1)) timer.stop('reconstruct 3D') ``` 这调用了 `reconstruct` 方法,传入参数是参考图像、参考图像的局部特征、查询图像、查询图像的局部特征和两幅图像之间的匹配点坐标。返回值是一个元组 `(R, t, pts0, pts1, pts3d)`,分别表示参考图像到查询图像的旋转矩阵和平移向量,两幅图像中的匹配点坐标和三维重建得到的点云坐标。同样使用了 `Timer` 来统计函数运行时间。 最后是对结果进行可视化和保存: ```python if args.show or args.eval: plot_keypoints(img0, kpts0, title="Image 0 keypoints") plot_keypoints(img1, kpts1, title="Image 1 keypoints") plot_matches(img0, img1, matches0, matches1, title="Matches", savepath=os.path.join(args.output_dir, "matches.png")) plot_reprojection(pts0, pts1, pts3d, R, t, title="Reprojection", savepath=os.path.join(args.output_dir, "reprojection.png")) plot_trajectory(pts3d, title="Trajectory", savepath=os.path.join(args.output_dir, "trajectory.png")) save_trajectory(os.path.join(args.output_dir, "trajectory.txt"), pts3d) if args.eval: repeatability = compute_repeatability(kpts0, kpts1, matches0, matches1) precision, recall = compute_precision_recall(kpts0, kpts1, matches0, matches1, pts3d) print(f"Repeatability: {repeatability:.4f}") print(f"Precision@{len(matches0)}: {precision:.4f}") print(f"Recall@{len(matches0)}: {recall:.4f}") ``` 这根据命令行参数设置是否显示和保存可视化结果,以及是否评估匹配和重建性能。如果需要显示和保存结果,则调用 `plot_keypoints`、`plot_matches`、`plot_reprojection` 和 `plot_trajectory` 函数生成相应的图像,保存到指定目录。如果需要评估性能,则调用 `compute_repeatability` 和 `compute_precision_recall` 函数计算重复性、精度和召回率,输出结果。最后还调用了 `save_trajectory` 函数将重建得到的点云坐标保存到文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值