我目前正在与OpenCV合作开展个人项目,在执行该计划期间我遇到了一些问题。在实现了一个AKAZE + BOW识别器(它似乎不能很好地解决我的问题)后,我想尝试一个SIFT(最终是SURF)实现。
对于我的项目,我跟随github上的这个项目,并且我在Windows 10上使用VS2015(社区)和OpenCV 2.4.13。
正如标题中所述,我遇到的问题在于ucrtbase.dll在执行期间获取了无效参数(如果我正确读取其他线程,则dll应该是Windows 10中的OS库)。当cicle移动到第二次迭代时(也就是它应该获得BOW训练的另一个图像的特征时)会出现问题,这是执行停止并且标题中出现错误的时候。
我尝试了各种各样的事情(例如,使用不同的构造函数用于检测器/提取器或注释部分代码),并且在调试会话期间,似乎错误是由检测功能引起的,但我不确定为什么(另外,如下面的代码所述,注释检测功能及其后面的功能可以解决问题)。
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)时生成异常,无论是在执行过程中还是在程序结束时。
我想这里的调试器有解决方案,但我真的不知道该dll的问题,如果有人有空的话,任何帮助都会非常感激。
编辑2:
经过几天的测试后,似乎错误来自释放:
的std ::矢量&lt; cv :: KeyPoint&gt;
如果KeyPoint向量被实例化并且仅在程序结束时被销毁,则计算工作正常并且结束时出现dll错误(这很烦人但是我可以应对快速测试)。
问题是我想创建使用这些向量而不必将它们作为参数传递的函数。由于解除分配似乎是问题所以我不能在每次调用所述函数后都没有程序崩溃的情况下这样做。我也尝试在向量上使用clear()和swap(),但这也没有用。
我会不断尝试解决这个问题,因为我会继续编码,但任何帮助/洞察都会非常感激。
答案 0 :(得分:3)
关于向量释放崩溃的这个问题似乎与链接错误版本的OpenCV库有关。如果你在Debug中构建,你需要链接到opencv_world320d.lib(或opencv_world310.lib或者你正在使用的OpenCV版本的库) - &#34; d&#34;版本号后很重要。对于Release配置,请使用opencv_worldXXX.lib链接。
如果您看到&#34;无效参数已传递给考虑...&#34;消息这是同一问题的症状。
答案 1 :(得分:1)
过了一段时间,我想我想出来了。
似乎问题出在VS2015编译器上:OpenCV 2.4.13与该版本的VS存在一些问题,这可能是因为只有一个vc12文件夹而不是vc14应该与VS2015配合使用(基本上兼容性并不完全保证)。
转移到OpenCV3.1版本(带有额外的模块)后,程序正在运行而不会抛出任何异常。