Qt中的Label无法显示傅里叶变换的幅度谱,求大佬解答!!! 10C

用的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));
}

2个回答

统一把图形输出到位图里,然后加载

http://blog.51cto.com/whylinux/1877629

我找朋友帮助,已经解决了。与QT无关,是我用OpenCV缺少了异步,由于归一化后所以像素数值在0-1之间,所以放到QT上显示时候自然所有的店都默认为0,显示全黑。
只要在normalize(amplitude, amplitude, 0_, 1, CV_MINMAX);_归一化后面加多一句

amplitude.convertTo(amplitude,CV__8UC1,255, 0);

将幅度谱的像素灰度数值范围重新归到0-255之间就能显示了!!!
希望帮到后来者。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问