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);
}
相关推荐
cpp_learners1 小时前
银河麒麟V10+飞腾FT-2000/4处理器+QT源码静态编译5.14.2指南
开发语言·qt
GIS阵地3 小时前
QgsProviderMetadata 详解(基于 QGIS 3.40.13 API)
数据库·qt·arcgis·oracle·gis·开源软件·qgis
格林威4 小时前
Baumer相机锂电池极片裁切毛刺检测:防止内部短路的 5 个核心方法,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·视觉检测
被AI抢饭碗的人6 小时前
QT:基础与信号槽
前端·qt
小温冲冲6 小时前
Qt WindowContainer 完整实战示例:QWidget 嵌入 QML
开发语言·数据库·qt
芦芭荞6 小时前
QT之TCP/IP通讯
开发语言·qt·tcp/ip
x_xbx8 小时前
LeetCode:217. 存在重复元素
数据结构·leetcode·哈希算法
冉佳驹8 小时前
Qt 开发【第三篇】——— 核心属性解析与应用实践
qt·geometry·qicon·enabled·windowopacity·qwidget核心属性·framegeometry
格林威9 小时前
Baumer相机铝型材表面划伤长度测量:实现损伤量化评估的 5 个关键技术,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·工业相机
格林威10 小时前
Baumer相机铝箔表面针孔检测:提升包装阻隔性的 7 个核心策略,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·工业相机