C++ opencv c++;矩阵到向量<;关键点>;

C++ opencv c++;矩阵到向量<;关键点>;,c++,opencv,mat,file-storage,keypoint,C++,Opencv,Mat,File Storage,Keypoint,在寻找这个(,)的答案后,我仍然对这两个问题感到困惑 如果可能的话 如果是的话,怎么做 我希望能够从一个.xml文件中读取,该文件有一个cv::Mat文件,其中包含Point2f keypoints,将其读回原始状态std::vector 我对文件的写入如下所示: cv::Ptr<cv::FeatureDetector> detector = new cv::OrbFeatureDetector(featureSize); cv::FileStorage fsKpts("keyp

在寻找这个(,)的答案后,我仍然对这两个问题感到困惑

  • 如果可能的话
  • 如果是的话,怎么做
我希望能够从一个
.xml
文件中读取,该文件有一个
cv::Mat
文件,其中包含
Point2f keypoints
,将其读回原始状态
std::vector

我对文件的写入如下所示:

cv::Ptr<cv::FeatureDetector> detector = new cv::OrbFeatureDetector(featureSize);
cv::FileStorage fsKpts("keypoints.xml", cv::FileStorage::WRITE);
for(size_t i = 0; i < ImgVec.size(); i ++){
    std::vector<cv::KeyPoint> imgKpts;
    std::vector<cv::Point2f> points;
    std::vector<cv::KeyPoint>::iterator it;
    detector->detect(ImgVec[i], imgKpts);
    for(it = imgKpts.begin(); it != imgKpts.end(); it ++) points.push_back(it->pt);
    cv::Mat matKpts(points);
    cv::string iValue = std::to_string(i);
    cv::string filename = "Image_" + iValue;
    fsKpts << filename << matKpts;
}
fsKpts.release();
编辑2

.xml
内容:

<?xml version="1.0"?>
<opencv_storage>
<Image_0 type_id="opencv-matrix">
  <rows>500</rows>
  <cols>1</cols>
  <dt>"2f"</dt>
  <data>
    456. 640. 458. 638. 603. 525. 411. 353. 604. 548. 417. 334. 600.
    515. 382. 334. 594. 448. 572. 481. 449. 603. 574. 612. 441. 648.
    470. 334. 439. 650. 412. 387. 438. 550. 568. 514. 575. 602. 452.
    ...

</data></Image_0>
<Image_1 type_id="opencv-matrix">
  <rows>500</rows>
  <cols>1</cols>
  <dt>"2f"</dt>
  <data>
    521. 353. 467. 563. 537. 510. 505. 378. 479. 286. 451. 552. 460.
    554. 541. 545. 463. 554. 492. 404. 457. 552. 534. 546. 463. 562.
    541. 550. 519. 350. 490. 285. 498. 473. 497. 635. 451. 578. 461.
    ...

</data></Image_1>

etc. etc.

500
1.
“2f”
456640458638603525411353604548417334600
515382334594448572481449603574612441648
470334439650412387438550568514575602452
...
500
1.
“2f”
521353467563537510505378479286451552460
554541545463554492404457552534546463562
541550519350490285498473497635451578461
...
等等等等。
您应该按照:中的步骤操作功能

但是,如果您想使用Mat,那么在访问Mat元素时,基本上模板将使用Point2f

Mat image_i;
fs2["Image_i"] >> image_i;
Point2f firstPoint = image_i.at<Point2f>(0);
Mat图像_i;
fs2[“图像i”]>>图像i;
点2f firstPoint=图像i.at(0);
编辑:

我检查了你的代码,所以你应该:

std::vector<std::vector<cv::KeyPoint>> fileKptsVec;
std::vector<cv::Mat> filesVec(imgVec.size());
cv::FileStorage fs("keypoints.xml", cv::FileStorage::READ);
for(size_t i = 0; i < imgVec.size(); i++){
    std::vector<cv::KeyPoint> imageIKeypoints;
    cv::string iValue = std::to_string(i);
    cv::string filename = "Image_" + iValue;
    fs[filename] >> filesVec[i];
    for(size_t j = 0; j < filesVec[i].rows; j++) {
        cv::KeyPoint kp;
        kp.pt = filesVec[i].at<cv::Point2f>(j);
        imageIKeypoints.push_back(kp);
    }
    fileKptsVec.push_back(imageIKeypoints);
}
fs.release();
std::vector fileKptsVec;
std::vector filesVec(imgVec.size());
cv::FileStorage fs(“keypoints.xml”,cv::FileStorage::READ);
对于(size_t i=0;i>filesVec[i];
对于(大小j=0;j

然而,当你们回到关键点,你们有位置,但失去了其他信息。如果有问题:功能。

是否检查了.xml内容?这就是你所期望的吗?你能把你的代码也发布出来阅读吗?
.xml
的内容是正确的,我的“阅读代码”只是猜测,实际上不起作用,但我想我可以把它添加到
filesVec
中,在经过一点修改后,它现在无法运行该行
fs[filename]>>filesVec[i]因为
矢量下标超出了范围,但我根本看不出是什么原因造成的。
文件名
.xml
文件相同,我用不同的数字替换了
I
,检查是否存在任何重复变量。。。没有什么!这是一个已知的问题,还是这里出了问题?我对上面的代码做了一点修改,将filevec初始化为imgVec大小。filesVec.push_back(fs[filename]);应该也能用。奇怪的是它以前运行得很好。。。谢谢你!
std::vector<std::vector<cv::KeyPoint>> fileKptsVec;
std::vector<cv::Mat> filesVec(imgVec.size());
cv::FileStorage fs("keypoints.xml", cv::FileStorage::READ);
for(size_t i = 0; i < imgVec.size(); i++){
    std::vector<cv::KeyPoint> imageIKeypoints;
    cv::string iValue = std::to_string(i);
    cv::string filename = "Image_" + iValue;
    fs[filename] >> filesVec[i];
    for(size_t j = 0; j < filesVec[i].rows; j++) {
        cv::KeyPoint kp;
        kp.pt = filesVec[i].at<cv::Point2f>(j);
        imageIKeypoints.push_back(kp);
    }
    fileKptsVec.push_back(imageIKeypoints);
}
fs.release();