写一个c++demo,在nv12数据上叠加时间戳水印
时间: 2024-11-10 16:26:05 浏览: 54
在C++中,要在NV12格式(一种常见的YUV图像格式,其中Y是亮度信息,U和V是色度信息,每个像素点包含两个半像素)的数据上叠加时间戳水印,你可以使用OpenCV库,因为它支持多种图像处理操作。以下是一个简单的示例,假设你已经包含了必要的OpenCV头文件,并且有一个`timeStamp`变量用于获取当前的时间戳:
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
// 获取当前时间戳
cv::Mat getTimeStamp() {
cv::Scalar timestamp_color(0, 0, 255); // 设置为红色,可根据需要调整颜色
std::stringstream ss;
ss << std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); // 转换为时间戳字符串
char timeStr[80];
strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", std::localtime(&ss.str().c_str()));
cv::putText(cv::Mat(), std::string(timeStr), cv::Point(10, 40), cv::FONT_HERSHEY_SIMPLEX, 0.5, timestamp_color, 1);
return cv::Mat(1, 1, CV_8UC3, timestamp_color.val);
}
int main() {
cv::Mat src_nv12; // 假设你已经有了一个加载好的NV12源图像
if (!src_nv12.data) {
std::cerr << "Error loading NV12 image" << std::endl;
return -1;
}
// 将NV12转换为I420格式(OpenCV更常用)
cv::Mat yuv_i420(src_nv12.size(), CV_8UC4);
cv::cvtColor(src_nv12, yuv_i420, COLOR_YUV2BGR_NV12);
// 创建一个白色背景的小矩形区域放置时间戳
cv::Rect text_pos(0, yuv_i420.rows - 40, yuv_i420.cols, 40);
cv::rectangle(yuv_i420, text_pos, cv::Scalar(255, 255, 255), -1);
// 添加时间戳到指定位置
cv::Mat timestamp = getTimeStamp();
cv::addWeighted(timestamp, 1.0, yuv_i420(text_pos), 1.0, 0, yuv_i420(text_pos));
// 如果你想显示结果,可以保存到文件或窗口
cv::imwrite("timestamped_nv12.png", yuv_i420);
cv::imshow("Time Stamped Image", yuv_i420);
cv::waitKey(0);
return 0;
}
```
阅读全文