stitcher源码阅读

该博客介绍了如何利用Mask R-CNN库实现图像的批量和非批量拼接,并详细展示了在Stitcher项目中如何进行这一过程。核心代码位于BatchCollatorSynthesize和to_image_list_synthesize_4函数中。此外,还阐述了如何计算小目标损失,通过对比小目标和整体损失来调整训练策略。默认情况下,采用的是回归损失(reg_loss)进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

陈康老哥的实现虽然是用maskrcnn-benchmark的 但实现的还挺全,batch和非batch都实现了,基本配置在这里

https://github.com/yukang2017/Stitcher/blob/41063c4d9af077908cd1368ae86d43a27c77f479/maskrcnn_benchmark/config/defaults.py#L91

在这里插入图片描述

stitcher合成

主要合成图片的地方在 BatchCollatorSynthesize (https://github.com/yukang2017/Stitcher/blob/41063c4d9af077908cd1368ae86d43a27c77f479/maskrcnn_benchmark/data/build.py#L184) 调用了 to_image_list_synthesize 进而调用了 to_image_list_synthesize_4 (https://github.com/yukang2017/Stitcher/blob/41063c4d9af077908cd1368ae86d43a27c77f479/maskrcnn_benchmark/structures/image_list.py#L79)

在这里插入图片描述

计算small object loss

https://github.com/yukang2017/Stitcher/blob/41063c4d9af077908cd1368ae86d43a27c77f479/maskrcnn_benchmark/modeling/roi_heads/box_head/loss.py#L168

 reference_boxes = matched_targets_boxes[sampled_pos_inds_subset]
 gt_widths = reference_boxes[:, 2] - reference_boxes[:, 0]
 gt_heights = reference_boxes[:, 3] - reference_boxes[:, 1]
 gt_areas = gt_widths * gt_heights

 small_index = gt_areas < 1024 

 box_loss, box_loss_vec = smooth_l1_loss(
     box_regression[sampled_pos_inds_subset[:, None], map_inds],
     regression_targets[sampled_pos_inds_subset],
     size_average=False,
     beta=1,
     return_loss_vec=True
 )
 if cfg.STITCHER.FEEDBACK == 'cls_loss':
     cls_loss_vec = F.cross_entropy(class_logits, labels, reduction='none')[sampled_pos_inds_subset]
     ratio_small = cls_loss_vec[small_index].sum()/classification_loss 
 else:
     ratio_small = box_loss_vec[small_index].sum()/box_loss

 box_loss = box_loss / labels.numel()

 return classification_loss, box_loss, ratio_small

很简单的实现,默认是reg_loss

<think>好的,用户的问题是“如何在OpenCV中设置Stitcher对象的投影类型”。我需要根据提供的引用内容来回答这个问题。首先,我得回顾一下OpenCV的图像拼接流程和相关类。 根据引用[2],Stitcher类是高层次的封装,而detail命名空间里有低级别的函数。用户可能想调整投影类型,但Stitcher类的默认设置可能不够灵活。引用[1]提到了SphericalProjector,这属于球面投影,可能还有其他投影类型,比如平面或圆柱投影。 接下来,用户想设置投影类型,但Stitcher类可能没有直接的方法。需要查看Stitcher的文档或者源码。引用[5]提到Stitcher类在不同阶段使用不同的尺度,可能涉及到投影的配置。可能需要在创建Stitcher实例前设置参数,比如stitcher::create的参数,或者调整内部的BundleAdjuster。 根据引用[3],SVD和相机参数估计可能影响投影类型的选择。但具体如何设置投影类型可能需要访问底层的detail命名空间中的类,比如SphericalProjector或其他的Projector。然而,用户使用Stitcher类时,可能无法直接访问这些底层类,需要更高级的配置。 可能的解决方案是,使用Stitcher::create时指定投影类型作为参数,或者在Stitcher的配置中设置warper类型。例如,stitcher->setWarper(...),但需要确认Stitcher类是否提供这样的方法。或者,可能需要自定义WarperCreator,如SphericalWarper或CylindricalWarper,并将其传递给Stitcher的配置。 结合引用[5]中的内容,Stitcher类在内部处理不同尺度,可能需要通过调整参数来改变投影类型。比如,使用create函数时传递参数,如Stitcher::PANORAMA,可能对应不同的投影方式。或者,可能需要使用Stitcher::setRegistrationResol等方法来影响投影参数。 总结可能的步骤:创建Stitcher实例时指定参数,或者通过获取内部的warper并设置其类型。但根据引用[2],Stitcher类封装了细节,可能需要使用detail命名空间中的类来自定义流程,但这可能比较复杂。 因此,正确的做法可能是在创建Stitcher对象时,通过参数设置投影类型,例如使用Stitcher::create并指定投影类型,或者通过Stitcher的配置选项设置warper的类型,如使用makePtr<SphericalWarper>之类的。 需要检查OpenCV文档中Stitcher::create的参数,可能有一个参数用于设置投影类型,比如投影方式为球形、平面等。例如,可能有一个枚举类型,如Stitcher::SPHERICAL,然后在创建时传入。 如果用户无法直接设置,可能需要深入到底层使用detail命名空间中的类,但这超出了Stitcher类的简单使用。因此,建议用户查看Stitcher::create的参数,或者使用Stitcher的setWarper方法,如果有的话。 最终,根据引用[1]中的SphericalProjector,可能投影类型是通过设置不同的Warper来实现的,而Stitcher类可能允许用户指定Warper的类型,比如在创建时使用Stitcher::setWarperCreator,并传递一个SphericalWarper或CylindricalWarper的实例。</think>在OpenCV中设置`Stitcher`对象的投影类型需要调用`cv::Stitcher::create`时指定投影参数,或通过调整`Warper`类型实现。以下是具体步骤: --- ### 方法一:通过`Stitcher::create`设置投影类型 1. **创建`Stitcher`对象时指定投影模式** OpenCV的`Stitcher`类默认使用球面投影(`SPHERICAL`),但可以通过参数选择其他投影类型: ```cpp using namespace cv; Ptr<Stitcher> stitcher = Stitcher::create(Stitcher::PANORAMA, Stitcher::SPHERICAL); ``` 支持的投影类型包括: - `Stitcher::SPHERICAL`:球面投影(默认) - `Stitcher::PANORAMA`:平面投影(需手动指定) - `Stitcher::SCANS`:适用于扫描图像的投影(需特征匹配严格对齐) 2. **验证投影类型** 通过`Stitcher::warper()`方法可以获取当前的`Warper`对象类型,确认投影是否设置成功: ```cpp if (dynamic_cast<SphericalWarper*>(stitcher->warper().get())) { cout << "当前使用球面投影" << endl; } ``` --- ### 方法二:自定义`Warper`类型 若需更精细控制,可以手动指定`Warper`生成器(需使用`detail`命名空间中的底层类)[^2][^5]: ```cpp #include <opencv2/stitching/detail/warpers.hpp> // 创建圆柱投影的Warper生成器 Ptr<detail::WarperCreator> warper_creator = makePtr<detail::CylindricalWarper>(); stitcher->setWarper(warper_creator); ``` 支持的`Warper`类型包括: - `SphericalWarper`:球面投影(默认) - `CylindricalWarper`:圆柱投影 - `PlaneWarper`:平面投影 - `FisheyeWarper`:鱼眼投影(特殊场景) --- ### 注意事项 1. **投影类型与场景匹配性** 球面投影(`SPHERICAL`)适用于广角或全景图像拼接,而平面投影(`PLANE`)需要输入图像视角较小且严格对齐[^4]。 2. **性能与内存优化** OpenCV在拼接过程中会动态调整图像尺寸(如`work_scale`、`seam_scale`)以提升效率,但最终输出分辨率可能降低[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值