opencv c++给视频添加椒盐噪声和高斯噪声后将其保存为新的视频文件
时间: 2023-06-26 07:04:03 浏览: 154
新建文件夹_噪声_
可以使用 OpenCV C++ 库来对视频添加椒盐噪声和高斯噪声,并将其保存为新的视频文件。下面是一个示例代码:
```C++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 打开原始视频文件
VideoCapture cap("input.mp4");
if (!cap.isOpened())
{
cerr << "Error opening video file." << endl;
return -1;
}
// 获取视频的帧率、宽度和高度
double fps = cap.get(CAP_PROP_FPS);
int width = cap.get(CAP_PROP_FRAME_WIDTH);
int height = cap.get(CAP_PROP_FRAME_HEIGHT);
// 创建新的视频文件
VideoWriter writer("output.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(width, height));
// 循环遍历视频中的每一帧
Mat frame;
while (cap.read(frame))
{
// 添加椒盐噪声
Mat salt_frame = frame.clone();
int num_salt = 3000;
for (int i = 0; i < num_salt; i++)
{
int x = rand() % salt_frame.cols;
int y = rand() % salt_frame.rows;
if (rand() % 2 == 0)
{
salt_frame.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
}
else
{
salt_frame.at<Vec3b>(y, x) = Vec3b(0, 0, 0);
}
}
// 添加高斯噪声
Mat gaussian_frame = frame.clone();
Mat noise = Mat(gaussian_frame.size(), CV_8UC3);
randn(noise, Scalar(0, 0, 0), Scalar(50, 50, 50));
add(gaussian_frame, noise, gaussian_frame);
// 将添加噪声后的视频帧写入新的视频文件
writer.write(salt_frame); // 保存椒盐噪声视频
writer.write(gaussian_frame); // 保存高斯噪声视频
}
// 释放资源
cap.release();
writer.release();
return 0;
}
```
在上述代码中,我们打开原始视频文件并获取其帧率、宽度和高度。然后,我们循环遍历视频中的每一帧,并对每一帧进行椒盐噪声和高斯噪声的添加。最后,我们将添加噪声后的视频帧写入新的视频文件。
注意,我们使用 `VideoWriter` 类来创建新的视频文件,并使用 `fourcc` 函数指定视频编解码器。在上述代码中,我们使用了 MJPG 编解码器。如果您的系统上没有 MJPG 编解码器,请尝试使用其他编解码器,例如 XVID 或 H264。
此外,我们使用 `rand()` 函数生成随机数并对视频帧添加椒盐噪声,使用 `randn()` 函数生成随机数并对视频帧添加高斯噪声。这些函数在 C++ 的 `stdlib.h` 和 `opencv2/core.hpp` 头文件中声明。
最后,记得在代码的结尾释放资源,包括释放 `VideoCapture` 和 `VideoWriter` 对象。
阅读全文