基于OpenCV的音频频谱优化(仿酷狗频谱)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/keepmoving0407/article/details/98939666

酷狗音乐是当今界面做的最好的软件,本人一直想模仿它,经过多年的研究,终于通过QT+FFmpg+OpenCV来解决了全部功能。

QT用来设计界面

FFmpeg用来解码音频和频谱

OpenCV用来对频谱图像优化

在这些功能中,频谱是比较难实现的,我的方案是选通过FFmpeg获取音频采样率,再分析绘制成QImage图像,再用OpenCV优化。

下图是绘制的原图:

图像经过高斯模糊后的效果,发现边缘变黑了.不美观,关键在下一步!

经过本人对PS的了解,用了一个巧妙的方法:反相,黑边缘变成白的,好看多了!和酷狗也差不了多少了!

反相的代码如下(QT):

invert(Mat& mat)
{
    int alphaWidth=mat.cols/10;//计算淡入淡出的宽度,图像的1/10.
    int w= mat.rows;
    int h= mat.cols;
    for (int i = 0; i < w; ++i) {
            for (int j = 0; j < h; ++j) {
                Vec4b& rgba = mat.at<Vec4b>(i, j);
                if(rgba[3]>0)
                {
                    //下面是对RGB进行反相,255-rgb值的绝对值
                    rgba[0]=qAbs(255-rgba[0]);//r
                    rgba[1]=qAbs(255-rgba[1]);//g
                    rgba[2]=qAbs(255-rgba[2]);//b
                    //下面是图像左边淡入处理rgba[3]为图像的Alph值,即透明度。
                    if(j<alphaWidth)
                    {
                         rgba[3]=rgba[3]*((double)j/(double)alphaWidth);
                    }
                    //下面是图像右边淡出处理
                    else if(j>h-alphaWidth)
                    {
                         rgba[3]=rgba[3]*((double)(h-j)/(double)alphaWidth);
                    }
                }
            }
    }
}

主程序的一些代码:

 Mat src_img = QImageToMat(m_img);//QImage转Mat
 Mat des_img;
 GaussianBlur(src_img,des_img,Size(0,0),4);//调用OpenCV的高峰期模糊函数
 des_qimg=MatToQImage(invert(des_img));//反相后转为QImage格式
 update();//更新背景频谱

下面是播放器的一些图片:

软件效果观看视频:https://www.bilibili.com/video/av62887688/

由于程序有一些功能还在完善中,不久后将公布相关教程和源码!大家期待,也可一起探讨研究!

猜你喜欢

转载自blog.csdn.net/keepmoving0407/article/details/98939666