2016-03-22 12 views
0

OpenCV3のYAMLファイルから機能検出器(例:SIFT)のパラメータを読み込もうとしています。OpenCV3のxml/ymlファイルからアルゴリズムのパラメータを読み書きする方法

私はDocumentationで提案コードを使用しようとしています。しかし、それはまったくコンパイルされません。だから、私は少し

#include "opencv2/opencv.hpp" 
#include <opencv2/core/persistence.hpp> 
#include "opencv2/xfeatures2d.hpp" 
using namespace cv::xfeatures2d; 


int main() { 

    cv::Ptr<cv::Feature2D> surf = SURF::create(); 
    cv::FileStorage fs("../surf_params.yaml", cv::FileStorage::WRITE); 

    if(fs.isOpened()) // if we have file with parameters, read them 
    { 
     std::cout << "reading parameters" << std::endl; 

     surf->read(fs["surf_params"]); 
    } 
    else // else modify the parameters and store them; user can later edit the file to use different parameters 
    { 
     std::cout << "writing parameters" << std::endl; 
     cv::Ptr<cv::xfeatures2d::SURF> aux_ptr; 
     aux_ptr = surf.dynamicCast<cv::xfeatures2d::SURF>(); 
     aux_ptr->setNOctaves(3); // lower the contrast threshold, compared to the default value 
     { 
      cv::internal::WriteStructContext ws(fs, "surf_params", CV_NODE_MAP); 
      aux_ptr->write(fs); 
     } 
    } 
    fs.release(); 

// cv::Mat image = cv::imread("myimage.png", 0), descriptors; 
// std::vector<cv::KeyPoint> keypoints; 
// sift->detectAndCompute(image, cv::noArray(), keypoints, descriptors); 

return 0; 

} 

を変更し、それをコンパイルするために作る。しかしパラメータは、読み取りまたはまったく書いていません。

私もこのTransition Guideをチェックし、セクションの「アルゴリズムのインタフェースが」と言っている:一般的なアルゴリズムの使用パターンが変化した

:今、それはスマートポインタのCV :: Ptrはに包まれたヒープ上に作成する必要があります。バージョン2.4では、直接またはスマートポインタを介して、スタック割り当てとヒープ割り当ての両方が許可されていました。

CV_INIT_ALGORITHMマクロとともに、cv :: Algorithmクラスからgetおよびsetメソッドが削除されました。 3.0では、すべてのプロパティがgetProperty/setProperty純粋仮想メソッドのペアに変換されています。その結果、cv :: Algorithmインスタンスを名前で作成して使用することはできません(汎用のAlgorithm :: create(String)メソッドを使用して)、対応するファクトリメソッドを明示的に呼び出す必要があります。

これは、read()およびwrite()関数を使用してXML/YAMLファイルからパラメータを読み書きすることができない可能性があります。

OpenCV3のXML/YAMLファイルからフィーチャディテクタアルゴリズムのパラメータを読み取るにはどうすればよいでしょうか?

ありがとうございます!

+0

チェック[この](のhttp:// stackoverflowのその後

fs << "Type" << "SURF"; 

とは条件付きでそのプロパティを復元するためのオプションをお読みください。 com/a/34547718/5008845) – Miki

+0

再生していただきありがとうございます。私は答えを試みたが、うまくいかなかった。私が見つけた元の質問に、より多くの情報を追加します。 – taihu

+0

READモードでファイルを読み込もうとしました – Miki

答えて

0

特定のアルゴリズムがcv::Algorithm::readcv::Algorithm::writeのメソッドをオーバーライドする場合は、前述のように使用することができます(例:here)。

ただし、cv::xfeatures2d::SURFはこれらのメソッドをオーバーライドしないため、この方法を使用することはできません。

あなたは、しかし、あなたはFileStorageに変更する必要があるプロパティを格納いつものようにそれらを読み、書き、SURFオブジェクト変更することができます:あなたはsurfオブジェクトaを作ることができ

#include <opencv2/opencv.hpp> 
#include <opencv2/xfeatures2d.hpp> 
#include <opencv2/xfeatures2d/nonfree.hpp> 
#include <iostream> 

int main() 
{ 
    cv::Ptr<cv::Feature2D> surf = cv::xfeatures2d::SURF::create(); 

    { 
     // Try to read from file 
     cv::FileStorage fs("surf_params.yaml", cv::FileStorage::READ); 
     if (fs.isOpened()) 
     { 
      std::cout << "reading parameters" << std::endl; 

      // Read the parameters 
      int nOctaves = fs["nOctaves"]; 
      surf.dynamicCast<cv::xfeatures2d::SURF>()->setNOctaves(nOctaves); 
     } 
     else 
     { 
      // Close the file in READ mode 
      fs.release(); 

      // Open the file in WRITE mode 
      cv::FileStorage fs("surf_params.yaml", cv::FileStorage::WRITE); 

      std::cout << "writing parameters" << std::endl; 

      fs << "nOctaves" << 3; 

      // fs in WRITE mode automatically released 
     } 
     // fs in READ mode automatically released 
    } 
} 

をキャストを避けるためにcv::xfeatures2d::SURFへのポインタ:

cv::Ptr<cv::xfeatures2d::SURF> surf = ... 

違うFeatures2Dをサポートする必要がある場合は、することができますなどもFileStorage特定の機能のための識別子で店舗、:

string type; 
FileNode fn_type = fs.root(); 
type = fn_type["Type"]; 

if(type == "SURF") { 
    // Read SURF properties... 
} else if(type == "SIFT") { 
    // Read SIFT properties... 
} 
+0

ありがとうMiki!あなたは私の考えを確認します。したがって、XML/YMLファイルから一般的な方法でパラメータを読み取ることはできません。私はあなたが提案する答えを使用します。 – taihu

+0

実際にこの機能が欠落しているか、設計上の選択であるかどうかは調査しませんでした。とにかく、回避策はかなり簡単です。それが喜んで助けた; D – Miki