VS2013 BUG合集

21 篇文章 0 订阅

VS2013 BUG合集

一、生成解决方案出错(编译出错)

1. 找不到lib文件

原因:配置问题(看看环境变量,VS配置有没有全)

1.1 由于找不到pcl_common_debug.dll,无法执行代码。重新安装程序可能会解决此问题

在这里插入图片描述
在这里插入图片描述
请添加图片描述
这次只用了半小时就回忆起来啦,检查了一下软件里面的配置,发现没有问题,都是包含的.h和.lib文件,发现缺失的这些文件都在bin文件夹下,而这个都是配置在环境变量里,最后找到是环境变量之前配置的都没了,重新配置了一下就欧克了,呱唧呱唧!但是我还是不记得是配置在自己的环境变量里还是系统环境变量,最后配置到自己里面,也可以运行就行了
右键电脑-属性-高级系统设置-环境变量
在这里插入图片描述
在这里插入图片描述

2. x64和x86冲突

一般是库文件和编译环境不匹配(就是把适用于win32环境的库用在了x64环境上)
解决:重新编译一遍库

3. error LINK2019 无法解析外部符号

原因:

4. 无法查找或打开PDB文件

在这里插入图片描述
出现这种提示并不是代码写错了,而是编译器设置的问题,改一下设置就 OK 了。
参考:VS“无法查找或打开PDB文件”是怎么回事?如何解决

什么是PDB文件

当程序在 VS 上编译时,程序所依赖的所有动态链接库(dll 文件)也会被编译,编译过程中每个 dll 都会产生一个pdb文件,又称为“符号文件”,是一个存储数据的信息文件,其包含 dll 库在编译过程的某些调试信息,例如程序中所用到的全局变量、局部变量、函数名以及他们的入口地址等。
pdb 文件主要用于调试程序,多用于当VS中有多个项目,且项目之间互有依赖关系时,使用pdb文件调试程序,往往会事半功倍,初学者一般不会用到。
当使用VS 调试程序时,会默认加载你的程序以及程序依赖的dll库产生的所有pdb文件,但是结果往往是VS自己找不到依赖库的pdb文件,于是就提示给你“无法查找或打开pdb文件”。

解决

我们可以通过对 VS 做适当的设置,使之能够查找到相应的 PDB 文件,具体步骤如下(这里我们以 VS2017 为例进行说明,其它版本的 VS 操作步骤也一样)。

  1. 选择菜单栏中的“调试 --> 选项”,如下图所示:
    在这里插入图片描述
  2. 弹出“选项”对话框后,选择“调试 --> 常规”,在右侧选项栏中勾选“启用源服务器支持”(包含的 3 个子选项不用勾选),此时会弹出一个安全警报框,选择“是”即可,如下图所示:
    在这里插入图片描述
  3. 还是在“选项”对话框中,选择“调试 --> 符号”,在右侧选项栏中勾选“Microsoft符号服务器”,此时会弹出一个提示对话框,点击“确定”即可。同时,对于缓存符号的目录,选择图示中的目录即可
    在这里插入图片描述
  4. 确定之后,重新运行你的程序,首次运行时,由于编译器会加载所有动态链接库的pdb文件,可能会等到几秒钟。程序运行后,之前输出窗口中的“无法查找或打开pdb文件”的提示不见了,如下图所示:
    在这里插入图片描述
    如上图所示,由于pdb文件,又名“符号文件”,所以“已加载符号”,也就是成功加载了动态链接库对应的pdb文件。
    第一次加载会从服务器下载,如果电脑配置低的话加载会非常卡。一次加载完后可取消掉加载,不影响后续使用。

5. 丢失opencv_world300.dll

解决:将……\opencv\opencv\build\x86\vc12\bin下的3个.dll文件复制到C:\Windows\SysWOW64下

6. error 1104

打不开各种.lib文件

原因:编译器没有找到你的lib文件,配置进去就好
例:在VS2013运行obtain_data(用Kinect2.0相机拍照片)调试遇到的问题

无法打开所在工程的exe文件

错误 4 error LNK1104: 无法打开文件“E:\Program\Project\2_boundaryestimation_ICP\me\rotation_boundaryestimation_icp\Debug\rotation_boundaryestimation_icp.exe”
解决:这种情况一般 就是上一次调试打开的exe文件没关闭,关掉重新调试就行了。如果关掉了还有这个提示,就把工程都关了重新打开调试就行了。

7. error LINK1169:找到一个或多个多重定义的符号

原因:问题出现的原因,是因为一个变量在一个头文件声明,但是却在2个及以上的.cpp文件中定义。或者有两个cpp文件都有mian。(后面这个我比较常见,因为经常会在一个工程里测试好几个程序)
解决:一般编译器会告诉你是哪个变量出现问题,你需要定位到那个变量,然后,删除其中一个多余的变量定义
还有一种无奈的解决方法,你打开项目-》配置属性-》连接器-》命令行,输入以下字符串,以允许多重定:
**/force:multiple
参考:error LNK1169: 找到一个或多个多重定义的符号

8. error LINK2005:已定义,重复定义

原因:可能是因为配置库有重复的地方,比如boost在pcl里有配置过,后来自己编译的又配置了一遍

9. error C1083:无法打开包括文件: “Eigen/Dense”

原因:缺少eigen这个库,不太懂为啥,本来pcl第三方库里有的
解决:参考:(转载)无法打开 Eigen/Dense 等文件
1、下载Eigen,并解压。
1)CSDN:http://download.csdn.net/download/airaybaiju/10237226
2)官网:http://eigen.tuxfamily.org/index.php?title=Main_Page#Download
在这里插入图片描述
2、解压之后的文件夹,重命名为 eigen3 。
3、在项目属性-> 配置属性-> vc++目录-> 包含目录,
比如我的eigen3在F:\Eigen install pack\eigen3,包含目录就是:F:\Eigen install pack\eigen3;

10. error C1083: 无法打开包括文件:“opencv2/nonfree/nonfree.hpp”: No such file or directory

原因:这个目录下根本没有nonfree.hpp这个文件。原因是OpenCV3.0升级了,一些包变成额外的,需要自己安装。

opencv从2.x到3.x是一个很大的转变,对于很多功能不完善、性能不稳定的模块,都被方法了extra_modules(扩展模块)里面了。这样倒是稳定了,但是对于我这样的新手,要添加这些扩展模块却是相当的痛苦啊!!因为要用到sift/surf算法,但是3.0以后这些算法都放到了在xfeacture模块中,并不在主模块中,于是我就开始了艰难的配置过程。
—— 来自https://blog.csdn.net/zy499/article/details/82952229

解决:

  1. 安装配置opencv_contrib
    操作见:
    opencv_contrib-3.0.0(opencv3.0对应的版本)(win32编译配置)+VS2013+cmake
    opencv_contrib-3.0.0(opencv3.0对应的版本)(x64编译配置)+VS2013+cmake
  2. 装好了之后把#include <opencv2/highgui/highgui.hpp> ,也改成了这个文件正确的路径,结果还是没用!
    一气之下我就在我新装的库opencv_contrib-3.0.0下面找到这个文件nonfree.hpp直接把这个文件复制到opencv原来的那个库目录下,然后把#include <opencv2/highgui/highgui.hpp> 路径改掉就好了。

11. error C1083 无法打开包括文件: “boost/shared_ptr.hpp”: No such file or directory

原因:配置问题,这里应该是F:\PCL1.8.0\3rdParty\Boost\include\boost-1_59
在这里插入图片描述
参考:“错误 C1083 无法打开包括文件: “boost/shared_ptr.hpp”: No such file or directory”解决办法

12. (第一个vs的qt工程报错)编译时常报:error LNK1117 : 选项“SUBSYSTEM:WINDOWS@QMAKE_SUBSYSTEM_SUFFIX@”

参考:LINK:fatal error LNK1117:选项"SUBSYSTEM:WINDOWS@QMAKE_SUBSYSTEM_SUFFIX@"中的语法错误解决办法
在这里插入图片描述
解决:项目配置属性”=>“链接器”=>“命令行”,将右侧“其他选项”中的 /SUBSYSTEM:WINDOWS%40QMAKE_SUBSYSTEM_SUFFIX%40 删除
在这里插入图片描述

13. (第一个vs的qt工程报错)This application failed to start because it could not find or load the Qt platforms plugins

编译好的exe可执行文件,在无qt环境的电脑上运行时,如上报错
参考:This application failed to start because it could not find or load the Qt platforms plugins
解决:将Qt5.7.1\5.7\msvc2013\plugins\platforms目录复制到exe所在文件夹即可。

14. 无法打开源文件,找不到Qt里面的库,程序有好多红色的波浪线

参考:vs2013+QT5.5.0的环境搭建过程和常见错误总结
解决:打开main.cpp,单击生成–>生成解决方案,会有链接错误,因为VS2013找不到QT程序库。
接下来右击项目>t属性>配置属性>C/C++>常规,编辑“附加包含目录”,找到QT的安装目录下的include文件夹的路径,将它添加进“附加包含目录”里面,然后一路确认即可。重新编译程序,编译通过。
注意:如果上一步的Qt Options未配置成功,则在创建这个Qt Applicaiton时候会出现错误:“Unable to find Qt build!”

15. 检测到RuntimeLibrary的不匹配项,值“MTd_StaticDebug"不匹配

在这里插入图片描述
参考:visual studio 2015中使用opencv时遇到的一些问题
原因:注意到StaticDebug,意识到可能是静态库的问题。最后发现是库文件包含目录里,除了lib以外,还自作聪明的添加了staticslib,删除这个目录包含就没这个问题了,其实我以前在其他版本也包含过,没出过错,可能是版本文件问题。
遇到这类的问题,一定是opencv配置出了错,反复检查。

16. 未加载opencv_core2413.pdb

(虽然我还没遇到过这种问题,但是感觉说的很有道理的样子,先存起来)
参考:visual studio 2015中使用opencv时遇到的一些问题
在这里插入图片描述
解决:其实当时遇到这个问题解决不了,我就觉得应该用cmake把opencv编译一下生成pdb文件,直接把整个编译好的文件拷到项目中,连路径都不用折腾。但当时cmake失败了(回头会写这个)。
后面在百度的四五页的答案中,终于有人提到了类似的,说直接把这个文件拷到项目文件下或是系统文件里,肯定能直接加载。
为了以后再出现这种问题,我直接把所有的库文件都拷到了系统目录了。x64系统的是c:/Windows:/SySWOW64,32位系统的是c:/Windows:/System32,如下图路径。拷过去之后重启电脑就可以了。也可以拷到项目文件目录里。回头还是想编译一波。

17. error C4996: -D_SCL_SECURE_NO_WARNINGS

参考1:vs error C4996 : -D_SCL_SECURE_NO_WARNINGS
原因:对C++标准库任何可能的不安全的调用都会导致C4996的错误
解决:上策是改实参类型等来规范调用,下策是屏蔽警告。方法如下:
-D即difine a macro定义宏。在属性页、C/C++、预处理器、预处理器定义添加_SCL_SECURE_NO_WARNINGS即可,如图
在这里插入图片描述
PS:按理说在.cpp文件顶部添加#define _SCL_SECURE_NO_WARNINGS也可,但会有如下警告:
warning C4603: ‘_SCL_SECURE_NO_WARNINGS’ : macro is not defined or definition is different after precompiled header use
故还是优先使用第一种方法吧。
参考2:VS2013编译错误:-D_SCL_SECURE_NO_WARNINGS解决方案
在这里插入图片描述

18. error:C4996 ×× is deprecated, please use the ×× function instead.

error C4996: ‘pcl::ConditionalRemoval::ConditionalRemoval’: ConditionalRemoval(ConditionBasePtr condition, bool extract_removed_indices = false) is deprecated, please use the setCondition (ConditionBasePtr condition) function instead.
简单的条件滤波就出现上面这个错误
解决:属性——C/C++——常规 SDL检查改为“否”就可以了
原因:
参考:windows安全警告与SDL检查
vs解决无符号类型,安全开发生命周期(SDL)检查
大概好像就是SDL(安全开发生命周期)检查这个功能是微软新推出的,为了能更好的监管开发者的代码安全,如果勾选上这一项,那么他将严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译,比如在VS2010中的scanf是warning那么在VS2012中就是error了。
还有下面这些情况,本来应该是警告的,但是开启SDL检查之后,就会视为错误,编译报错
在这里插入图片描述

19. error MSB8031: Building an MFC project for a non-Unicode character set is deprecated.

参考:解决:错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated.
原因:VS2013及以上版本,缺少MFC MBCS DLL加载项。其中MBCS为多字节字符编码。
解决:
a.点击http://go.microsoft.com/fwlink/p/?LinkId=286820
b.选择所对应的VS版本。
c.点击 Multibyte MFC Library for Visual Studio 2013、2015(根据自己版本所定)
d.选择中文,下载,安装。
注意:安装过程需要以管理员身份运行。
插件下载下来安装好,重启VS2013,就没错误啦!
下载路径:https://www.microsoft.com/zh-CN/download/details.aspx?id=40770

20. error C2056:"M_PI"未声明的标识符

lntelliSense:未定义标识符“M_PI”
学习eigen库用到M_PI,以前程序里也用到了,没有报错,鼠标放上去还会显示(程序前面也没有宏定义啥的,也没加多余的头文件啊)
在这里插入图片描述
在这里插入图片描述
但是新程序里也有,就报错了,无奈,不知道为啥
解决:
VS2017 C++ 程序报错“error C2065: “M_PI”: 未声明的标识符"
项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,将“_USE_MATH_DEFINES”添加进去

21. error LNK1561: 必须定义入口点

每个应用程序(文件格式为exe)都应该有个启动点,这个点就是main函数。缺少就会出现link error 。
但是我有呀,后来发现是“main"拼写错了!!!

22.

背景:计算点云法向量的时候我定义点云是XYZRGB格式,然后出来这么多问题,后来改成XYZ格式就好了
在这里插入图片描述

23. error C4996: ‘pcl::visualization::PCLVisualizer::addCoordinateSystem’: addCoordinateSystem (scale, x, y, z, viewport) is deprecated, please use function addCoordinateSystem (scale, x, y, z, id, viewport) with id a unique string identifier.

error C4996: ‘pcl::visualization::PCLVisualizer::addCoordinateSystem’: addCoordinateSystem (scale, x, y, z, viewport) is deprecated, please use function addCoordinateSystem (scale, x, y, z, id, viewport) with id a unique string identifier.
写点云显示程序的时候,想要显示坐标轴,但是一直有BUG,不知道咋回事,后来阅历多了才知道,原来是这句话应该加上窗口id,就是窗口名字才行。
在这里插入图片描述

24. error C2338: OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG

想定义一个矩阵,发现报错:
error C2338: OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG
原来:
在这里插入图片描述
解决:https://blog.csdn.net/u011341856/article/details/102882389
说是创建高维矩阵和运算的时候,报错,主要原因是栈溢出。
只要将创建的静态矩阵,改成动态矩阵即可(矩阵维数是动态的,在赋值或运算时,自动产生对应维数大小)
改成如下:
在这里插入图片描述

有一点需要强调: 虽然我们可以使用任何维度的矩阵去赋值或者初始化matrix_NN,但是始终没有改变它是动态矩阵的性质,也就是维数运行过程始终可以变化,这一点儿不同于静态矩阵,静态矩阵编译时就确定了维度,运行时不能变。
补充:静态矩阵和动态矩阵的区别:
  动态矩阵和静态矩阵:动态矩阵是指其大小在运行时确定,静态矩阵是指其大小在编译时确定。
  MatrixXd:表示任意大小的元素类型为double的矩阵变量,其大小只有在运行时被赋值之后才能知道。
  Matrix3d:表示元素类型为double大小为3*3的矩阵变量,其大小在编译时就知道。

25. 未定义标识符UNIT16(就是下面会有红色波浪线)

一般就是没配置好,我试了好多次,这东西居然定义在kinect.h里面,奇怪,反正加上kinect的配置就好了

二、编译没问题,调试有问题

1. opencv_world300.dll 处有未经处理的异常

原因:样子和下面问题一样的,后来发现是release和debug的lib文件配置到一起的原因,之前因为看到安装库里文件都在一起,路径是一个,之前测试的时候放在一起也没问题,现在莫名其妙又不可以了,唉,不过解决了问题就好!


转载:[opencv imwrite报错:关于opencv_world300.dll](https://blog.csdn.net/sanningjing/article/details/55261469)

重新学习opencv,载入/显示图像都没有问题,加入imwrite后,程序报错,报错如下,直接上图:


原因是lib文件配置问题。

解决方法如下:

删除配置中的realse版本需要的lib文件。同样的问题,还出在X86/X64文件不能同时载入的问题。如果 有问题,就删除一个,如果无问题,就正常使用吧。

我用过两台机子,一台同时都配置没有问题,一台就有问题。




解决:opencv配置中链接器-输入-附加依赖项里realease的lib文件都删掉就好了

2. 有未经处理异常

生成解决方案没问题,但是无法调试
在这里插入图片描述
在这里插入图片描述

3. 未加载wntdll.pdb

编写程序的时候在编译的过程中出现了一个对话框提示程序已经出现一个断点,然后跳转界面提示未加载 wntdll.pdb,无法查找或打开 PDB 文件。
解决:
调试——选项和设置——调试——符号——勾选Microsoft符号服务器
在这里插入图片描述

4. 无法找到“test_vtk.exe”调试信息,或者调试信息不匹配。未使用调试信息生成二级制文件。是否继续调试?

release环境下无法调试,只能直接运行不调试,否则会有以上错误
在这里插入图片描述

5. 应用程序无法正常启动(0xc000007b)(未解决!!!)

惊天大BUG!
我测试64位的PCL库时出现的,以为是PCL安装或者配置的不对,后来又回头测试vtk64位的时候,之前测试没问题运行成功的,结果这次就不行,载在这个BUG上了。我还解决不了,合理推测,其他库64位环境估计也运行不成功。我费了半天劲配置的估计不能用了,允悲!!!
挣扎过程见:PCL1.8.0测试

6. Debug Assertion Failed!

Expression: _pFirstBlock == pHead

在这里插入图片描述
中止后:
在这里插入图片描述
原因:参考:
Debug Assertion Failed! Expression: _pFirstBlock == pHead
【Debug Assertion Failed!Expression:_pFirstBlock == pHead vs2013编程错误】
我之前遇到过要改MTd的问题,但是没啥用,会有死循环,和上述参考的博主一样的问题,所以这次没有改。
Debug Assertion Failed!查找问题所在方法
上面这个是大佬的方法,完全不懂,先放着吧
解决:上面有说到混用release和debug文件,所以我又检查了一遍配置,发现没什么用。再出现问题,我直接点忽略,一直忽略,好像也可以出结果,没啥影响哈哈哈
2020.6.2
由于我实在是没办法了,现在一个简单的读取ply文件,显示点云的程序都会出这个错误,于是又搜了点解决方法,有几个是说opencv和VS版本对应不上,我检查的一下好像没啥错,VS2013对应的vc12。后来死马当活马医的试了一下把MTd改成MDd,居然没报错?居然还成功了!
工程上右键-》属性-》C/C++=》所有选项,改成MDd就好了!(就是参考第一个链接)
在这里插入图片描述
而且我这两个问题也解决了:原来配置的PCL好好的没问题,但是测试的时候莫名其妙就出现这两个问题,感觉是缺少这个boost的lib文件,但是后来单独编译了boost(没有s的和有s的都可以用)配置好加上没有boost的PCL放在一起才没错误,但是会有Debug Assertion Failed!这个问题,改好这个问题之后,再用这个配置好的库,也没有下面这个问题啦!
在这里插入图片描述

Expression: invalid null pointer

问题描述:
在这里插入图片描述
项目场景:

  1. 计算点云的主方向时,复制的别人的程序,生成解决方案没有问题,调试的时候有问题了。
    原因分析:
    搜原因时大部分这样说的,说到指针,但是没看太懂:invalid null pointer
    但是想到和我之前写的代码不同的地方,大概知道是这里的原因
    在这里插入图片描述
  2. 还有一次复制人家的SAC-IA粗配准的代码,他读取文件也是这么写的,同样出现这个BUG,当时看其他代码很累了,就懒得搞这个,现在重新看了,一下就解决啦
    在这里插入图片描述

解决方案:
由于具体原因不太清楚,即不知道argv[1]是干啥的,于是老老实实换自己读取文件的代码,解决啦
在这里插入图片描述

7. Expression: (“Buffer too small”,0)

Kinect获取数据的接口程序,用相机参数自己对齐的程序(KienctThird),毕设的时候忘记有没有问题了,但是这次出现这个BUG:
在这里插入图片描述
点击重试之后跳转到这里,由上面提示的地方:
File: f:\dd\vctools\crt\crtw32\stdio\vsprintf.c
以及下面跳转的这个文件还有函数,还有这个程序可以显示结果(即显示图片),但当我按空格键要保存的时候就优BUG提示了,综上,我猜测问题出在保存文件的位置,应该是这个函数:springf_s()出了问题
在这里插入图片描述
然后突然想到我能够运行正常的函数,这里是64,而这个程序写的32,改成64之后就没问题了
在这里插入图片描述
在这里插入图片描述
(不过不知道为啥,同样的保存文件啊,人家32就可以好好的,我去年做毕设用这个程序的时候估计也有这个问题,但是当时也不知为啥,所以写了备注哈哈哈)

8. Expression: vector subscript out of range

Program: C:\WINDOWS\SYSTEM32\MSVCP120D.dll
File: f:\microsoft visual studio 12.0\vc\include\vector
Line: 1185

在这里插入图片描述
点击重试,跳转到这里:
在这里插入图片描述
然后继续运行,出现这个BUG提示:
Program: E:\Program\1_obtain_data\2-obtain_data\Debug\end_obtain_data.exe
File: f:\microsoft visual studio 12.0\vc\include\vector
Line: 1202
Expression: “Standard C++ Libraries Out of Range” && 0
在这里插入图片描述
点击重试,跳转到这里:
在这里插入图片描述
然后继续运行,跳转到这里:
0x0196A893 (msvcr120d.dll) (end_obtain_data.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。
在这里插入图片描述
在这里插入图片描述
根据第一次出现的BUG提示,估计又是vector的问题,然鹅我不知道这个vector是干啥用的。
2020.6.8 解决啦!
问题出自Kinect获取数据的接口程序,我想直接把参数保存到点云的xyz坐标,但是就有问题了。当时和不保存为ply点云文件的相同程序对比,那个没有问题,所以问题就出在保存点云文件这里,然后通过注释掉保存ply的语句发现错误不在这,然后注释掉赋值语句之后错误就没有了,所以赋值语句应该是错的。
在这里插入图片描述
这个是我直接复制的我正常运行的程序里的,以为没什么问题,由于没有完全搞懂怎么赋值的,感觉i就是一个摆设,一个公式的模板,就没多想。
后来调试的时候,一到这里就出BUG,然后监视了一下i的值才发现,它太大了,起始值就512*424这么大了,怪不得会溢出。后来发现i这个变量程序前半部分有用到,没有置零,所以就这个样子了,修改之后就没问题啦!
在这里插入图片描述

9. Error: no override found for ‘vtkPolyDataMapper’.

Generic Warning: In F:\PCLdon\VTK-7.0.0\Rendering\Core\vtkPolyDataMapper.cxx, line 28
Error: no override found for ‘vtkPolyDataMapper’.
在这里插入图片描述
在这里插入图片描述
解决:
参考:VTK编译中出现 no override found for vtkpolydatamapper 解决方法
程序上面加入一下语句即可

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

10. Assertion failed: point_representation_->isValid (point) && “Invalid (NaN, Inf) point coordinates given to nearestKSearch!”

Assertion failed: point_representation_->isValid (point) && “Invalid (NaN, Inf) point coordinates given to nearestKSearch!”, file F:\PCLdon\pcl-master\kdtree\include\pcl/kdtree/impl/kdtree_flann.hpp, line 136
在这里插入图片描述
背景:ICP配准。
原因:
一开始查的都是因为数据里有NAN值,所以我先去除之后发现并没有什么用,还有错误,问题还是出在配准那个地方。于是用以前刚学ICP时的程序运行同样的数据发现没问题,但是用的函数不太一样,没问题那个程序里用的IterativeClosestPoint,有问题的程序用的是
IterativeClosestPointWithNormals。我把函数换成IterativeClosestPoint之后就没问题了。于是觉得可能是我数据问题,果然,查看我之前计算法向量的程序,保存的时候只保存了点云没有保存法向量,所以这里用IterativeClosestPointWithNormals函数就有问题了。
一开始没有发现是因为读取数据的时候没问题,我读取的时候是按照格式PointNormal读取的,他没有法向量居然还能读取不报错,还显示读取了多少个点,于是我就被迷惑了。


2022.1.5 更新,又出现这个BUG了
Assertion failed: point_representation_->isValid (point) && “Invalid (NaN, Inf) point coordinates given to nearestKSearch!”, file F:\PCLdon\pcl-master\kdtree\include\pcl/kdtree/impl/kdtree_flann.hpp, line 136
在这里插入图片描述

同样是icpwithnormal这里出现的
后来查出来是法向量计算那里的错误,一个点云输入进去,最后输出的居然只有一个点,然后那个点上有很多法向量,这样的带法向量的点云输入到配准函数里面肯定错的呀
错误写法:

	pcl::NormalEstimation<pcl::PointXYZ, pcl::PointNormal> ne1;
	ne1.setInputCloud(result);
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZ>());
	ne1.setSearchMethod(tree1);
	ne1.setRadiusSearch(0.03);
	pcl::PointCloud<pcl::PointNormal>::Ptr align_normals_ptr(new pcl::PointCloud<pcl::PointNormal>);
	ne1.compute(*align_normals_ptr);

结果:
在这里插入图片描述
在这里插入图片描述
正确写法:

        pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne1;
        ne1.setInputCloud(result);
        pcl::search::KdTree<pcl::PointXYZ>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZ>());
        ne1.setSearchMethod(tree1);
        pcl::PointCloud<pcl::Normal>::Ptr align_normals_ptr(new pcl::PointCloud<pcl::Normal>);
        //ne1.setRadiusSearch(0.03);
        ne1.setKSearch(10);
        ne1.compute(*align_normals_ptr);
        pcl::PointCloud<pcl::PointNormal>::Ptr align_normals(new pcl::PointCloud<pcl::PointNormal>);
        pcl::concatenateFields(*result, *align_normals_ptr, *align_normals);//连接字段,cloud_with_normals存储有向点云

结果:
在这里插入图片描述

11. [pcl::registration::CorrespondenceEstimation::setInputTarget] Invalid or empty point cloud dataset given!

[pcl::registration::CorrespondenceEstimation::compute] No input target dataset was given!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
背景:计算两片点云对应点时,输入.ply文件,结果出现这个问题:找不到输入目标数据集(用到pcl::registration::CorrespondenceEstimation这个类)
原因:未知
应该是输入的问题,但是我设置查看输入点云数量显示正确,说明读取没问题。那应该是输入这个类的时候有问题。但是不知道具体原因。
在这里插入图片描述
解决:因为报错终止后就跳转到存储PCD文件的头文件源代码里了,于是我尝试输入文件是.pcd文件,发现不报错了。。。不知道为啥不能用ply文件(记得刚接触PCL和C++的时候也是搞半天输入ply就是出错,只能用pcd,后来才发现原来输入不同格式的文件要不同的头文件,但是现在这个我又不知道了,可能很久之后才会回来填坑吧)
12. 利用cin从键盘输入数字,但是就是闪退,如果单步调试的话结果是对的
原因:因为cin读取数据后,以回车或空格作为分隔符保存到缓冲区域,如果没有读取出来的话,下面的程序执行不了,就总是闪退
解决:下面加一行 cin.get(); 把回车读取出来就好了
在这里插入图片描述

12. R6010 -abort() has been called(未解决)

在这里插入图片描述
Assertion failed: (reinterpret_cast<size_t>(array) & 0xf) == 0 && “this assertion is explained here: " “http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html” " **** READ THIS WEB PAGE !!! ****”, filed f:\pcl1.8.0\3rdparty\eigen\include\eigen3\eigen\src\core\densestorage.h, line 86
在这里插入图片描述

13. VTK编译出现no override found for ‘vtkPolyDataMapper’

在这里插入图片描述
解决:
加这三句话就欧克

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

参考:
https://blog.csdn.net/thecentry/article/details/79111295

14. Assertion failed: (reinterpret_cast<size_t>(array) & 0xf) == 0 && “this assertion is explained here: " “http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html” " **** READ THIS WEB PAGE !!! ****”, file f:\pcl1.8.0\3rdparty\eigen\include\eigen3\eigen\src\core\densestorage.h, line 86

建立保存多个cvfh特征的vector时出现BUG:
在这里插入图片描述
在这里插入图片描述

Assertion failed: (reinterpret_cast<size_t>(array) & 0xf) == 0 && “this assertion is explained here: " “http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html” " **** READ THIS WEB PAGE !!! ****”, file f:\pcl1.8.0\3rdparty\eigen\include\eigen3\eigen\src\core\densestorage.h, line 86

解决:
https://blog.csdn.net/ppdd20051101/article/details/7340628
加入这个会报错: #define EIGEN_DONT_ALIGN_STATICALLY
在这里插入图片描述

加入这个运行成功:
#define EIGEN_DONT_VECTORIZE
#define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT

15. Assertion failed: px != 0, file f:\pcl1.8.0\3rdparty\boost\include\boost-1_59\boost\smart_ptr\shared_ptr.hpp, line 687

在这里插入图片描述
在这里插入图片描述
原因:指针溢出了
错误代码:

typedef pcl::PointCloud<pcl::VFHSignature308> cvfhFeature;
cvfhFeature::Ptr all_cvfh;
for (int i = 0; i < numberOfViews; i++)
{
pcl::CVFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> cvfh;
cvfh.setInputCloud(data1[i].cloud);
cvfh.setInputNormals(cloud_normals_ptr);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree2(new pcl::search::KdTree<pcl::PointXYZ>());
cvfh.setSearchMethod(tree2);
pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_fe_ptr(new pcl::PointCloud<pcl::VFHSignature308>());//vhf特征
cvfh.compute(*vfh_fe_ptr);
all_cvfh->points.push_back(vfh_fe_ptr->points[0]); //这里错了,因为没有初始化大小
}

正确代码:

typedef pcl::PointCloud<pcl::VFHSignature308> cvfhFeature;
	cvfhFeature::Ptr all_cvfh(new cvfhFeature);  
	all_cvfh->height = 1;
	all_cvfh->width = centorid_points->size();
	all_cvfh->is_dense = false;
for (int i = 0; i < numberOfViews; i++)
{
pcl::CVFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> cvfh;
cvfh.setInputCloud(data1[i].cloud);
cvfh.setInputNormals(cloud_normals_ptr);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree2(new pcl::search::KdTree<pcl::PointXYZ>());
cvfh.setSearchMethod(tree2);
pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_fe_ptr(new pcl::PointCloud<pcl::VFHSignature308>());//vhf特征
cvfh.compute(*vfh_fe_ptr);
all_cvfh->points.push_back(vfh_fe_ptr->points[0]);
}
  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值