2

OpenCVドキュメントからの参照を使用して、cv::Algorithmから継承する独自のアルゴリズムの作成に取り組んでいます。cv :: Algorithmを継承する独自のクラスを作成して成功しましたが、クラスがこの機能をラップしているm_modelために変更できないライブラリの構造体であるメンバーがあるため、これに問題があります。MyAlgorithm構造体。

とにかく、私は `uchar [3]である構造体内のメンバーを参照しようとしているので、それをcv::Ptrでラップしました。addParamメソッドでgetterまたはsetterを使用せずにプログラムをコンパイルすると、

obj.info()->addParam<uchar[3]>(obj, "arrPtr",  *arrPtr, false);

writeコードは正常にコンパイルされますが、MyAlgorithmオブジェクトをファイルにしようとすると、データを取得できないため、ランタイムエラーが発生します。名前のメンバー変数を探していますが、arr存在しません。そこで、クラスメンバーarr内のパラメーターにいくつかのgetterメソッドとsetterメソッドを定義しました。m_model

ただし、メンバー関数ポインターをaddParamsメソッドに渡す方法がわかりません。以下のコードで現在行っているような関数のように、それらをaddParamsメソッドに渡すことはできないことを私は知っています。私も次のことを試しました:

obj.info()->addParam<uchar[3]>(obj, "arr",  *arrPtr, false, &MyAlgorithm::getArr, &MyAlgorithm::setArr);

しかし、コンパイルエラーが発生します:

cannot convert parameter 5 from 'cv::Ptr<_Tp> (__thiscall MyAlgorithm::* )(void)' to 'cv::Ptr<_Tp> (__thiscall cv::Algorithm::* )(void)'

以下は私のソースコードの抜粋サンプルです。どんな助けでも大歓迎です。

my_algorithm.h

class MyAlgorithm : public cv::Algorithm    {
public:
    //Other class logic
    cv::Ptr<uchar[3]> getArr();
    void setArr(const cv::Ptr<uchar[3]> &arrPtr);

    virtual cv::AlgorithmInfo* info() const;
protected:
    //define members such as m_model
};
cv::Algorithm* createMyAlgorithm();
cv::AlgorithmInfo& MyAlgorithm_info();

my_algorithm.cpp

cv::Algorithm* createMyAlgorithm()
{
   return new MyAlgorithm();
}

cv::AlgorithmInfo& MyAlgorithm_info() 
{
   static cv::AlgorithmInfo MyAlgorithm_info_var("MyAlgorithm", createMyAlgorithm);
   return MyAlgorithm_info_var;
}

cv::AlgorithmInfo* MyAlgorithm::info() const
{
   static volatile bool initialized = false;

   if( !initialized ) 
   { 
      initialized = true;
      MyAlgorithm obj; 
      cv::Ptr<uchar[3]> *arrPtr = new cv::Ptr<uchar[3]>(&(obj.m_model->arr));
      obj.info()->addParam<uchar[3]>(obj, "arr",  *arrPtr, false, &getArr, &setArr);
   } 
   return &MyAlgorithm_info();
}

cv::Ptr<uchar[3]> MyAlgorithm::getArr(){
   //Logic to get arr
}
void MyAlgorithm::setArr(const cv::Ptr<uchar[3]> &arrPtr){
   //Logic to set arr
}
4

1 に答える 1

2

私はなんとかとsetterメソッドを機能させることができましgetterた。addParam問題は、次のstatic_castように親クラスに対してを実行する必要があることでした。

typedef cv::Ptr<uchar[3]> (cv::Algorithm::*ArrGetter)();
typedef void (cv::Algorithm::*ArrSetter)(const cv::Ptr<uchar[3]> &);
obj.info()->addParam<uchar[3]>(obj, "arr",  *arrPtr, false, static_cast<ArrGetter>(&MyAlgorithm::getArr), static_cast<ArrSetter>(&MyAlgorithm::setArr));

ただし、OpenCVはの読み取りと書き込みを処理する方法を知らないこともわかりましたuchar[3]cv::Vec3bどちらもうまくいかないように試したのでcv::Mat、セッターとゲッターを使うことにしました。したがって、最終的な解決策は次のようになります。

my_algorithm.h

class MyAlgorithm : public cv::Algorithm    {
public:
    typedef cv::Mat (cv::Algorithm::*ArrGetter)();
    typedef void (cv::Algorithm::*ArrSetter)(const cv::Mat &);

    //Other class logic
    cv::Mat getArr();
    void setArr(const cv::Mat &arrPtr);

    virtual cv::AlgorithmInfo* info() const;
protected:
    uchar[3] arr;
};
cv::Algorithm* createMyAlgorithm();
cv::AlgorithmInfo& MyAlgorithm_info();

my_algorithm.cpp

cv::AlgorithmInfo* MyAlgorithm::info() const
{
    static volatile bool initialized = false;

    if( !initialized ) 
    { 
        initialized = true;
        MyAlgorithm obj;
        cv::Vec3b arrVec(arr);
        obj.info()->addParam(obj, "arr",  (cv::Mat)arrVec, false, static_cast<ArrGetter>(&MyAlgorithm::getArr), static_cast<ArrSetter>(&MyAlgorithm::setArr));
    } 
    return &MyAlgorithm_info();
}

cv::Mat MyAlgorithm::getArr(){
    cv::Vec3b arrVec(arr);
    return (cv::Mat)arrVec;
}
void MyAlgorithm::setArr(const cv::Mat &arrMat){
    for (int i = 0; i < 3; i++)
        arr[i] = arrMat.at<uchar>(i);
}
于 2012-09-19T14:10:49.433 に答える