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);
}
相关推荐
old_power2 小时前
Linux(Ubuntu24.04)源码编译安装OpenCV4.6.0
linux·opencv
萧鼎4 小时前
利用 OpenCV 进行棋盘检测与透视变换
人工智能·opencv·计算机视觉
进击ing小白4 小时前
QSplashScreen --软件启动前的交互
qt
终极定律9 小时前
qt:输入控件操作
开发语言·qt
FL162386312910 小时前
[C++]使用纯opencv部署yolov12目标检测onnx模型
c++·opencv·yolo
紫雾凌寒11 小时前
计算机视觉基础|从 OpenCV 到频域分析
深度学习·opencv·计算机视觉·傅里叶变换·频域分析
小屁孩大帅-杨一凡11 小时前
如何实现使用DeepSeek的CV模型对管道内模糊、低光照或水渍干扰的图像进行去噪、超分辨率重建。...
图像处理·人工智能·opencv·计算机视觉·超分辨率重建
高力士等十万人13 小时前
OpenCV形态学操作
人工智能·python·opencv·计算机视觉
埃菲尔铁塔_CV算法13 小时前
基于 C++ OpenCV 图像灰度化 DLL 在 C# WPF 中的拓展应用
c++·图像处理·人工智能·opencv·机器学习·计算机视觉·c#