1

私がやっていることは、画像を(しきい値処理によって)前処理した後、画像の輪郭を見つけることです。そして、各輪郭の離散フーリエ記述子を取得したい (dft() 関数を使用) 私のコードは次のとおりです。

vector<Mat> contourLines1;
vector<Mat> contourLines2;

getContourLine(exC1, contourLines1, binThreshold, numOfErosions);
getContourLine(exC2, contourLines2, binThreshold, numOfErosions);

// calculate fourier descriptor
Mat fd1 = makeFD(contourLines1.front());
Mat fd2 = makeFD(contourLines2.front());

/////////////////////////

void getContourLine(Mat& img, vector<Mat>& objList, int thresh, int k){
  threshold(img,img,thresh,255,THRESH_BINARY);
  erode(img,img,0,cv::Point(-1,-1),k);
  cv::findContours(img,objList,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
}

/////////////////////////

Mat makeFD(Mat& contour){
  Mat result;
  dft(contour,result,DFT_ROWS); 
  return result;
}

何が問題ですか???私はそれを見つけることができません..関数のパラメータのタイプ( cv::finContours や dft など)が間違っていると思います....

4

1 に答える 1

1

findContours の出力は vector< vector< Point > > です。vector< Mat> を提供しています。これは正当な使用法ですが (少しあいまいですが)、matrix の型要素が 'int' であることを覚えておく必要があります。一方、DFT は float の行列でのみ機能します。これがクラッシュの原因です。convertTo関数を使用して、適切なタイプの行列を作成できます。

また、実行している計算に対して出力が意味を持つかどうかもわかりません。私の知る限り、フーリエ変換は、信号から抽出された座標ではなく、信号で機能するはずです。

文体的な発言:同じしきい値を実行するよりクリーンな方法は

img = (img > thresh);
于 2013-11-10T12:52:17.697 に答える