我现在正致力于功能匹配,我在下面编写了这些代码。
void CLPS::ExtractKeyPoints()
{
vector<DMatch> init_matches;
ULONGLONG timer;
timer = GetTickCount64();
Ptr<BRISK> fd_a = BRISK::create(20);
fd_a->detectAndCompute(S, Mat(), spoints, desc_s, false);
fd_a->detectAndCompute(T, Mat(), tpoints, desc_t, false);
timer = GetTickCount64() - timer;
cout << "Detect and compute: " << timer << " milliseconds complete. Output: " << spoints.size() << " points. \n";
timer = GetTickCount64();
FlannBasedMatcher matcher = FlannBasedMatcher(cv::makePtr<cv::flann::LshIndexParams>(10, 32, 2));
matcher.match(desc_s, desc_t, init_matches);
timer = GetTickCount64() - timer;
cout << "Matching time: " << timer << " milliseconds complete. " << endl;
Point2f spt, tpt;
int num_matches = 0;
vector<DMatch>::iterator iter_matches;
coord_matches.create(1, 3, CV_32FC1);
Mat cm_row;
cm_row.create(1, 3, CV_32FC1);
if (!init_matches.empty())
{
for (iter_matches = init_matches.begin(); iter_matches != init_matches.end(); ++iter_matches)
{
spt = spoints[iter_matches->queryIdx].pt;
tpt = tpoints[iter_matches->trainIdx].pt;
if (std::abs(spt.y - tpt.y) < VERTICAL_EPSILON && tpt.x - spt.x < upperbound && tpt.x - spt.x > lowerbound)
{
num_matches++;
coord_matches.reserve(num_matches);
cm_row.at<float>(0, 0) = spt.x;// 与 CV_32FC1 对应
cm_row.at<float>(0, 1) = spt.y;
cm_row.at<float>(0, 2) = tpt.x - spt.x;
coord_matches.push_back(cm_row);
}
}
cout << coord_matches.rows << " matches found." << endl;
}
else
{
cerr << "No match is found. Validate your source data or report to us if there is a bug. " << endl;
}
}
然后我就这样称呼它:
CLPS lps;
lps.ExtractKeyPoints();
但是,当此函数返回时,它会触发一条带有以下消息的异常:
dars_lps.exe中0x00007FFC0797D328(ucrtbase.dll)处的未处理异常:将无效参数传递给认为无效参数致命的函数。
其中dars_lps.exe
是我的应用程序名称。然后程序跳转到<vector>
中的一些析构函数。
我在Windows 8.1 Update 1上使用Visual Studio 2015,而我的OpenCV版本是3.1。我已经确认我正在链接到正确版本的库文件(即vc14)
我曾经在Windows 7 SP1上运行Visual Studio 2010,OpenCV 2.4.9,但它从未报告过这样的异常
我知道这个问题可能类似于其他地方的其他一些问题(例如OpenCV网站上的this),在调用不同的函数时会发生,但所有问题都没有解决。我怀疑问题出在BRISK或FlannBasedMatcher上,但是我不能注释掉那些代码(或者这个函数实际上是空的,很明显,没有例外)。
我也注意到OpenCV 3.0发布后问题出现了问题,大多数类似的问题都发生在较新版本的Visual Studio或Windows中。 64位和32位平台都存在这种问题。在Visual Studio 2015 here中确实存在此类问题的报告,但当使用Visual Studio 2015构建 no 库时,使用的是OpenCV 3.0。
它仍然是一个需要修复的错误或者我自己的语法错误吗?