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
}