2

持っているvector<Descriptor> m_keyDescs

次のように指定された記述子:

Descriptor(float x, float y, vector<double> const& f)
{
    xi = x;
    yi = y;
    fv = f;
}

次のようにプッシュ:

m_keyDescs.push_back(Descriptor(descxi, descyi, fv));

このベクトルをcv::Matに変換する方法は?

私が試してみました

descriptors_scene = cv::Mat(m_keyDescs).reshape(1);

プロジェクトはエラーなしでデバッグされますが、実行すると、MacのQtCreatorにエラーが表示されます。

テストが予期せず終了する[再度開く]をクリックして、アプリケーションを再度開きます。

4

2 に答える 2

2

手動で定義されたクラスのベクトルを直接マットに変換することはできません。たとえば、OpenCVは各要素をどこに配置するかわからず、要素はすべて同じ変数タイプではありません(3番目は単一の要素でもないため、マット内の要素にすることはできません)。ただし、たとえば、intまたはfloatのベクトルを直接Matに変換することはできます。詳細については、こちらの回答をご覧ください。

于 2013-02-13T22:05:29.157 に答える
0
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

class Descriptor {
public:
  float xi;
  float yi;
  vector< double > fv;
  Descriptor(float x, float y, vector<double> const& f) :
    xi(x), yi(y), fv(f){}
};

int main(int argc, char** argv) {
  vector<Descriptor> m_keyDescs;
  for (int i = 0; i < 10; i++) {
    vector<double> f(10, 23);
    m_keyDescs.push_back(Descriptor(i+3, i+5, f));
  }
  Mat_<Descriptor> mymat(1, m_keyDescs.size(), &m_keyDescs[0], sizeof(Descriptor));
  for (int i = 0; i < 10; i++) {
    Descriptor d = mymat(0, i);
    cout << "xi:" << d.xi << ", yi:" << d.yi << ", fv:[";
    for (int j = 0; j < d.fv.size(); j++)
      cout << d.fv[j] << ", ";
    cout << "]" << endl;
  }
}
于 2013-06-13T17:56:18.527 に答える