OpenCV cv :: MatをVlfeat vl_dsift_processに供給できるfloat *に変換する方法は?

OpenCVの cv :: Matfloat * に変換して Vlfeat vl_dsift_process に送る方法は? vl_dsift_process が1次元の浮動小数点配列でどのように動作するのか理解できません。 公式サンプルはMatLab APIの使い方を示しています。 C APIに関するサンプルはなく、唯一の手がかりはソースパッケージのMEXファイルです。

5
この問題は、MatlabからCに行列がどのように渡されるかに関係していますか?
追加された 著者 Jiayuan Ma,

2 答え

float * matData =(float *)myMat.data;

データへのポインタを使用して終了する前に、マトリックスが削除されていないか/範囲外になっていることを確認してください。そして、行列に浮動小数点が含まれていることを確認します。

11
追加された
行列は連続的であるかどうかをチェックする必要があります。そうでなければ、1次元配列として解釈できません。また、 reinterpret_cast は、このキャストの危険な性質を明確に示すため、ここで reinterpret_cast を使用する方が適切だと思います。とにかく、DSIFTの抽出はおそらく行列を vector に変換するよりも何桁も遅くなるので、関連するオーバーヘッドは無視でき、安全性と可搬性の点では価値があると思います。
追加された 著者 lizarisk,

vl_dsift_processが1次元の浮動小数点配列でどのように動作するかはわかりません。

DSIFTは、ピクセル(x、y)の輝度がfloat_array [y * width + x]にfloat値として格納されているグレースケール画像を期待しています。 OpenCVでは、画像は符号なしの文字として格納されるため、Mat :: dataからfloat *への単純な変換は機能しません。すべての値を浮動小数点に手動で変換する必要があります:

Mat mat = imread("image_name.jpg", 0);//0 stands for grayscale

vector img;
for (int i = 0; i < mat.rows; ++i)
  for (int j = 0; j < mat.cols; ++j)
    img.push_back(mat.at(i, j));

vl_dsift_process(dsift, &img[0]);
4
追加された