一、关于
1)if后面不加括号 那么只能有一句话
原本代码:
if (found == 0) continue;
加了一句cout,变为:
if (found == 0) cout << "未正确找到角点,继续下一次" << endl; continue;
报错,程序运行出错 总是没有正确的结果。因为continue语句已经不在if语句大括号里面了!!!
大括号的重要性啊!!
if (found == 0)
{
cout << "未正确找到角点,继续下一次" << endl;
continue;//未正确找到角点,继续下一次
}
OK了
二 大型代码里面的小问题
1)Orb-SLAM代码
1.1) 报错: Program received signal SIGSEGV (Segmentation fault)
调试了一会,报另外一种错:*** Crashed with return code: 0 ***
原代码:
cv::Mat posCur1 = mCurrentFrame.UnprojectStereo(i);
cv::Mat posCur2 = mCurrentFrame.UnprojectStereo(LastPId);
float distcurF= sqrt( pow((posCur1.at<float>(0)- posCur2.at<float>(0)),2) +pow((posCur1.at<float>(1)- posCur2.at<float>(1)),2)
+ pow((posCur1.at<float>(2)- posCur2.at<float>(2)),2) );
cout<<"the current dist is "<<distcurF<<endl;
去网上搜索,无果.无非都是一些"数组下标溢出" "该释放时不释放"等错误,没有对应的上的.
只好去看代码,以及别的地方使用的方法.
线索:1)注释掉distcurF那一行后就ok.
2)输出数据输出4行后停止.
最后解决方案:
先判断当前点的深度,再进行计算.最终解决.
float ZposCur1 = mCurrentFrame.mvDepth[i];
float ZposCur2 = mCurrentFrame.mvDepth[LastPId];
float distcurF=0.0f;
if(ZposCur1>0&&ZposCur2>0)
{
cv::Mat posCur1 = mCurrentFrame.UnprojectStereo(i);
cv::Mat posCur2 = mCurrentFrame.UnprojectStereo(LastPId);
distcurF= sqrt( pow((posCur1.at<float>(0)- posCur2.at<float>(0)),2)
+ pow((posCur1.at<float>(1)- posCur2.at<float>(1)),2)
+ pow((posCur1.at<float>(2)- posCur2.at<float>(2)),2) );
}
没想到与上一帧匹配的点还会有深度的问题,看来要小心了.
尝试失败的方法:
1)看别的地方都有 我就尝试了一下 嘻嘻嘻 看来不是这个问题
cv::Mat posCur1 = mCurrentFrame.UnprojectStereo(i).clone();
2)还看了一会线程的问题,以为是线程出错呢.但是后来一想我只是对两张图片操作怎么会有问题呢.
经验:写大型代码的时候报错了,这个时候如果对代码本身比较熟,就有可能能发现小型问题.当然还是我比较渣.不然看看Mat就能看出来了.
1.2)opencv报错 某某操作不行 cvCreateSubdivDelaunay2D操作不行
背景:在做delaunay,用opencv做2D平面delaunay,需要CvRect rect = { 0, 0, width, height };
这个width, height就对应上datasets的图像大小 因为我换了一个数据集,没改这个就报错了.
解决方案:改成最新datasets的图片大小就可以了.
教训:其实做系统还是要把这个鲁棒性做好 要判断当前frame的大小是不是符合 不符合就得报错 不能让调试人员自己去瞎找