ucrtbase.dll: 将无效参数传递给认为无效参数致命的函数
ucrtbase.dll: An invalid parameter was passed to a function that considers invalid parameters fatal
我目前正在使用 OpenCV 进行个人项目,在程序执行过程中遇到了一些问题。在实施了 AKAZE + BOW 识别器(对于我的问题似乎效果不佳)之后,我想尝试 SIFT(最终是 SURF)实施。
对于我的项目,我正在关注 github 上的这个项目,并且我在 Windows 10.
上使用 VS2015(社区)和 OpenCV 2.4.13
如标题所述,我遇到的问题在于 ucrtbase.dll,它在执行期间获得了无效参数(如果我正确读取其他线程,dll 应该是 OS Windows 10) 中的库。当 for cicle 移动到第二次迭代时(也就是当它应该为 BOW 训练获取另一个图像的特征时)出现问题,这是执行停止并出现标题错误的时候。
我尝试了各种方法(例如,对 detector/extractor 或代码的注释部分使用不同的构造函数)并且在调试期间 session 似乎错误是由检测函数引起的,但是我不确定为什么(另外,如下面的代码所述,注释检测函数及其后面的函数可以解决问题)。
drawKeypoints 函数(在另一个测试中使用)似乎正确地绘制了关键点(这应该意味着检测函数工作正常)。
您可以在下面找到出现错误的代码段:
int main(int argc, char ** argv)
{
const int nimages = 4;
const int nclusters = 2;
const char *datapath = "./database";
SiftFeatureDetector detector(400);
SiftDescriptorExtractor extractor;
Ptr<BOWTrainer> bow_train = makePtr<BOWKMeansTrainer>(nclusters);
for (int i = 0; i<nimages; i++)
{
Mat im, feat;
std::vector<KeyPoint> kp;
// read an image from the database
im = cv::imread(format("%s/%d.png", datapath, i + 1), 1);
// detect keypoints
detector.detect(im, kp); // commenting from here avoids the error
// extract features
extractor.compute(im, kp, feat);
// add features for bow training
bow_train->add(feat);
}
/* more stuff here */
}
如果您还需要了解任何其他信息以了解问题,请告诉我。
在此先感谢您 help/advice 给我的任何信息。
编辑 1:
我尝试删除所有的 cicles,程序设法正确执行所有功能,但从 main 返回时仍然出现 ucrtbase.dll 错误。我在 VS 调试期间注意到的另一件事是调试器在必须释放内存(使用该 dll)时生成异常,无论是在 for cicles 期间还是在程序结束时。
我想这里的调试器有解决方案,但我真的不知道那个 dll 有什么问题,如果有人有时间,我们将不胜感激任何帮助。
编辑 2:
经过几天的测试,错误似乎来自于以下的重新分配:
std::vector< cv::KeyPoint >
如果 KeyPoint 向量被实例化并且仅在程序结束时被销毁,则计算工作正常并且最后出现 dll 错误(这很烦人但对于快速测试我可以应付)。
问题是我想创建使用这些向量的函数,而不必将它们作为参数传递。由于释放似乎是问题所在,所以我不能在每次调用所述函数后程序崩溃的情况下这样做。我也尝试过在向量上使用 clear() 和 swap() 但这也不起作用。
我会在继续编码的过程中继续尝试解决这个问题,但任何 help/insight 都将不胜感激。
过了一段时间我想我明白了。
问题似乎出在 VS2015 编译器上:OpenCV 2.4.13 在该版本的 VS 上存在一些问题,这可能是因为只有一个 vc12 文件夹而不是应该与 VS2015 一起使用的 vc14(基本上兼容性是不能完全保证)。
在移动到 OpenCV3.1 构建(带有额外模块)后,程序 运行 没有抛出任何异常。
这个向量释放崩溃的问题似乎与 link针对错误版本的 OpenCV 库有关。如果您在 Debug 中构建,则需要针对 opencv_world320d.lib(或 opencv_world310.lib 或您正在使用的任何版本的 OpenCV 的库)进行 linked - "d" 之后的版本号很重要。对于发布配置,使用 opencv_worldXXX.lib 到 link 反对。
如果您看到 "invalid parameter was passed to a function that considers..." 消息,这是同一问题的症状。
我目前正在使用 OpenCV 进行个人项目,在程序执行过程中遇到了一些问题。在实施了 AKAZE + BOW 识别器(对于我的问题似乎效果不佳)之后,我想尝试 SIFT(最终是 SURF)实施。
对于我的项目,我正在关注 github 上的这个项目,并且我在 Windows 10.
上使用 VS2015(社区)和 OpenCV 2.4.13如标题所述,我遇到的问题在于 ucrtbase.dll,它在执行期间获得了无效参数(如果我正确读取其他线程,dll 应该是 OS Windows 10) 中的库。当 for cicle 移动到第二次迭代时(也就是当它应该为 BOW 训练获取另一个图像的特征时)出现问题,这是执行停止并出现标题错误的时候。
我尝试了各种方法(例如,对 detector/extractor 或代码的注释部分使用不同的构造函数)并且在调试期间 session 似乎错误是由检测函数引起的,但是我不确定为什么(另外,如下面的代码所述,注释检测函数及其后面的函数可以解决问题)。
drawKeypoints 函数(在另一个测试中使用)似乎正确地绘制了关键点(这应该意味着检测函数工作正常)。
您可以在下面找到出现错误的代码段:
int main(int argc, char ** argv)
{
const int nimages = 4;
const int nclusters = 2;
const char *datapath = "./database";
SiftFeatureDetector detector(400);
SiftDescriptorExtractor extractor;
Ptr<BOWTrainer> bow_train = makePtr<BOWKMeansTrainer>(nclusters);
for (int i = 0; i<nimages; i++)
{
Mat im, feat;
std::vector<KeyPoint> kp;
// read an image from the database
im = cv::imread(format("%s/%d.png", datapath, i + 1), 1);
// detect keypoints
detector.detect(im, kp); // commenting from here avoids the error
// extract features
extractor.compute(im, kp, feat);
// add features for bow training
bow_train->add(feat);
}
/* more stuff here */
}
如果您还需要了解任何其他信息以了解问题,请告诉我。
在此先感谢您 help/advice 给我的任何信息。
编辑 1:
我尝试删除所有的 cicles,程序设法正确执行所有功能,但从 main 返回时仍然出现 ucrtbase.dll 错误。我在 VS 调试期间注意到的另一件事是调试器在必须释放内存(使用该 dll)时生成异常,无论是在 for cicles 期间还是在程序结束时。
我想这里的调试器有解决方案,但我真的不知道那个 dll 有什么问题,如果有人有时间,我们将不胜感激任何帮助。
编辑 2:
经过几天的测试,错误似乎来自于以下的重新分配:
std::vector< cv::KeyPoint >
如果 KeyPoint 向量被实例化并且仅在程序结束时被销毁,则计算工作正常并且最后出现 dll 错误(这很烦人但对于快速测试我可以应付)。
问题是我想创建使用这些向量的函数,而不必将它们作为参数传递。由于释放似乎是问题所在,所以我不能在每次调用所述函数后程序崩溃的情况下这样做。我也尝试过在向量上使用 clear() 和 swap() 但这也不起作用。
我会在继续编码的过程中继续尝试解决这个问题,但任何 help/insight 都将不胜感激。
过了一段时间我想我明白了。
问题似乎出在 VS2015 编译器上:OpenCV 2.4.13 在该版本的 VS 上存在一些问题,这可能是因为只有一个 vc12 文件夹而不是应该与 VS2015 一起使用的 vc14(基本上兼容性是不能完全保证)。
在移动到 OpenCV3.1 构建(带有额外模块)后,程序 运行 没有抛出任何异常。
这个向量释放崩溃的问题似乎与 link针对错误版本的 OpenCV 库有关。如果您在 Debug 中构建,则需要针对 opencv_world320d.lib(或 opencv_world310.lib 或您正在使用的任何版本的 OpenCV 的库)进行 linked - "d" 之后的版本号很重要。对于发布配置,使用 opencv_worldXXX.lib 到 link 反对。
如果您看到 "invalid parameter was passed to a function that considers..." 消息,这是同一问题的症状。