pat 1108. Finding Average

本文针对PAT-A-1108题“FindingAverage”,详细解析了如何从一组可能包含非法输入的实数中筛选出合法数值并计算其平均值。介绍了合法数值的定义、输入输出规范及样例,并提供了完整的C++实现代码。

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

原题链接:https://www.patest.cn/contests/pat-a-practise/1108


1108. Finding Average (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

The basic task is simple: given N real numbers, you are supposed to calculate their average. But what makes it complicated is that some of the input numbers might not be legal. A "legal" input is a real number in [-1000, 1000] and is accurate up to no more than 2 decimal places. When you calculate the average, those illegal numbers must not be counted in.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=100). Then N numbers are given in the next line, separated by one space.

Output Specification:

For each illegal input number, print in a line "ERROR: X is not a legal number" where X is the input. Then finally print in a line the result: "The average of K numbers is Y" where K is the number of legal inputs and Y is their average, accurate to 2 decimal places. In case the average cannot be calculated, output "Undefined" instead of Y. In case K is only 1, output "The average of 1 number is Y" instead.

Sample Input 1:
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
Sample Output 1:
ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38
Sample Input 2:
2
aaa -9999
Sample Output 2:
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined



#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>

using namespace std;

char s[1000];

int main()
{
    int n,i,j,flag,cnt,cc=0;
    double sum=0.0;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        cnt=0;
        flag=0;
        scanf("%s",s);
        int len=strlen(s);
        if(s[0]=='-')//注意负号的判断
            j=1;
        else
            j=0;
        for(; j<len; j++)
        {
            if(s[j]=='.')//小数点最多只能是一个
            {
                if(len-1-j>2)
                {
                    flag=1;
                    break;
                }
                cnt++;
                if(cnt==2)
                {
                    flag=1;
                    break;
                }
                continue;
            }
            if(s[j]<'0'||s[j]>'9')
            {
                flag=1;
                break;
            }
        }
        if(flag){
            printf("ERROR: %s is not a legal number\n",s);
            continue;
        }
        if(s[0]=='-')
            j=1;
        else
            j=0;
        flag=0;
        double sum1=0,sum2=0;
        for(; j<len; j++)
        {
            if(s[j]=='.')
            {
                flag=1;
                continue;
            }
            if(flag==0)
                sum1=sum1*10+s[j]-'0';
            else
                sum2=sum2*10+s[j]-'0';
        }
        if(sum1>1000||(sum1==1000&&sum2!=0)){
            printf("ERROR: %s is not a legal number\n",s);
            continue;
        }
        cc++;
        while(sum2>=1)
            sum2/=10;
        double ss=sum1+sum2;
        if(s[0]=='-')//注意符号一定要在加完之后判断,不能在判断完符号之后再加,这样数值错误
            ss=-ss;
        sum+=ss;
    }
    if(cc==0)
        printf("The average of 0 numbers is Undefined\n");
    else if(cc==1)
        printf("The average of 1 number is %.2f\n",sum);//注意只有一个数字时,输出number而不是numbers(坑点)
    else
        printf("The average of %d numbers is %.2f\n",cc,sum/cc);
    return 0;
}



<think>我们正在讨论COLMAPSfM(StructurefromMotion)过程中遇到的初始图像对选择问题。用户遇到了“Nogoodinitialimagepairfound”的错误提示,这意味着COLMAP无法自动找到一个合适的图像对来开始重建过程。原因分析:1.图像质量:图像可能模糊、曝光不足或过度曝光,导致特征点提取困难。2.图像间重叠不足:相邻图像之间没有足够的重叠区域,导致无法匹配特征点。3.特征点太少:图像纹理单一(如白墙、天空)导致提取的特征点数量不足。4.相机参数问题:如果提供了相机参数,可能是参数不正确(如焦距错误)导致匹配失败。5.图像顺序混乱:图像序列没有按照拍摄顺序排列,导致相邻图像实际上不连续。解决方案:1.图像预处理:-确保图像清晰,亮度适中。可尝试使用图像增强技术。-移除模糊或质量差的图像。2.增加重叠区域:-确保相邻图像至少有60%-80%的重叠区域。3.特征提取设置:-尝试调整特征提取器的参数(如增加最大特征点数)。在COLMAP中,可以通过`--SiftExtraction.max_num_features`参数增加特征点数量(例如设置为8000或更多)。4.相机参数:-如果已知相机参数,确保在运行COLMAP时正确提供(例如,使用`--database_path`和`--image_path`时,通过`--ImageReader.camera_model`和`--ImageReader.camera_params`指定)。-如果不确定相机参数,可以尝试让COLMAP自动估计(使用`--ImageReader.single_camera1`等)。5.图像顺序:-如果图像不是按顺序拍摄的,尝试按拍摄时间排序。6.手动指定初始图像对:-使用COLMAP的图形界面(GUI)手动选择初始图像对。在图形界面中,可以通过“FeatureExtraction”和“FeatureMatching”后,在“Reconstruction”菜单下选择“Startreconstruction”并手动选择两个图像。-或者,通过命令行指定初始图像对:修改`colmapmapper`的调用,使用`--Mapper.init_min_tri_angle`和`--Mapper.init_max_error`等参数调整初始化条件,但更直接的方法是使用图形界面手动选择。具体步骤(手动选择初始图像对):1.运行特征提取:在COLMAPGUI中,点击“Processing”>“FeatureExtraction”,设置参数(如增加特征点数),然后运行。2.运行特征匹配:点击“Processing”>“FeatureMatching”,选择合适的匹配方式(例如,对于有序图像序列,使用“ExhaustiveMatching”)。3.在“Reconstruction”菜单下,选择“Startreconstruction”>“Startfromscratch”。此时,如果自动初始化失败,会弹出错误提示。4.在失败后,不要关闭重建窗口,而是点击“Reconstruction”>“Initializewithtwoimages...”,然后手动选择两个重叠较好的图像(例如,相邻且重叠区域大的两张图像)。5.之后,COLMAP会使用这两个图像作为初始对开始重建。其他高级方法:-使用词汇树加速匹配:如果图像数量很大,可以尝试使用词汇树(VocabTree)进行匹配,但注意这通常用于大规模重建,对于初始化问题可能帮助不大。-调整匹配策略:尝试不同的特征匹配策略,如顺序匹配(Sequentialmatching)或者空间匹配(Spatialmatching)等。参考引用:根据引用[2]:“Aftertheoperationiscompleted,weachievecoarseregistrationofthedatausingco-alignment,resultinginamergedsparsepointcloudandimageposes.”这说明在完成特征匹配和初始图像对选择后,会进行粗配准,得到稀疏点云和相机位姿。因此,初始图像对的选择是整个SfM流程的关键一步。如果以上方法仍然无法解决,可能需要考虑图像本身是否适合进行SfM重建(例如场景纹理是否足够丰富)。相关问题:1.如何评估图像质量对SfM重建的影响?2.COLMAP中特征提取和匹配有哪些参数可以调整?3.除了COLMAP,还有哪些方法可以解决SfM初始化问题?4.在无GPS信息的图像序列中,如何保证图像重叠区域足够?</think>### COLMAP SfM初始图像对选择问题解决方案 当COLMAP提示"No good initial image pair found"时,通常表示系统无法自动找到具有足够重叠区域和稳定特征点的图像对作为SfM重建起点。以下是系统性的解决方案: #### 1. **图像预处理优化** - **增加特征点数量**:在特征提取阶段调整参数 ```bash colmap feature_extractor \ --ImageReader.single_camera 1 \ --SiftExtraction.max_image_size 4000 \ --SiftExtraction.max_num_features 10000 # 增加特征点上限 ``` - **增强图像对比度**:对低纹理场景(如白墙、天空)使用直方图均衡化 - **移除问题图像**:删除模糊、曝光过度或重复的图片(可用`colmap exhaustive_matcher`测试单张图像匹配率) #### 2. **匹配策略调整** - **启用更鲁棒的匹配方式**: ```bash colmap exhaustive_matcher \ --SiftMatching.guided_matching 1 # 启用引导匹配 --SiftMatching.max_ratio 0.8 # 放宽匹配比例阈值 ``` - **尝试序列匹配**(适用于有序图像): ```bash colmap sequential_matcher \ --SequentialMatching.overlap 10 # 设置相邻帧重叠数 ``` #### 3. **手动指定初始对** **步骤:** 1. 完成基础特征提取和匹配 2. 在COLMAP GUI中选择:`Reconstruction > Start reconstruction from scratch` 3. 当提示初始化失败时,选择:`Reconstruction > Initialize with two images...` 4. 手动选择两张: - 重叠区域 >60% - 匹配特征点 >200个 - 有显著共视物体(如墙角、纹理区域) #### 4. **参数调优建议** ```bash colmap mapper \ --Mapper.init_min_tri_angle 10.0 # 降低最小三角化角度(默认16°) --Mapper.init_max_error 8.0 # 增大重投影误差阈值(默认4px) --Mapper.abs_pose_min_num_inliers 80 # 降低最低内点数要求 ``` #### 5. **高级解决方案** - **添加GPS辅助**(如有EXIF数据): ```bash colmap feature_extractor \ --ImageReader.camera_model GPS # 使用GPS辅助排序 ``` - **层级式重建**:对大型数据集先进行子集重建 ```bash colmap hierarchical_mapper # 替代标准mapper ``` - **引入人工标记点**:在场景中放置高对比度标记物增强特征 > 关键原理:初始图像对需满足**基础矩阵**$F$和**单应矩阵**$H$的约束条件: > $$ > \mathbf{x}'^T F \mathbf{x} = 0 \quad \text{且} \quad \frac{\|H\|_F}{\|F\|_F} < \epsilon > $$ > 其中$\epsilon$通常取0.3-0.5[^2]。这保证了足够的视差和平面一致性。 #### 典型场景处理 | 场景类型 | 推荐方案 | 特征点目标 | |-------------------|-----------------------------|------------| | 室内低纹理 | 直方图均衡化 + 手动选对 | >150对 | | 无人机航拍 | GPS辅助 + 层级式重建 | >300对 | | 360°环绕拍摄 | 序列匹配 + 降低三角化角度 | >200对 | [^2]: 引用[2]提到粗配准依赖于有效的初始匹配,这对生成稀疏点云至关重要
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值