首页 > 其他分享 >qt_Opencv (学习笔记) - 隐身术

qt_Opencv (学习笔记) - 隐身术

时间:2024-03-26 13:58:22浏览次数:33  
标签:Mat img backimg frame imshow Opencv 隐身术 qt

我们前面一起学习了Opencv库中的一些函数并且做了一个小练习,想必大家对Opencv库有了一定的了解。接下来让我来带着大家来完成今天的小项目吧!
有了前面几个文章的基础,我们接下来来实现“隐身术”就比较简单了。
先让我来展示一下隐身术的效果吧!
请添加图片描述
我们想要实习隐身术,首先我们要学会怎么去调动我们电脑的摄像头。Opencv给我们提供了VideoCapture这个类型用于定义变量供我们去调动摄像头。

    //定义Videocapture类型的变量,参数为0表示打开默认0摄像头
    VideoCapture capture(0);

接着我们先要了解一下视频播放的原理,我们的视频是由一帧帧的图片连续播放而成的,所以一段视频就是由许多照片所构成。我们需要定义一个图片类型的变量去存储每一帧的图片再用imshow这个函数去显示出来,我们就可以得到一段视频。

	 Mat frame;//存储每一帧图像
	 capture.read(frame);
	 imshow("frame", frame);

知道了视频形成的原理,想必大家对今天的这个小项目有了些许眉目了吧!
没错实现隐身术的本质就是对每一帧的图像进行处理得到我们隐身的效果再用imshow去显现出来。
请大家仔细回想一下网上别人展示的隐身术都是人物先不出现只露背景,然后人物再出现拿着带有颜色的布实现隐身。这就是隐身术的第一步,去保存摄像头的第一帧图像作为背景图片用于后续的处理。

	Mat back;//保存第一帧图像将图像转换为相应的格式便于保存到文件中供backimg使用
	for(int i = 0; i < 5; i++)
	{
	    capture.read(frame);
	    back = frame;
	    imwrite("D:\\picture\\backimg.png", back);
	}

我们先定义一个变量back去存储摄像头前五帧的图片作为背景图片,然后将图片存入文件中,方便后续使用。
然后我们再定义一个变量去读取刚刚存储的背景图片便于后续的图像处理。

	Mat backimg;//存储背景图片
    backimg = imread("D:\\picture\\backimg.png");
    imshow("backimg", backimg);

接下来我们定义一个变量去存储摄像头后续所有帧的图片。

	Mat img
    img = frame;

后面的操作我们就比较熟悉了!我们先将img该图片转变为hsv的格式,再进行二值化处理,最后提取出隐身布的部分最后从背景图中扣除该部分的掩膜图像粘贴到img图片上,再用imshow去展示图片,这样我们的隐身术就完成啦!
后面部分的操作我在这里就不在演示了,新来的童鞋可以康康我的上一篇文章一键换照片底色那里有详细的讲解。
最后将源码附上供大家参考:

    //定义Videocapture类型的变量,参数为0表示打开默认0摄像头
    VideoCapture capture(0);
    Mat frame;//存储每一帧图像
    Mat backimg;//存储背景图片
    Mat back;//保存第一帧图像将图像转换为相应的格式便于保存到文件中供backimg使用

    for(int i = 0; i < 5; i++)
    {
        capture.read(frame);
        back = frame;
        imwrite("D:\\picture\\backimg.png", back);
    }

    backimg = imread("D:\\picture\\backimg.png");
    imshow("backimg", backimg);

    while(1)
    {
        capture.read(frame);
        //存储人物+背景的图片
        Mat img;
        img = frame;
        //imwrite("D:\\picture\\renwu.png", backimg);

        //将人物+背景的图片转化为hsv格式
        Mat hsvimg;
        cvtColor(img, hsvimg, COLOR_BGR2HSV);
        //imshow("hsv", hsvimg);

        //将人物+背景的hsv格式图片进行二值化处理,提取关键的元素
        //Mat mask1;
        //Mat mask2;
        Mat thimg;
        //inRange(hsvimg, Scalar(0, 140, 140), Scalar(10, 255, 255), mask1);
        //inRange(hsvimg, Scalar(156, 140, 140), Scalar(180, 255, 255), mask2);
        inRange(hsvimg, Scalar(100, 43, 46), Scalar(124, 255, 255), thimg);
        //thimg = mask1 + mask2;
        imshow("thimg", thimg);

        //将背景图上对应位置的图片抠出来放在人物图片上实现隐身的效果
        //bitwise_and(backimg, backimg, img, thimg);
        backimg.copyTo(img, thimg);
        imshow("img", img);

        if(waitKey(30) == 27)
        {
            break;
        }

    }

标签:Mat,img,backimg,frame,imshow,Opencv,隐身术,qt
From: https://blog.csdn.net/2303_76910571/article/details/137043098

相关文章

  • Qt QTcpSocket 对连接服务器中断的不同情况进行判定
    简述对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态。而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结。分为下面六种不同情况   客户端网线断开   客户端网络断开   客户端通过HTTP代理连接服务器,代理机器断开代......
  • 使用OpenCV实现以图搜图
    使用OpenCV实现以图搜图什么是以图搜图?感知哈希算法算法实现步骤效果源码什么是以图搜图?以图搜图,简单来说,就是通过搜索图像的文本或视觉特征,帮助用户找到与这张图片相似或相关的其他图形图像资料。感知哈希算法感知哈希算法(PerceptualHashingAlgorithm,简称PHA或P......
  • OpenCV模板匹配(匹配图片中对应元素)
    OpenCV模板匹配(匹配图片中对应元素)模板匹配方法单个元素进行匹配并绘制矩形框效果代码模板匹配方法模板是被查找目标的图像,查找模板在原始图像中的哪个位置的过程就叫模板匹配。OpenCV提供的matchTemplate()方法就是模板匹配方法,其语法如下:result=cv2.matchTemp......
  • Qt 检查int某一位数据是否为1
    1#include<QCoreApplication>2#include<QString>34intmain(intargc,char*argv[])5{6QCoreApplicationa(argc,argv);78intnumber=123;//例子中的整数910//将整数转换为16进制字符串11QStringhexString=QString::n......
  • 初学可视化PyQt5
    【初学可视化PyQt5系列】第1章PyQt5简介第2章PyQt5新增功能第3章Hellomyfourrotordrone第4章PyQt5主要类第5章PyQt5使用Qt设计器第6章PyQt5信号与插槽第7章PyQt5布局与管理第8章PyQt5基本小部件第9章PyQt5QDialog类第10章PyQt5QMessageBox......
  • 【QT+QGIS跨平台编译】之九十一:【QGIS_Python跨平台编译】—【qgis_python.h生成】
    文章目录一、qgis_python.h介绍二、信息分析三、qgis_python.h生成一、qgis_python.h介绍  qgis_python.h是QGIS(QuantumGIS)软件中的一个头文件,主要用于服务于QGIS_Python库的编译,包含导入、导出宏信息的定义。二、信息分析在qgis\src\python目录,CMakeLis......
  • QtableWidget 表头增加复选框简单实现方法
    1.最近再开发一个批量查询上传的小工具,要增加一个批量选择的复选框,全选或者全不选;QCheckBox*checkBox=newQCheckBox(ui.tableWidget);checkBox->resize(40,24);ui.tableWidget->setCellWidget(0,0,checkBox);checkBox->setStyleSheet("margi......
  • opencv 灰度变换(灰度化)
    加权平均值法:D=(R*30+G*59+B*11)/100,其中RGB分别是红,绿,蓝颜色通道的像素值。取最大值法:D=max(R,G,B)平均值法:D=(R+G+B)/3importcv2importnumpyasnpimage=cv2.imread("C:/Users/wangyiyuan/Desktop/20200201172603_hocyy.jpg")h=np.shape(image)[0]w=np.shape(image)......
  • TTN MQTT数据订阅与发布
    一、MQTT客户端设置mqtt客户端使用mqtt.fx,也可以使用其他的客户端。打开后的主页面如下:地址和端口配置mqtt.fx的具体操作可以参考MQTT.fx使用详解二、订阅、发布订阅发布topic的格式需要参照MQTTClients需要注意的是下发数据的格式是BASE64。可以使用在线工具......
  • 这可能是国内Qt/C++界最受欢迎开源项目之一/5.8Kstar/持续迭代更新
    一、前言本项目大概在2020年开始的,大概在2022年重写了一遍,主要是分门别类存放。本项目主要是QWidget编写的一些开源的demo,支持Qt4、Qt5、Qt6,支持任意系统,预计会有100多个,一直持续更新完善,代码简洁易懂注释详细,每个都是独立项目,非常适合初学者,代码随意传播使用。不仅有界面UI相关,......