我目前正在使用 OpenCV 进行个人项目,并且在执行程序期间遇到了一些问题。在实现了一个 AKAZE + BOW 识别器(它似乎对我的问题不够好)后,我想尝试一个 SIFT(最终是 SURF)实现。
对于我的项目,我正在关注在github上找到的这个项目,并且我在 Windows 10 上使用 VS2015(社区)和 OpenCV 2.4.13。
正如标题中所述,我遇到的问题在于 ucrtbase.dll 在执行期间获得了无效参数(如果我正确读取其他线程,则 dll 应该是 Windows 10 中的操作系统库)。当 for 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)时生成异常,无论是在 for cicles 期间还是在程序结束时。
我猜这里的调试器有解决方案,但我真的不明白那个dll有什么问题,如果有人有空的话,任何帮助都会非常感激。
编辑2:
经过几天的测试,错误似乎来自于以下内容的重新分配:
std::vector< cv::KeyPoint >
如果 KeyPoint 向量被实例化并且仅在程序结束时被销毁,则计算工作正常并且最后会出现 dll 错误(这很烦人,但对于我可以应付的快速测试)。
问题是我想创建利用这些向量的函数,而不必将它们作为参数传递。由于释放似乎是问题所在,因此在每次调用所述函数后,如果程序不崩溃,我就无法做到这一点。我也尝试在向量上使用 clear() 和 swap() ,但这也不起作用。
当我继续编码时,我会继续尝试解决这个问题,但任何帮助/见解将不胜感激。