qt_Opencv (学习笔记) - 隐身术

本文介绍了如何利用OpenCV库在C++中实现隐身术效果,通过读取摄像头帧、保存背景图片、图像处理(转HSV、二值化、图像抠图)实现人物与背景分离,完成隐身效果的实时显示。
摘要由CSDN通过智能技术生成

我们前面一起学习了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;
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值