windows - ucrtbase.dll : An invalid parameter was passed to a function that considers invalid parameters fatal

标签 windows opencv visual-studio-2015 sift keypoint

我目前正在使用 OpenCV 进行个人项目,在程序执行过程中遇到了一些问题。在实现 AKAZE + BOW 识别器(对于我的问题似乎效果不佳)后,我想尝试 SIFT(最终是 SURF)实现。

对于我的项目,我正在关注 github 上的这个项目我在 Windows 10 上使用 VS2015(社区)和 OpenCV 2.4.13。

如标题所述,我遇到的问题在于 ucrtbase.dll,它在执行期间获取无效参数(如果我正确读取其他线程,该 dll 应该是 Windows 10 中的操作系统库)。当 for cicle 移动到第二次迭代时(也就是当它应该为 BOW 训练获取另一个图像的特征时)出现问题,这就是执行停止并出现标题错误的时候。

我尝试了各种方法(例如,对检测器/提取器使用不同的构造函数或注释部分代码),在调试 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 */
}

如果您还需要了解任何其他信息以了解问题,请告诉我。

提前感谢您给我的任何帮助/建议。

编辑 1:

我尝试删除所有的 cicles,程序设法正确执行所有功能,但从 main 返回时仍然出现 ucrtbase.dll 错误。我在 VS 调试期间注意到的另一件事是,调试器在必须释放内存(使用该 dll)时生成异常,无论是在 for cicles 期间还是在程序结束时。

我想这里的调试器有解决方案,但我真的不明白那个 dll 有什么问题,如果有人有空,我们将不胜感激任何帮助。

编辑 2:

经过几天的测试,错误似乎来自于:

std::vector< cv::KeyPoint >

如果 KeyPoint 向量被实例化并且仅在程序结束时被销毁,则计算工作正常并且在结束时出现 dll 错误(这很烦人但对于快速测试我可以应付)。

问题是我想创建使用这些向量的函数,而不必将它们作为参数传递。由于释放似乎是问题所在,所以我不能在每次调用所述函数后程序崩溃的情况下这样做。我也尝试过在向量上使用 clear() 和 swap() 但这也不起作用。

我会在继续编码的同时继续尝试解决这个问题,但我们将不胜感激任何帮助/见解。

最佳答案

这个向量释放崩溃的问题似乎与链接到错误版本的 OpenCV 库有关。如果您在 Debug 中构建,则需要链接到 opencv_world320d.lib(或 opencv_world310.lib 或您正在使用的任何版本的 OpenCV 的库)——版本号后的“d”很重要。对于发布配置,使用 opencv_worldXXX.lib 链接。

如果您看到“将无效参数传递给考虑...的函数”消息,这是同一问题的征兆。

关于windows - ucrtbase.dll : An invalid parameter was passed to a function that considers invalid parameters fatal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074100/

相关文章:

c - Windows 上的/proc/net/dev 替代方案

windows - 如何使用Windows命令行查找文件中字符串的出现次数?

windows - 写入主机和写入输出之间的 PowerShell 区别?

c++ - 级联文件加载错误

angular - 如何访问 typescript 文件中的 azure web app 应用程序设置值

c - UDP 数据包在套接字上停留多长时间?

c++ - OpenCV - 无法打开我的网络摄像头的窗口

c++ - 用opencv放大图像像素

c - 标签作为 clang 中的值

c++ - Visual Studio : Hotkey/way to step into f() in statement a()->f(b(), c(),d()) 直接