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);
}
相关推荐
机器视觉知识推荐、就业指导11 小时前
Qt 和 C++,是不是应该叫 Q++ 了?
开发语言·c++·qt
liu****11 小时前
三.Qt图形界面开发完全指南:从入门到掌握常用控件
开发语言·c++·qt
Dreaming_of_you15 小时前
pytorch/cv2/pil/torchvision处理图像缩小的最佳方案
人工智能·pytorch·python·opencv
离离茶15 小时前
【笔记1-11】Qt 关闭QToolbar的拓展菜单
开发语言·笔记·qt
一只小bit17 小时前
Qt 绘图核心教程:从基础绘制到图像操作全解析
前端·c++·qt·gui
棒棒的皮皮18 小时前
【OpenCV】Python图像处理矩特征之矩的计算/计算轮廓的面积
图像处理·python·opencv·计算机视觉
四维碎片18 小时前
【Qt】代理(Delegate)的使用
开发语言·qt
从此不归路19 小时前
Qt5 进阶【9】模型-视图框架实战:从 TableView 到自定义模型的一整套落地方案
开发语言·c++·qt
wjhx19 小时前
在Qt Design Studio中进行页面切换
前端·javascript·qt
qwy71522925816320 小时前
7-获取局部图像
人工智能·opencv·计算机视觉