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 >>。您正在提供矢量< Mat>。这是一个合法的用途(虽然有点晦涩),但你必须记住矩阵中的类型元素是'int'。另一方面,DFT 仅适用于浮点矩阵。这就是导致崩溃的原因。您可以使用convertTo函数来创建适当类型的矩阵。

此外,我不确定输出对您正在进行的任何计算是否有任何意义。据我所知,傅里叶变换应该适用于信号,而不是从中提取的坐标。

只是一个文体评论:执行相同阈值的更清洁方法是

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