QT+opencv实现找不同

简介: 小伙伴们大家好,今天给大家分享一个使用QT和opencv实现的一个找不同的小demo,此demo可以用于大家来找茬小游戏,提高你查询图片不同的速度

QT+opencv实现找不同

小伙伴们大家好,今天给大家分享一个使用QT和opencv实现的一个找不同的小demo,此demo可以用于大家来找茬小游戏,提高你查询图片不同的速度


实现思路:

使用QT和opencv

第一步:绘制两个透明视窗,用于采集视窗内的图片,视口大小可以修改,位置可以调整

第二部:采集视窗内的图像,并且使用opencv比较对应的图像不同之处

第三步:在视口绘制出对应的不同位置


主要代码:

绘制透明区域:

void DifferentWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this );
    p.setCompositionMode( QPainter::CompositionMode_Clear );
    p.fillRect( rect1_, Qt::SolidPattern );
    p.fillRect( rect2_, Qt::SolidPattern );
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    QPen pen;
    pen.setWidth(1);
    pen.setColor(Qt::red);
    painter.setPen(pen);
    // 绘制比较之后的框
    for(const auto &rect : rects_)
    {
        QRect rect1;
        rect1.setX(rect.x+rect1_.x());
        rect1.setY(rect.y+rect1_.y());
        rect1.setHeight(rect.height);
        rect1.setWidth(rect.width);
        painter.drawRect(rect1);
        rect1.setX(rect.x+rect2_.x());
        rect1.setY(rect.y+rect2_.y());
        rect1.setHeight(rect.height);
        rect1.setWidth(rect.width);
        painter.drawRect(rect1);
    }
}

比较图片不同之处:

std::vector<cv::Rect> DifferentWidget::imageSubtract(const cv::Mat& image1, const cv::Mat& image2)
{
    if (image1.empty() || image2.empty())
    {
        return {};
    }
    cv::Mat cv_src1 = image1.clone();
    cv::Mat cv_src2 = image2.clone();
    if ((image1.rows != image2.rows) || (image1.cols != image2.cols))
    {
        int rows = (image1.rows + image2.rows) / 2;
        int cols = (image1.cols + image2.cols) / 2;
        cv::resize(image1, cv_src1, cv::Size(cols, rows));
        cv::resize(image2, cv_src2, cv::Size(cols, rows));
    }
    cv::Mat image1_gary, image2_gary;
    if (cv_src1.channels() != 1)
    {
        cvtColor(cv_src1, image1_gary, cv::COLOR_BGR2GRAY);
    }
    if (cv_src2.channels() != 1)
    {
        cvtColor(cv_src2, image2_gary, cv::COLOR_BGR2GRAY);
    }
    cv::Mat frameDifference, absFrameDifferece;
    cv::Mat previousGrayFrame = image2_gary.clone();
    //图1减图2
    subtract(image1_gary, image2_gary, frameDifference, cv::Mat(), CV_16SC1);
    //取绝对值
    absFrameDifferece = abs(frameDifference);
    //位深的改变
    absFrameDifferece.convertTo(absFrameDifferece, CV_8UC1, 1, 0);
    cv::Mat segmentation;
    //阈值处理(这一步很关键,要调好二值化的值)
    threshold(absFrameDifferece, segmentation, 10, 255, cv::THRESH_BINARY);
    //threshold(absFrameDifferece, segmentation, 0, 255, cv::THRESH_OTSU);
    //形态学处理(开闭运算)
    //形态学处理用到的算子
    cv::Mat morphologyKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5), cv::Point(-1, -1));
    morphologyEx(segmentation, segmentation, cv::MORPH_CLOSE, morphologyKernel, cv::Point(-1, -1), 2, cv::BORDER_REPLICATE);
    //找边界
    std::vector< std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    findContours(segmentation, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE, cv::Point(0, 0));//CV_RETR_TREE
    std::vector< std::vector<cv::Point> > contours_poly(contours.size());
    std::vector<cv::Rect> boundRect;
    for (int index = 0; index < contours.size(); index++)
    {
        approxPolyDP(cv::Mat(contours[index]), contours_poly[index], 3, true);
        cv::Rect rect = cv::boundingRect(cv::Mat(contours_poly[index]));
        boundRect.push_back(rect);
    }
    return boundRect;
}

效果展示:

48dcb53041d843d3a298f36c270fd014.png

遇到的问题:

透明窗口和转换的问题


项目开源地址:https://gitee.com/turbolove/find-difference.git

目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
106 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
2月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
133 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
2月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
45 10
|
2月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
3月前
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
74 1
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
172 1
|
5月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
81 1
|
5月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
91 0
|
4月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
|
5月前
|
计算机视觉
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
82 0
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
下一篇
无影云桌面