Windows:Qt使用Opencv库,实现照片/图片相似度比对

该文详细介绍了如何下载OpenCV库,通过CMake-Gui进行编译配置,设置环境变量,解决构建过程中的问题。接着在Qt工程中导入OpenCV,编辑pro文件添加头文件和库路径,并编写代码实现图像比较功能。

一、下载Opencv库、编译、配置环境变量

        1、1安装Qt过程不赘述。

                在Opencv官网,选择包下载,建议最新

                Releases - OpenCV

                

 

                下载CMake-Gui

                Download | CMake

                

 

        1、2 安装OpenCv以及Cmake-Gui(其实就是解压的过程)

                opencv安装完成目录                

         1、3配置环境变量以及cmake进行构建

                        1.3.1添加一次环境变量

                        path路径,新建 ,路径根据自己Qt目录调整

                        

                        1.3.2打开CMake-Gui.exe,桌面快捷或C:\Program Files\CMake\bin

                                选择两个路径,根据OPenCv安装路径调整,build为自己新建的路径

                        

                         继续如下选择

                        

                        Compilers:

                                C D:/Qt/Qt5.12.9/Tools/mingw730_64/bin/gcc.exe C++                                     D:/Qt/Qt5.12.9/Tools/mingw730_64/bin/g++.exe 

                        点击Finish。

                        

                        选中Advance,点击configure。

                         

                  Configuring done一次之后,会有红色报错,再选中WITH_OPENGL和WITH_QT,在进行一次Configure。

                        

                再次configure done之后,再检查几个条框的Value按照如下进行更改,重新configure。

                        

                又一次done之后,还有报错,此处文件不一定相同,查询下具体错误与解决方案,调整选中项之后,重新configure,之后generate,构建完成。

                1.3.3打开build完成之后的目录,D:\Programs\Opencv\opencv-build,根据自己目录调整。

                在此按住shift键,同时点击鼠标右键,点击在此处打开Powershell窗口(s),进入Windows Powershell,输入

                mingw32-make -j 8

                

                make完成之后,输入

                mingw32-make install

                 

                 最后将D:\Programs\Opencv\opencv-build\install\x64\mingw\bin,加入环境变量,前面三个是开始添加,最后一条此处添加。

                

 

二、Qt工程导入与测试实现

        2、1创建一个QWidget应用

                

        2、2编辑pro,添加加载头文件与动态库目录,

                INCLUDEPATH += D:\Programs\Opencv\opencv-build\install\include

                LIBS += D:\Programs\Opencv\opencv-build\lib\libopencv_*.a

                

                在MainWindow.h,导入头文件

                #include <QMainWindow>
                #include <opencv2/core/core.hpp>
                #include <opencv2/highgui/highgui.hpp>
                #include <opencv2/imgproc/imgproc.hpp>
                using namespace cv;

                 

                 添加比对函数                

void MainWindow::comparison(Mat &matSrca,Mat& matSrcb)
{
    cv::Mat matSrc1,matSrc2;
    CV_Assert(matSrca.channels() == 3);
        CV_Assert(matSrcb.channels() == 3);
        cv::resize(matSrca, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);
        //cv::flip(matSrc1, matSrc1, 1);
        cv::resize(matSrcb, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);

        cv::Mat matDst1, matDst2;
        //调整jpg图片大小
        cv::resize(matSrc1, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);
        cv::resize(matSrc2, matDst2, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);

        //update 20181206 for the bug cvtColor
        cv::Mat temp1 = matDst1;
        cv::Mat temp2 = matDst2;
        cv::cvtColor(temp1 , matDst1, COLOR_BGR2GRAY);
        cv::cvtColor(temp2 , matDst2, COLOR_BGR2GRAY);

        int iAvg1 = 0, iAvg2 = 0;
        int arr1[64], arr2[64];

        for (int i = 0; i < 8; i++)
        {
            uchar* data1 = matDst1.ptr<uchar>(i);
            uchar* data2 = matDst2.ptr<uchar>(i);

            int tmp = i * 8;

            for (int j = 0; j < 8; j++)
            {
                int tmp1 = tmp + j;

                arr1[tmp1] = data1[j] / 4 * 4;
                arr2[tmp1] = data2[j] / 4 * 4;

                iAvg1 += arr1[tmp1];
                iAvg2 += arr2[tmp1];
            }
        }

        iAvg1 /= 64;
        iAvg2 /= 64;

        for (int i = 0; i < 64; i++)
        {
            arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;
            arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;
        }

        int iDiffNum = 0;
        //等同于计算明汉距离
        for (int i = 0; i < 64; i++)
            if (arr1[i] != arr2[i])
                ++iDiffNum;

        qDebug()<<"相似度 = "<<100-iDiffNum<<endl;
}

        2、3准备两张相同或存在差异的图片,按照路径添加调用

    //照片相似度
    Mat image=imread("C:\\Users\\Lenovo\\Desktop\\Download\\11111.jpg",IMREAD_COLOR);
    Mat image2=imread("C:\\Users\\Lenovo\\Desktop\\Download\\22222.jpg",IMREAD_COLOR);

    comparison(image,image2);

        ok,此时完成OPenCv的库编译与Qt调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值