QT开发技术 【opencv图片裁剪,平均哈希相似度判断,以及获取游戏窗口图片】

一、图片裁剪

cpp 复制代码
int CJSAutoWidget::GetHouseNo(cv::Mat matMap)
{
    cv::imwrite(m_strPath + "/Data/map.png", matMap);
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 6; ++j)
        {
            // 计算当前子区域的矩形
            cv::Rect roi(j * 20, i * 17, 20, 17);

            // 提取子区域
            cv::Mat smallImage = matMap(roi);

            //double dDiffValue = GetDiffAvgHash(m_matBossImg, smallImage);

            // 小于20则认为相同
            cv::imwrite(m_strPath + "/Data/role_" + std::to_string(i * 6 + j + 1) + ".png", smallImage);
            std::cout  << " " << i * 6 + j + 1 << std::endl;
            if (IsRed(smallImage))
            {
                std::cout << "红色房间" << std::endl;
            }
            else
            {
                std::cout << "不是红色房间" << std::endl;
            }
        }
    }
    return 0;
}

二、平均哈希相似度判断

cpp 复制代码
int CJSAutoWidget::GetDiffAvgHash(cv::Mat matSrc1, cv::Mat matSrc2)
{
    cv::Mat matDst1, matDst2;
    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);

    cv::cvtColor(matDst1, matDst1, cv::COLOR_BGR2GRAY);
    cv::cvtColor(matDst2, matDst2, cv::COLOR_BGR2GRAY);

    int nAvg1 = 0, nAvg2 = 0;
    int nArr1[64], nArr2[64];

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

        int nTmp = i * 8;

        for (int j = 0; j < 8; j++)
        {
            int nTmp1 = nTmp + j;

            nArr1[nTmp1] = data1[j] / 4 * 4;
            nArr2[nTmp1] = data2[j] / 4 * 4;

            nAvg1 += nArr1[nTmp1];
            nAvg2 += nArr2[nTmp1];
        }
    }

    nAvg1 /= 64;
    nAvg2 /= 64;

    for (int i = 0; i < 64; i++)
    {
        nArr1[i] = (nArr1[i] >= nAvg1) ? 1 : 0;
        nArr2[i] = (nArr2[i] >= nAvg2) ? 1 : 0;
    }

    int nDiffNum = 0;

    for (int i = 0; i < 64; i++)
    {
        if (nArr1[i] != nArr2[i])
        {
            ++nDiffNum;
        }
    }

    return nDiffNum;
}

三、获取游戏窗口图片

cpp 复制代码
QImage CJSAutoWidget::GetDNFImage()
{
    HWND hwnd = FindWindowA(NULL, m_strGameName.c_str());
    if (hwnd == NULL) 
    {
        std::cout << "无法找到游戏窗口" << std::endl;
        return QImage();
    }

    // 获取窗口的位置和大小
    RECT rect;
    ::GetWindowRect(hwnd, &rect);

    // 使用Qt截图窗口
    QImage screenImage = QGuiApplication::primaryScreen()->grabWindow((WId)hwnd).toImage();

    return screenImage;
}

void CJSAutoWidget::SlotCaptureImage()
{
   m_pTimer->stop();
   QImage image = GetDNFImage();
   if (image.isNull()) 
   {
       return;
   }
   
   QImage qImageMain = image.scaled(ui->label_Map->size(), Qt::KeepAspectRatio);
   ui->label_Main->setPixmap(QPixmap::fromImage(qImageMain));
   //裁剪地图
   int x = image.width() - 125;
   int y = 40;
   int width = 120;
   int height = 70; 
   QImage imageMap = image.copy(x, y, width, height);
   ui->label_Map->setPixmap(QPixmap::fromImage(imageMap.scaled(ui->label_Map->size(), Qt::KeepAspectRatio)));
   cv::Mat matMap = QImageToMat(imageMap);
   GetHouseNo(matMap);
}
相关推荐
华溢澄3 小时前
macOS下基于Qt/C++的OpenGL开发环境的搭建
c++·qt·macos·opengl
刃神太酷啦3 小时前
C++ 异常处理机制:从基础到实践的全面解析----《Hello C++ Wrold!》(20)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
枫叶丹43 小时前
【Qt开发】显示类控件(一)-> QLabel
开发语言·qt
yBmZlQzJ4 小时前
PyQt5 修改标签字体和颜色的程序
开发语言·python·qt
滴滴滴嘟嘟嘟.4 小时前
Qt UDP通信学习
qt·学习·udp
努力的小帅4 小时前
C++_哈希
开发语言·c++·学习·算法·哈希算法·散列表
橘颂TA6 小时前
【Qt】项目的创建 and 各个控件的使用
开发语言·qt
叙白冲冲16 小时前
哈希算法以及面试答法
算法·面试·哈希算法
小王爱学人工智能17 小时前
OpenCV的阈值处理
人工智能·opencv·计算机视觉
edjxj17 小时前
Qt图片资源导入
开发语言·qt