C++的各种报错问题

一、关于

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的大小是不是符合 不符合就得报错 不能让调试人员自己去瞎找

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值