王道数据结构课后代码题p40 5.将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1) (c语言代码实现)

视频讲解在这里(献丑了):

p40 第5题 王道数据结构课后代码题 c语言代码实现_哔哩哔哩_bilibili

要完成逆置

r为工作指针,p为r的后继,以防断链

循环中 r 每次都指向 L 的下一个,L 再指向 r

最后r在指向p,p继续向后遍历

一直重复这个操作即可完成单链表的逆置

本题代码如下

void nizhi(linklist* L)//单链表就地逆置
{
	lnode* p = (*L)->next;
	lnode* r = p;
	(*L)->next = NULL;
	while (p != NULL)
	{
		p = p->next;
		r->next = (*L)->next;
		(*L)->next = r;
		r = p;
	}
}

完整测试代码为

#include<stdio.h>
#include<stdlib.h>
typedef struct linklist
{
	int data;
	struct lnode* next;
}lnode,*linklist;
int n = 5;
int a[5] = { 1,2,3,4,5 };
void buildlinklist(linklist* L)//建立单链表
{
	*L = (lnode*)malloc(sizeof(lnode));
	(*L)->next = NULL;
	lnode* s = *L, * r = *L;
	int i = 0;
	for (i = 0; i < n; i++)
	{
		s = (lnode*)malloc(sizeof(lnode));
		s->data = a[i];
		s->next = r->next;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
void nizhi(linklist* L)//单链表就地逆置
{
	lnode* p = (*L)->next;
	lnode* r = p;
	(*L)->next = NULL;
	while (p != NULL)
	{
		p = p->next;
		r->next = (*L)->next;
		(*L)->next = r;
		r = p;
	}
}
void print(linklist* L)//输出单链表
{
	lnode* q = (*L)->next;
	while (q != NULL)
	{
		printf("%d ", q->data);
		q = q->next;
	}
}
int main()
{
	linklist L;
	buildlinklist(&L);
	printf("原始的单链表为:");
	print(&L);
	nizhi(&L);
	printf("\n逆置后的单链表为:");
	print(&L);
	return 0;
}

<think>好的,用户之前问过为什么用自己手机拍的数据集在COLMAP中稠密重建效果差,现在他们又问为什么用别人的数据集却能成功。我需要解释这两者之间的差异可能在哪里。 首先,用户可能不太清楚数据集的拍摄质量对重建效果的影响。别人的数据集可能遵循了更好的拍摄规范,比如足够的重叠率、稳定的拍摄设备、良好的光照条件等。这些都是用户自己可能忽略的地方。 其次,用户可能没有正确设COLMAP的参数。别人的数据集可能已经经过预处理,或者使用了适合的参数配,比如更多的特征点数量、正确的匹配策略等。用户自己可能在参数调整上没有做到位,导致特征提取或匹配失败。 另外,相机参数的问题也很重要。别人的数据集可能使用的是固定焦距或经过相机标定,而用户自己拍摄时可能没有锁定对焦或变焦,导致内参变化,影响重建结果。 硬件限制也是一个因素。别人的数据集可能分辨率较低,或者分块处理,而用户的数据集如果太大,可能导致内存不足,特别是没有使用GPU加速的情况下,处理速度慢且效果差。 还有可能是数据集内容本身的差异。别人的数据集可能有更丰富的纹理,而用户拍摄的可能有光滑或反光的表面,导致特征点不足。 用户可能没有意识到这些细节的重要性,或者不知道如何检查和调整这些参数。需要一步步引导他们对比自己的数据集和别人的数据集在拍摄方法、参数设、硬件使用等方面的不同,并提供具体的解决方案,比如如何检查稀疏点云、调整参数命令、使用GPU加速等。 需要确保回答结构清晰,分点说明可能的原因,并提供对应的解决方法,帮助用户逐步排查问题。同时,使用中文,避免技术术语过于复杂,让用户容易理解。</think>使用他人数据集稠密重建成功,但自己的数据集效果差,通常与数据质量和处理方式直接相关。以下是具体原因及对比分析: --- ### **1. 数据集质量差异** #### **关键对比点**: | **维度** | **他人数据集** | **自定义数据集(可能问题)** | |-------------------|-------------------------------|----------------------------------| | **图像清晰度** | 高分辨率、无模糊 | 手机抖动、自动对焦导致模糊 | | **纹理丰富度** | 高纹理(如家具、建筑) | 低纹理(白墙、纯色物体) | | **拍摄覆盖度** | 多角度、螺旋式拍摄 | 角度单一、覆盖不全 | | **光照条件** | 均匀漫反射光源 | 强反光、阴影或低光环境 | | **重叠率** | 相邻图像重叠80%以上 | 移动过快,重叠不足(<50%) | | **相机参数** | 固定焦距、已知标定参数 | 手机自动变焦/对焦导致内参不一致 | #### **示例**: - 若他人数据集拍摄的是纹理丰富的雕塑(表面有凹凸细节),而你的数据集是光滑的陶瓷杯,COLMAP无法提取足够特征点,导致重建失败。 --- ### **2. 数据处理流程优化** #### **他人数据集可能优化点**: 1. **预处理**: - 已剔除模糊/低质量图像。 - 对图像进行去畸变或直方图均衡化增强对比度。 2. **特征匹配策略**: - 使用`VocabTree`加速匹配(适合大规模数据)。 - 对特征点进行几何验证(如RANSAC过滤误匹配)。 3. **参数调优**: - 调整`max_num_features`至更高值(如32768)以增加特征密度。 - 在稠密重建阶段启用多视图一致性检查(减少噪声)。 #### **自定义数据集改进方向**: - **验证图像质量**: ```bash # 使用FFmpeg快速检测模糊帧(数值>1000表示清晰) ffmpeg -i input.jpg -vf "edgedetect=mode=colormix:high=0.1:low=0.01" -f null - 2>&1 | grep "edgedetect" ``` - **手动筛选图像**:删除模糊、过曝或重复的图片。 --- ### **3. 相机模型一致性** #### **问题根源**: - 他人数据集可能使用**单目固定焦距**拍摄,而手机拍摄时可能触发: - 自动对焦(每张图焦距`f`变化)。 - 多摄像头切换(如广角/长焦镜头混合使用)。 #### **解决方案**: - **强制固定相机参数**: - 安卓用户使用`Open Camera`,iOS使用`ProCam`等APP锁定焦距和白平衡。 - **标定手机内参**(以华为P40为例): 1. 打印棋盘格标定板并拍摄20张不同角度图片。 2. 使用`OpenCV`或`COLMAP`标定: ```bash colmap gui -> Reconstruction -> Automatic reconstruction -> Camera calibration ``` 3. 导出标定参数(`fx, fy, cx, cy, k1, k2`)并在后续重建中定。 --- ### **4. 硬件与计算资源** #### **他人数据集可能的优势**: - **分辨率适配**:他人可能将图像缩放至`1024x768`以降低计算量。 - **分块重建**:对大型场景分割为子区域分别重建,避免内存溢出。 - **GPU加速**:使用NVIDIA GPU运行`PatchMatchStereo`,速度提升10倍以上。 #### **自定义数据集优化**: - **降低图像分辨率**: ```bash mogrify -resize 50% *.jpg # 使用ImageMagick批量缩放 ``` - **启用COLMAP GPU支持**: ```bash colmap patch_match_stereo --PatchMatchStereo.gpu_index 0 ``` --- ### **5. 验证与调试建议** 1. **稀疏重建诊断**: - 在`colmap gui`中加载稀疏模型,检查是否存在以下问题: - 相机位姿发散(如个别相机远离主体)。 - 特征点集中在局部区域(覆盖不全)。 2. **稠密重建日志分析**: - 若日志出现`Low support points`,表明匹配失败,需: - 增加`PatchMatchStereo.num_iterations`(默认为3→5)。 - 降低`PatchMatchStereo.geom_consistency_min_ratio`(0.25→0.1)。 --- ### **快速测试方案** 1. **使用他人数据流程测试你的数据**: - 下载公开数据集(如[ETH3D](https://www.eth3d.net/))对比相同参数下重建效果。 2. **逐步替换变量**: - 保持参数一致,仅替换图像,观察是否失败。 - 若失败,则问题出在图像质量;若成功,则需调整参数。 --- ### **总结:成功重建的黄金法则** 1. **数据质量 > 算法调参**:优先保证拍摄规范(光照、重叠率、纹理)。 2. **参数适配场景**:低纹理场景需增加特征点,动态场景需固定内参。 3. **分阶段验证**:先确保稀疏重建正确,再调试稠密重建。 若仍有问题,建议上传示例数据(如3~5张典型图片),可进一步定位具体原因!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力敲代码的小火龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值