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);
}
相关推荐
我真的不会C1 小时前
QT中的事件及其属性
开发语言·qt
Ethon_王1 小时前
走进Qt--工程文件解析与构建系统
c++·qt
mit6.8241 小时前
[Lc_week] 447 | 155 | Q1 | hash | pair {}调用
算法·leetcode·哈希算法·散列表
大霸王龙2 小时前
Python对比两张CAD图并标记差异的解决方案
python·opencv·计算机视觉
新知图书5 小时前
OpenCV彩色图像分割
人工智能·opencv·计算机视觉
多巴胺与内啡肽.5 小时前
OpenCV进阶操作:图像金字塔
人工智能·opencv·计算机视觉
闲人编程6 小时前
OpenCV图像矩与形状匹配完全指南
python·opencv·图像识别
zhangzhangkeji8 小时前
QT6 源(45):分隔条 QSplitter 允许程序的用户修改布局,程序员使用 IDE时,就是分隔条的用户,以及其 QSplitter 源代码
qt
闲人编程9 小时前
OpenCV图像轮廓分析完全指南
python·opencv·图像识别
Ethon_王10 小时前
Qt 入门&安装
qt