用的OpenCV+QT,OpenCV可以正常显示幅度谱但放在Qt上的label就显示不了,估计是跟通道有关,有大佬知道怎么处理吗?转通道之类?贴一下代码
Mat srcImage, Mat amplitude, Mat phase在类中定义并传进去
imshow("amplitude", amplitude);这句在opencv中可以打开
我横线下面部分放在QT label上显示幅度谱,但没有现象,估计是跟幅度谱的通道有关?大佬们知道幅度谱的通道吗?
void imageProcessSystem::fourierTrans(Mat srcImage, Mat amplitude, Mat phase)//Mat srcImage,
{
cvtColor(srcImage, srcImage, CV_BGR2GRAY);//!!!需要先转灰度
Mat padded;
int m = getOptimalDFTSize(srcImage.rows);//返回给定向量尺寸经DFT变换后的最优尺寸大小
int n = getOptimalDFTSize(srcImage.cols);
copyMakeBorder(srcImage, padded, 0, m - srcImage.rows, 0, n - srcImage.cols, BORDER_CONSTANT, Scalar::all(0));
Mat planes[] = { Mat_(padded), Mat::zeros(padded.size(), CV_32F) };
Mat complexI;
merge(planes, 2, complexI); //将planes融合合并成一个多通道数组complexI
dft(complexI, complexI); //进行傅里叶变换
split(complexI, planes);
magnitude(planes[0], planes[1], planes[0]);//planes[0] = magnitude,计算二维矢量的幅值
amplitude = planes[0];
phase = planes[1];
amplitude += Scalar::all(1);//所有标量加一
log(amplitude, amplitude);
amplitude = amplitude(Rect(0, 0, amplitude.cols&-2, amplitude.rows&-2));
int cx = amplitude.cols / 2;
int cy = amplitude.rows / 2;
Mat q0(amplitude, Rect(0, 0, cx, cy)); //左上角图像划定ROI区域
Mat q1(amplitude, Rect(cx, 0, cx, cy)); //右上角图像
Mat q2(amplitude, Rect(0, cy, cx, cy)); //左下角图像
Mat q3(amplitude, Rect(cx, cy, cx, cy)); //右下角图像
//变换左上角和右下角象限
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
//变换右上角和左下角象限
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
normalize(amplitude, amplitude, 0, 1, CV_MINMAX);//数组的数值被平移或缩放到一个指定的范围
cv::resize(amplitude, amplitude, cvS);
imshow("amplitude", amplitude);
//————————————————————————————
am = QImage((const unsigned char*)(amplitude.data),
amplitude.cols, amplitude.rows,
amplitude.cols*amplitude.channels(),
QImage::Format_RGB888);
ui.label_3->setPixmap(QPixmap::fromImage(am));
}