cv :: goodFeaturesToTrack不会返回任何功能

Pie*_*ter 5 c++ opencv opticalflow computer-vision

我正在尝试使用cv::calcOpticalFlowPyrLK但有时在该函数中的内部断言失败.断言是npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0.我正在使用OpenCV 2.3.1.此功能的源代码可在此处获得.

很难绕过他们的代码,特别是因为我对计算机图形学的经验有限以及缺乏评论.为什么这个断言被触发,它对我的​​问题说了些什么?

编辑:我调用该函数如下:

cv::calcOpticalFlowPyrLK(curBwFrame, prvFrame, features, newFeatures, trackingStatus, errors);
Run Code Online (Sandbox Code Playgroud)

我发现features通过cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask);使用看似足够大且非常有效的图像的非空掩码调用而获得的向量不包含任何特征.怎么会发生这种情况?

curBwFrame

curBwFrame

skinMask

skinMask

我可以使用以下代码片段重现该问题:

#include <vector>
#include <cassert>
#include <opencv2\opencv.hpp>
using std::vector;
using namespace cv;

int main() {
    vector<Point2f> features;
    cv::Mat curBwFrame = imread("curBwFrame.png");
    cv::cvtColor(curBwFrame, curBwFrame, CV_RGB2GRAY);
    imwrite("test.png", curBwFrame);

    cv::Mat skinMask = imread("skinMask.png");
    cv::cvtColor(skinMask, skinMask, CV_RGB2GRAY);
    imwrite("test.png", skinMask);

    cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask);
    assert(features.size() > 0);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ian*_*ros 5

主要问题是你的参数。在OpenCV 2.3.2 文档中(2.3.1 之间没有兼容性变化),这是方法参数的描述:

\n\n
void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04 )\n
Run Code Online (Sandbox Code Playgroud)\n\n

参数:

\n\n
    \n
  • image \xe2\x80\x93 输入 8 位或浮点 32 位、单通道图像。
  • \n
  • corners \xe2\x80\x93 检测到的角点的输出向量。
  • \n
  • maxCorners \xe2\x80\x93 要返回的最大角数。如果存在的角点多于找到的角点,则返回其中最强的角点。
  • \n
  • QualityLevel \xe2\x80\x93 描述图像角点的最低可接受质量的参数。参数值乘以最佳角点质量度量,即最小特征值(请参阅cornerMinEigenVal() )或 Harris 函数响应(请参阅cornerHarris() )。质量指标低于产品的角\n将被拒绝。例如,如果最佳角点的qualitymeasure = 1500,并且qualityLevel=0.01,则质量度量小于15的所有角点都会被拒绝。
  • \n
  • minDistance \xe2\x80\x93 返回角之间\n可能的最小欧氏距离。
  • \n
  • mask \xe2\x80\x93 可选的感兴趣区域。如果图像不为空(它需要具有 CV_8UC1 类型且大小与 image 相同),则它指定检测角点的区域。
  • \n
  • blockSize \xe2\x80\x93 用于计算每个像素邻域上的导数\n协变矩阵的平均块的大小。请参阅cornerEigenValsAndVecs() 。
  • \n
  • useHarrisDetector \xe2\x80\x93 指示是否使用 Harris\n检测器(请参阅cornerHarris())或cornerMinEigenVal() 的参数。
  • \n
  • k \xe2\x80\x93 Harris 检测器的自由参数。
  • \n
\n\n

我建议您稍微调整一下qualityLevel 和minDistance 来满足您的需求。

\n