• 第二课:使用C++实现视频去水印


    目录

    1.功能概述

    2.实现步骤

    2.1.导入OpenCV库

    2.2.读入视频文件并初始化视频码流

    2.3.对每一帧图像进行水印检测

    2.4.对处理后的每一帧图像进行合并,重新生成视频文件

    3.完整代码如下

    4.参考

    5.实现效果

    6.去除水印的几种软件

    6.1.用在线去除视频水印的方法去除水印

    6.2.用AE专业剪辑工具来去除视频水印

    6.3.用美图秀秀p图工具来去除视频水印


    1.功能概述

            对视频进行去水印的程序需要使用计算机视觉技术,需要结合图像处理和视频处理两个方面进行实现。

    以下是简单的步骤:

    1. 读入视频文件并分离出每一帧图像。

    2. 对每一帧图像进行水印检测,找出水印所在的区域。

    3. 针对水印的特定位置,使用图像处理方法进行覆盖或删除。

    4. 对处理后的每一帧图像进行合并,重新生成视频文件。

    2.实现步骤

            这里提供一种简单的方法用于去除视频中的水印:

    2.1.导入OpenCV库

    2.2.读入视频文件并初始化视频码流

    1. #include <opencv2/opencv.hpp>
    2. using namespace cv;
    3. int main(int argc, char* argv[]) {
    4. VideoCapture cap(argv[1]); // 读入视频文件
    5. if(!cap.isOpened()){
    6. std::cout << "Cannot open the video file" << std::endl;
    7. return -1;
    8. }
    9. double fps = cap.get(CV_CAP_PROP_FPS); // 获取视频的帧率
    10. int width = cap.get(CV_CAP_PROP_FRAME_WIDTH); // 获取视频的宽度
    11. int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); // 获取视频的高度
    12. int num_frames = cap.get(CV_CAP_PROP_FRAME_COUNT); // 获取视频的总帧数
    13. // 初始化视频编码器
    14. VideoWriter writer("output.avi", CV_FOURCC('M','J','P','G'), fps,
    15. Size(width, height), true);
    16. if (!writer.isOpened()){
    17. std::cout << "Could not open output video file" << std::endl;
    18. return -1;
    19. }
    20. }

            这里可以使用不同的算法进行水印检测,例如基于颜色、形状和大小等特征的检测方法。然后,确定水印的位置和大小。


    2.3.对每一帧图像进行水印检测

    1. Mat frame, gray, thresh;
    2. while(cap.read(frame)){
    3. // 将原始图像转化为灰度图像
    4. cvtColor(frame, gray, CV_BGR2GRAY);
    5. // 对灰度图像进行阈值处理
    6. threshold(gray, thresh, 150, 255, THRESH_BINARY);
    7. // 对二值化图像进行形态学操作,如腐蚀、膨胀等
    8. // ...
    9. // 通过算法找到水印的位置和大小
    10. // ...
    11. // 在水印位置放置一个遮挡层,用于遮盖水印
    12. rectangle(frame, watermark_roi, Scalar(0, 0, 0), -1);
    13. }

    2.4.对处理后的每一帧图像进行合并,重新生成视频文件

    writer.write(frame); // 将修改后的帧写回视频文件

    3.完整代码如下

    1. #include <iostream>
    2. #include <opencv2/opencv.hpp>
    3. using namespace cv;
    4. int main(int argc, char* argv[]) {
    5. VideoCapture cap(argv[1]); // 读入视频文件
    6. if(!cap.isOpened()){
    7. std::cout << "Cannot open the video file" << std::endl;
    8. return -1;
    9. }
    10. double fps = cap.get(CV_CAP_PROP_FPS); // 获取视频的帧率
    11. int width = cap.get(CV_CAP_PROP_FRAME_WIDTH); // 获取视频的宽度
    12. int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); // 获取视频的高度
    13. int num_frames = cap.get(CV_CAP_PROP_FRAME_COUNT); // 获取视频的总帧数
    14. // 初始化视频编码器
    15. VideoWriter writer("output.avi", CV_FOURCC('M','J','P','G'), fps,
    16. Size(width, height), true);
    17. if (!writer.isOpened()){
    18. std::cout << "Could not open output video file" << std::endl;
    19. return -1;
    20. }
    21. Mat frame, gray, thresh;
    22. while(cap.read(frame)){
    23. /**此处是逐帧处理,对每一帧进行去水印处理,参考本专栏第一课:使用C++实现图片去水印**/
    24.         //转换为灰度图像
    25.         Mat gray;
    26.         cvtColor(frame, gray, COLOR_BGR2GRAY);
    27.         //二值化处理
    28.         Mat binary;
    29.         threshold(gray, binary, 50, 255, THRESH_BINARY);
    30.         //形态学操作,提取水印区域
    31.         Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
    32.         morphologyEx(binary, binary, MORPH_CLOSE, kernel);
    33.         //显示水印区域
    34.         //imshow("水印区域", binary);
    35.         //waitKey(0);
    36.         //创建空白图像
    37.     Mat result = Mat::zeros(image.size(), image.type());
    38.     //利用原始图像和水印区域进行重构
    39.     for (int i = 0; i < image.rows; i++) {
    40.         for (int j = 0; j < image.cols; j++) {
    41.             if (binary.at<uchar>(i, j) == 0) {
    42.                 result.at<Vec3b>(i, j) = image.at<Vec3b>(i, j);
    43.             }
    44.         }
    45.     }
    46.     //显示去除水印后的图像
    47.     //imshow("去除水印后的图像", result);
    48.     //waitKey(0);
    49. /*****************************************************************************/
    50. writer.write(result); // 将修改后的帧写回视频文件
    51. }
    52. cap.release();
    53. writer.release();
    54. return 0;
    55. }

    需要注意的是,这种简单的方法只适用于水印比较固定的场景。对于水印位置和大小变化较大的情况,需要使用更复杂的算法进行检测和处理。

    4.参考

    第一课:使用C++实现图片去水印_smartvxworks的博客-CSDN博客

    5.实现效果

            待更新。。。

    6.去除水印的几种软件

            如今,短视频的制作和分享已经成为一种日常的活动,许多短视频制作者和分享者都希望他们的视频能够被正确的认可。然而,有时候,短视频的创作者会在视频中添加一些水印图标,以此来确保短视频的版权保护。这种水印图标可能会影响视频的质量,并降低观看者的观赏体验。因此,去除短视频中的水印是很有必要的。

            那么现在有什么比较好用的去除视频水印的方法呢?如今随着软件技术的不断发展,去除视频水印现在也不是很难的问题了,现在有很多去除视频水印的方法,这里我们就来说一说常见的比较好用的三种去除视频水印的方法。

    6.1.用在线去除视频水印的方法去除水印

    详细操作步骤:

            第一步:首先我们需要把视频的链接复制下来,如果我们是要去除某音或者某手的短视频水印,我们就可以在视频播放页面点击分享按钮,就可以把视频的链接复制下来了。

            第二步:复制视频的链接后,我们要想有效地抹去视频中的水印,自然就需要一款高效的去水印工具。这些工具以一键方式去除视频水印,因此选择一款稳定可靠、操作简便的视频去水印工具显得尤为重要,只有这样,才能确保去水印后的视频质量。

            第三步:找到你想要用来去除视频水印的工具后,访问它的去水印功能页面,将视频链接粘贴至该页面,然后按下去除水印的按钮。等待几秒钟后,视频的水印就成功的去除掉了。如果视频较短,只需几秒钟就可以完成去水印操作,若视频时长较长,就需要等待更长的时间。最后,点击保存视频,即可将去水印后的视频保存至个人相册中。

    6.2.用AE专业剪辑工具来去除视频水印

    详细操作步骤:

            第一步,打开AE,然后将需要处理的视频文件拖放到工程区中,然后将其添加到时间轴中。

            第二步,点击AE界面上的“合成”菜单,找到“调整”选项,点击后会出现一个调整面板,在此面板中可以看到水印图像。

            第三步,在此面板中,可以找到“模糊”选项,点击此选项,就可以给水印图像添加模糊效果,从而达到去除水印的效果。

            第四步,调整模糊效果的程度,以达到最佳的去除水印效果。

            第五步,点击合成菜单中的“输出”选项,设置输出的文件格式、路径等,然后点击“渲染”按钮,即可完成去除视频水印的操作。

    6.3.用美图秀秀p图工具来去除视频水印

    详细操作步骤:

            第一步:首先,打开美图秀秀,点击“文件”,在弹出的菜单中点击“打开”,然后选择要去除水印的视频文件。接着,点击工具栏上的“去除水印”图标,美图秀秀会自动识别视频中的水印,并去除视频中的水印。等待一段时间之后,视频中的水印就会被清除。

            第二步:点击工具栏上的“保存”图标,美图秀秀会有提示框要求用户输入新的文件名,输入文件名后,点击“确定”,就可以保存去除水印后的视频文件了。

  • 相关阅读:
    安卓设备文件传输助手 MacDroid pro for mac中文
    空运知识之常用空运名词
    Python__new__和单例对象
    调优过程中缓存的处理
    JAVA毕业设计酒店预约及管理系统计算机源码+lw文档+系统+调试部署+数据库
    centos7服务器安全基线检查和加固建议
    坚持自主创新 线控底盘领军企业英创汇智获数亿元B+轮融资
    Linux计划任务与日志
    rust是否可以用于8051单片机开发工作?
    鱼骨图:简单,但你不得不会(附模板直接下载)
  • 原文地址:https://blog.csdn.net/smartvxworks/article/details/132626511