【问题标题】:opecv c++ matching descriptors from file来自文件的opencv c ++匹配描述符
【发布时间】:2015-04-28 15:23:57
【问题描述】:

我提取descriptors,然后将它们保存到这样的文件中:

detector->detect(img, imgKpts);
extractor->compute(img, imgKpts, imgMat);
fsKpts << filename << imgMat;

但是当我像这样read他们又回来了:

std::vector<cv::Mat> filesDVec;
cv::Mat temp;
fs[filename] >> temp;
filesDVec.push_back(temp);

match descriptors 加载图像:

cv::Mat givenIn, givenInMat;
givenIn = cv::imread(dataDirGivenIn, CV_LOAD_IMAGE_GRAYSCALE);
cv::vector<cv::KeyPoint> givenInKpts;
detector->detect(givenIn, givenInKpts);
extractor->compute(givenIn, givenInKpts, givenInMat);
cv::vector<cv::DMatch> matchesVector;

与 2 个cv::Mats 这样循环:

matcher->match(filesDVec[i], givenInMat, matchesVector);

A.K.A match(Scene, Object, ...) 输出为:minDist = 100 maxDist = 0(不是一个匹配项)。

但是这样对待他们:

matcher->match(givenInMat, filesDVec[i], matchesVector);

A.K.A match(Object, Scene, ...) 抛出此错误:

opencv error:assertion failed (type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type = CV_8U)) in void cv::batchDistance

我想保存每张图片的描述信息以便加载,我做错了什么?

编辑

我要补充一点,这不是尝试匹配和映像到自身的情况,因为众所周知,如果对象和源图像相同,则 matcher 不起作用。

编辑 2

文件内容:

Image_0: !!opencv-matrix
   rows: 315
   cols: 32
   dt: u
   data: [ 0, 128, 196, 159, 108, 136, 172, 39, 188, 3, 114, 16, 172,
       234, 0, 66, 74, 43, 46, 128, 64, 172, 67, 239, 4, 54, 218, 8, 84,
       0, 225, 136, 160, 133, 68, 155, 204, 136, 232, 47, 61, 17, 115,
       18, 236, 106, 8, 81, 107, 131, 46, 128, 114, 56, 67, 213, 12, 50,
       218, 64, 21, 8, 209, 136, 180, 69, 70, 142, 28, 130, 238, 96, 141,
       128, 243, 2, 74, 74, 37, 65, 120, 161, 78, 226, 104, 163, 0, 204,
...
etc

阅读:

std::vector<cv::Mat> filesDVec(imgVec.size());
cv::Mat temp;
cv::FileStorage fs("tileDesc.yml", cv::FileStorage::READ);
for(size_t i = 0; i < (imgVec.size()); i++){
    cv::string iValue = std::to_string(i);
    cv::string filename = "Image_" + iValue;
    fs[filename] >> temp;
    filesDVec.push_back(temp);  
}
fs.release();

【问题讨论】:

  • matcher-&gt;match 的两个错误意味着filesDVec[i] 可能是一个空的 Mat。确保fs[filename] &gt;&gt; temp; 确实读取了您指定的文件。
  • 我查过了,确实如此。

标签: c++ opencv file-storage orb feature-descriptor


【解决方案1】:

问题是您使用imgVec.size() 元素分配和构造filesDVec(它们是空的cv::Mats)。然后每个描述符(您在for 循环中加载)都将添加到向量filesDVec 的末尾。

因此,您尝试将一些空的cv::Mat 匹配到givenInMat,这很可能会导致应用程序崩溃或断言。试读如下:

std::vector<cv::Mat> filesDVec;
cv::Mat temp;
cv::FileStorage fs("tileDesc.yml", cv::FileStorage::READ);

for(size_t i = 0; i < (imgVec.size()); i++){
    cv::string iValue = std::to_string(i);
    cv::string filename = "Image_" + iValue;
    fs[filename] >> temp;
    filesDVec.push_back(temp);  
}

fs.release();

【讨论】:

    【解决方案2】:

    您是否以 READ 模式打开文件?否则opencv会在读取之前清空文件。

    FileStorage fsKpts(filename, FileStorage::READ);
    fsKpts[filename] >> temp;
    

    代替

    FileStorage fsKpts(filename, FileStorage::WRITE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2018-04-21
      • 2017-10-05
      • 2016-11-27
      • 2010-09-08
      • 1970-01-01
      相关资源
      最近更新 更多