一. 项目进展:
1.下载并安装ffmpeg,学习ffmpeg命令行编码解码的命令行语句
2.下载安装OpenCV并配置到Visual Studio,学习cv空间下的库函数imshow()、imwrite()、Mat image()等
3.编写随机生成二进制图像文件以及读取二进制文件生成图片文件的c++代码
4.学习物理层传输的原理,巩固传输过程中的编解码、噪声、分辨率、波特率、调制和误码等通信概念
二. 下一步计划:
1.编程计算各种传输物理量的cpp程序
2.利用奈氏定理以及香农定理优化传输速率
三. 技术尝试:
尝试使用python语言的tkinter框架编写图形用户界面以及输入输出程序,但因为不是项目侧重点以及有的组员没学过Pyhton,就还是采用Cpp嵌入OpenCV到Visual Studio里来执行程序。
以下是已有的一些cpp代码:
随机生成二进制文件的代码参考网络,并不太好,文件量极大......
//以下是随机生成仅带颜色图像文件的代码
#include <opencv2/opencv.hpp>
#include <fstream>
using namespace cv;
using namespace std;
int main() {
// 设置图像参数
int width = 640;
int height = 480;
int numImages = 20; // 生成的图像数量
// 创建二进制文件并写入图像数据
ofstream binaryFile("images.bin", ios::binary); //images.bin为生成的二进制文件,文件路径和cpp程序同目录
for (int i = 0; i < numImages; ++i) {
Mat image(height, width, CV_8UC3);
randu(image, Scalar(0, 0, 0), Scalar(255, 255, 255)); // 随机生成颜色图像
// 写入图像数据到二进制文件
binaryFile.write(reinterpret_cast<char*>(image.data), image.total() * image.elemSize());
}
binaryFile.close();
// 从二进制文件读取图像数据并显示,此段代码可不需要显示在屏幕上
ifstream readBinaryFile("images.bin", ios::binary);
for (int i = 0; i < numImages; ++i) {
Mat image(height, width, CV_8UC3);
readBinaryFile.read(reinterpret_cast<char*>(image.data), image.total() * image.elemSize());
// 显示图像
imshow("Image", image);
waitKey(1000); // 每秒显示一个图像
}
readBinaryFile.close();
return 0;
}
#include <opencv2/opencv.hpp>
#include <fstream>
int main() {
// 设置图像参数
int width = 640;
int height = 480;
int numImages = 20; //生成图片个数,与二进制文件对应
// 从二进制文件读取图像数据并保存为文件
std::ifstream readBinaryFile("images.bin", std::ios::binary); //images.bin需要放在程序同目录下
for (int i = 1; i < numImages+1; ++i) {
// 读取图像数据
cv::Mat image(height, width, CV_8UC3);
readBinaryFile.read(reinterpret_cast<char*>(image.data), image.total() * image.elemSize());
// 生成图像文件名,例如 image_0.jpg、image_1.jpg 等
std::string filename = "image" + std::to_string(i) + ".jpg"; //生成图片的文件名
// 保存图像为文件
cv::imwrite(filename, image);
// 显示图像(可选)
cv::imshow("Image", image);
cv::waitKey(1000); // 每秒显示一个图像
}
readBinaryFile.close();
return 0;
}
END. 记录ffmpeg命令行解释供队员参考:
ffmpeg -framerate 1 -i image%01d.jpg -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p -vframes 20 output.mp4
-framerate 1: 指定视频的帧率为1帧每秒。这意味着你的输出视频将以每秒一个图像的速度播放。
-i image%01d.jpg: 这是输入图片的文件名模板。%01d 表示使用四位数字作为文件名的一部分,例如,image1.jpg, image2.jpg 等。
-c:v libx264: 指定使用H.264视频编码器进行视频压缩。
-profile:v high: 设置视频编码的配置文件为高级别。H.264的不同配置文件提供了不同的性能和兼容性。
-crf 20: 指定视频的恒定质量(Constant Rate Factor),数值越低,视频质量越高,范围一般在18-28之间。
-pix_fmt yuv420p: 设置像素格式为yuv420p,这是常用的像素格式,特别是在网络上分享视频时。
-vframes 20: 指定输出视频的帧数,这里设置为20帧。
output.mp4: 指定输出文件的名称,这是生成的视频的文件名
ffmpeg -i input.mp4 -q:v 2 output%01d.jpg
-i input.mp4: 指定输入视频文件为 input.mp4,你可以替换为你的视频文件路径和名称。
-q:v 2: 设置图像的质量,数值越小,图像质量越高。这里设定为2,可以根据需要调整。
output%01d.jpg: 指定输出图像文件的命名规则,其中 %01d 表示一位数字,例如,output1.jpg、output2.jpg 等。