#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//打开视频
VideoCapture cap("video/detect.mp4");
// 检查视频是否打开
if (!cap.isOpened())
{
cout << "Error opening video stream or file" << endl;
return -1;
}
Mat background;
//跳过前30帧
for (int i = 0; i < 30; i++)
{
cap >> background;
}
//红布第251帧才出现,跳过前250帧
for (int i = 0; i < 220; i++)
{
Mat frame_slip;
cap >> frame_slip;
continue;
}
//沿Y轴翻转图像
flip(background, background, 1);
//图像读取
while (1)
{
//检测帧
Mat frame;
// Capture frame-by-frame
cap >> frame;
// If the frame is empty, break immediately
if (frame.empty())
{
break;
}
//hsv图像
Mat hsv;
flip(frame, frame, 1);
cvtColor(frame, hsv, COLOR_BGR2HSV);
//红色区域1,红色区域2
Mat mask1, mask2;
//红色区域
Mat mask_red;
//背景区域
Mat mask_background;
//过滤颜色
//二值图,其中黑色0表示无红色,白色1表示红色区域。
inRange(hsv, Scalar(0, 120, 70), Scalar(10, 255, 255), mask1);
inRange(hsv, Scalar(170, 120, 70), Scalar(180, 255, 255), mask2);
mask_red = mask1 + mask2;
//去除噪声
Mat kernel = Mat::ones(3, 3, CV_32F);
morphologyEx(mask_red, mask_red, cv::MORPH_OPEN, kernel);
morphologyEx(mask_red, mask_red, cv::MORPH_DILATE, kernel);
//将mask_red中0,1互换,得到背景区域范围。
bitwise_not(mask_red, mask_background);
Mat res1, res2, final_output;
//从当前帧抠出背景区域res1,红布区域被涂成黑色。
bitwise_and(frame, frame, res1, mask_background);
//从背景帧提取红布区域覆盖的背景res2
bitwise_and(background, background, res2, mask_red);
addWeighted(res1, 1, res2, 1, 0, final_output);
//展示图像
imshow("Magic !!!", final_output);
// Press ESC on keyboard to exit
char c = (char)waitKey(1);
if (c == 27)
{
break;
}
}
return 0;
}
基于opencv实现透明斗篷
需积分: 0 136 浏览量
更新于2019-03-06
2
收藏 58.86MB 7Z 举报
"基于OpenCV实现透明斗篷"的实践是一种图像处理技术,它涉及到计算机视觉领域中的关键概念,如图像合成、颜色空间转换和掩模操作。OpenCV(开源计算机视觉库)是一个强大的工具,提供了丰富的函数和算法,用于处理和分析图像。
中的“透明斗篷”效果实际上是指在视频或图像中实现对象的透明化,让其仿佛穿上了一件看不见的斗篷。这种效果在电影特效、游戏开发以及科学研究中都有广泛应用。通过Python或C++编程语言,我们可以利用OpenCV库来实现这一功能。
理解基本的图像处理原理是必要的。图像通常以像素矩阵的形式存在,每个像素代表图像的一个颜色值。透明度(或称为alpha通道)是决定像素混合程度的关键因素,它可以控制图像的可见度。
在OpenCV中,实现透明斗篷的核心步骤包括:
1. **读取图像或视频**:使用`cv2.imread()`函数读取图像,`cv2.VideoCapture()`读取视频帧。
2. **颜色空间转换**:根据需要,可能需要将图像从BGR颜色空间转换到其他颜色空间,如HSV,以便于进行颜色选择和处理。使用`cv2.cvtColor()`进行转换。
3. **创建掩模**:根据目标物体的颜色或特征,创建一个二值掩模,用以标记需要透明化的区域。这通常涉及阈值操作,例如`cv2.threshold()`函数。
4. **分离背景和前景**:通过掩模将目标物体与背景分离。可以使用`cv2.bitwise_and()`操作,将掩模与原始图像相结合,得到目标物体的独立部分。
5. **透明度处理**:调整透明度,这涉及到修改像素的alpha通道。在OpenCV中,没有直接修改alpha通道的函数,但可以通过创建一个新的四通道图像(RGBA),并在适当位置插入透明度值。
6. **合成图像**:将透明处理后的前景与原始背景合成,形成最终的透明效果。这可以通过 alpha 融合算法实现,如使用`cv2.addWeighted()`函数。
在提供的代码文件`invisibility_cloak.cpp`和`Invisibility_cloak.py`中,可以看到这些步骤的具体实现。`video`文件可能是用于测试透明斗篷效果的输入视频。通过阅读和理解代码,可以深入学习如何运用OpenCV实现这一效果,并对其进行自定义和扩展,以适应不同的应用场景。
总结来说,实现"基于OpenCV的透明斗篷"是一项结合了图像处理理论和技术实践的任务,它需要理解颜色空间、掩模操作、透明度调整以及图像合成等概念。通过这个项目,不仅可以掌握OpenCV的基本用法,还可以提升对计算机视觉领域的深入理解。
落痕的寒假
- 粉丝: 2097
- 资源: 24
最新资源
- 老男孩python-19-python员工信息表案例01.mp4
- 老男孩python-21-python员工信息表案例03.mp4
- 老男孩python-22-第二关python作业01.mp4
- 机械设计顶管机的总体方案与顶推装置sw14全套技术资料100%好用.zip
- 老男孩python-23-第二关python作业02.mp4
- 老男孩python-24-第三关课前思想.mp4
- 老男孩python-27-python迭代器和生成器.mp4
- 老男孩python-26-python集合 Map Zip.mp4
- 老男孩python-25-第三关学生作业展示.mp4
- 老男孩python-28-python lamda函数.mp4
- 老男孩python-29-python Pickle JSON序列化.mp4
- 老男孩python-30-python正则表达式.mp4
- 机械设计动态称重秤x_t全套技术资料100%好用.zip
- 老男孩python-32-第三关关底python信用卡项目作业.mp4
- 老男孩python-33-python第三关ATM作业展示.mp4
- 机械设计端盖上料涂油一体机step全套技术资料100%好用.zip