YUV数据是一种通用的图像格式,当我们从拿到YUV数据后如果需要在YUV数据中添加文字,可以使用OpenCV的Mat类型进行保存,在mat类型中使用putText添加自己想要的文字
下列代码为在yuv数据中添加当前时间的代码
// yuv数据格式为 uint8_t *data,宽 高为 w,h
cv::Mat yMat(h, w, CV_8UC1,data);
auto currentTime = std::chrono::system_clock::now();
time_t raw_time = std::chrono::system_clock::to_time_t(currentTime);
struct tm *timeinfo = std::localtime(&raw_time);
std::stringstream ss;
ss << std::put_time(timeinfo,"%Y-%m-%d %H:%M:%S")
std::string time String = ss.str();
cv::putText(yMat,timeString,cv::Point(yMat.cols - 200, 20), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 255), 1);
这段代码中,并没有将yuv的整个数据存储进来,而是只存了Y分量,如果要存整个YUV则需要将h变成h+h/2,这是yuv格式的问题,具体请参看YUV相关介绍。
此代码使用的是cv::Mat的引用构造,没有占用额外的空间进行复制拷贝,修改了yMat的同时也修改了yuv源数据。
为什么可以这样做?
因为yuv数据中的y分量就代表的是灰度值,直接在灰度值上进行修改,就可以很便利地做到文字的添加,同时还不额外消耗资源。
网络上大多数拿到yuv数据都是转成了rgb的格式,然后再用rgb数据进行一些修改,今天看到了OpenCV的mat构造是引用的,故试了一下这种方式去修改,发现行得通,于是分享出来供大家参考。