目录
1.功能概述
对视频进行去水印的程序需要使用计算机视觉技术,需要结合图像处理和视频处理两个方面进行实现。
以下是简单的步骤:
-
读入视频文件并分离出每一帧图像。
-
对每一帧图像进行水印检测,找出水印所在的区域。
-
针对水印的特定位置,使用图像处理方法进行覆盖或删除。
-
对处理后的每一帧图像进行合并,重新生成视频文件。
2.实现步骤
这里提供一种简单的方法用于去除视频中的水印:
2.1.导入OpenCV库
2.2.读入视频文件并初始化视频码流
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char* argv[]) {
VideoCapture cap(argv[1]); // 读入视频文件
if(!cap.isOpened()){
std::cout << "Cannot open the video file" << std::endl;
return -1;
}
double fps = cap.get(CV_CAP_PROP_FPS); // 获取视频的帧率
int width = cap.get(CV_CAP_PROP_FRAME_WIDTH); // 获取视频的宽度
int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); // 获取视频的高度
int num_frames = cap.get(CV_CAP_PROP_FRAME_COUNT); // 获取视频的总帧数
// 初始化视频编码器
VideoWriter writer("output.avi", CV_FOURCC('M','J','P','G'), fps,
Size(width, height), true);
if (!writer.isOpened()){
std::cout << "Could not open output video file" << std::endl;
return -1;
}
}
这里可以使用不同的算法进行水印检测,例如基于颜色、形状和大小等特征的检测方法。然后,确定水印的位置和大小。
2.3.对每一帧图像进行水印检测
Mat frame, gray, thresh;
while(cap.read(frame)){
// 将原始图像转化为灰度图像
cvtColor(frame, gray, CV_BGR2GRAY);
// 对灰度图像进行阈值处理
threshold(gray, thresh, 150, 255, THRESH_BINARY);
// 对二值化图像进行形态学操作,如腐蚀、膨胀等
// ...
// 通过算法找到水印的位置和大小
// ...
// 在水印位置放置一个遮挡层,用于遮盖水印
rectangle(frame, watermark_roi, Scalar(0, 0, 0), -1);
}
2.4.对处理后的每一帧图像进行合并,重新生成视频文件
writer.write(frame); // 将修改后的帧写回视频文件
3.完整代码如下
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char* argv[]) {
VideoCapture cap(argv[1]); // 读入视频文件
if(!cap.isOpened()){
std::cout << "Cannot open the video file" << std::endl;
return -1;
}
double fps = cap.get(CV_CAP_PROP_FPS); // 获取视频的帧率
int width = cap.get(CV_CAP_PROP_FRAME_WIDTH); // 获取视频的宽度
int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); // 获取视频的高度
int num_frames = cap.get(CV_CAP_PROP_FRAME_COUNT); // 获取视频的总帧数
// 初始化视频编码器
VideoWriter writer("output.avi", CV_FOURCC('M','J','P','G'), fps,
Size(width, height), true);
if (!writer.isOpened()){
std::cout << "Could not open output video file" << std::endl;
return -1;
}
Mat frame, gray, thresh;
while(cap.read(frame)){
/**此处是逐帧处理,对每一帧进行去水印处理,参考本专栏第一课:使用C++实现图片去水印**/
//转换为灰度图像
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
//二值化处理
Mat binary;
threshold(gray, binary, 50, 255, THRESH_BINARY);
//形态学操作,提取水印区域
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(binary, binary, MORPH_CLOSE, kernel);
//显示水印区域
//imshow("水印区域", binary);
//waitKey(0);
//创建空白图像
Mat result = Mat::zeros(image.size(), image.type());
//利用原始图像和水印区域进行重构
for (int i = 0; i < image.rows; i++) {
for (int j = 0; j < image.cols; j++) {
if (binary.at<uchar>(i, j) == 0) {
result.at<Vec3b>(i, j) = image.at<Vec3b>(i, j);
}
}
}
//显示去除水印后的图像
//imshow("去除水印后的图像", result);
//waitKey(0);
/*****************************************************************************/
writer.write(result); // 将修改后的帧写回视频文件
}
cap.release();
writer.release();
return 0;
}
需要注意的是,这种简单的方法只适用于水印比较固定的场景。对于水印位置和大小变化较大的情况,需要使用更复杂的算法进行检测和处理。
4.参考
第一课:使用C++实现图片去水印_smartvxworks的博客-CSDN博客
5.实现效果
待更新。。。
6.去除水印的几种软件
如今,短视频的制作和分享已经成为一种日常的活动,许多短视频制作者和分享者都希望他们的视频能够被正确的认可。然而,有时候,短视频的创作者会在视频中添加一些水印图标,以此来确保短视频的版权保护。这种水印图标可能会影响视频的质量,并降低观看者的观赏体验。因此,去除短视频中的水印是很有必要的。
那么现在有什么比较好用的去除视频水印的方法呢?如今随着软件技术的不断发展,去除视频水印现在也不是很难的问题了,现在有很多去除视频水印的方法,这里我们就来说一说常见的比较好用的三种去除视频水印的方法。
6.1.用在线去除视频水印的方法去除水印
详细操作步骤:
第一步:首先我们需要把视频的链接复制下来,如果我们是要去除某音或者某手的短视频水印,我们就可以在视频播放页面点击分享按钮,就可以把视频的链接复制下来了。
第二步:复制视频的链接后,我们要想有效地抹去视频中的水印,自然就需要一款高效的去水印工具。这些工具以一键方式去除视频水印,因此选择一款稳定可靠、操作简便的视频去水印工具显得尤为重要,只有这样,才能确保去水印后的视频质量。
第三步:找到你想要用来去除视频水印的工具后,访问它的去水印功能页面,将视频链接粘贴至该页面,然后按下去除水印的按钮。等待几秒钟后,视频的水印就成功的去除掉了。如果视频较短,只需几秒钟就可以完成去水印操作,若视频时长较长,就需要等待更长的时间。最后,点击保存视频,即可将去水印后的视频保存至个人相册中。
6.2.用AE专业剪辑工具来去除视频水印
详细操作步骤:
第一步,打开AE,然后将需要处理的视频文件拖放到工程区中,然后将其添加到时间轴中。
第二步,点击AE界面上的“合成”菜单,找到“调整”选项,点击后会出现一个调整面板,在此面板中可以看到水印图像。
第三步,在此面板中,可以找到“模糊”选项,点击此选项,就可以给水印图像添加模糊效果,从而达到去除水印的效果。
第四步,调整模糊效果的程度,以达到最佳的去除水印效果。
第五步,点击合成菜单中的“输出”选项,设置输出的文件格式、路径等,然后点击“渲染”按钮,即可完成去除视频水印的操作。
6.3.用美图秀秀p图工具来去除视频水印
详细操作步骤:
第一步:首先,打开美图秀秀,点击“文件”,在弹出的菜单中点击“打开”,然后选择要去除水印的视频文件。接着,点击工具栏上的“去除水印”图标,美图秀秀会自动识别视频中的水印,并去除视频中的水印。等待一段时间之后,视频中的水印就会被清除。
第二步:点击工具栏上的“保存”图标,美图秀秀会有提示框要求用户输入新的文件名,输入文件名后,点击“确定”,就可以保存去除水印后的视频文件了。