OpenCV中未处理的异常匹配

时间:2016-01-18 13:58:07

标签: c++ opencv visual-studio-2015

我现在正致力于功能匹配,我在下面编写了这些代码。

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。
它仍然是一个需要修复的错误或者我自己的语法错误吗?

0 个答案:

没有答案