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