h265 cv::mat 互转
时间: 2023-10-27 20:03:21 浏览: 185
在C++中,使用OpenCV库可以实现h265格式和cv::Mat之间的互转。下面是转换的示例代码:
1.从h265格式转为cv::Mat:
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <fstream>
#include <vector>
cv::Mat h265ToMat(const std::string& filename) {
std::ifstream file(filename, std::ios::binary);
if (!file) {
std::cerr << "Failed to open H265 file." << std::endl;
return cv::Mat();
}
// 获取h265文件大小
file.seekg(0, std::ios::end);
std::streampos fileSize = file.tellg();
file.seekg(0, std::ios::beg);
// 读取h265数据
std::vector<unsigned char> buffer(fileSize);
file.read(reinterpret_cast<char*>(buffer.data()), fileSize);
// 解码h265数据
cv::cuda::GpuMat gpuH265(buffer);
cv::Mat h265;
gpuH265.download(h265);
// 转为RGB格式的cv::Mat
cv::cuda::GpuMat gpuRGB;
cv::cuda::cvtColor(gpuH265, gpuRGB, cv::COLOR_YUV2RGB);
cv::Mat rgb;
gpuRGB.download(rgb);
return rgb.clone(); // 返回深拷贝的cv::Mat
}
```
2.从cv::Mat转为h265格式:
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <fstream>
#include <vector>
void matToH265(const cv::Mat& image, const std::string& filename) {
// 转为YUV格式
cv::cuda::GpuMat gpuRGB(image);
cv::cuda::GpuMat gpuYUV;
cv::cuda::cvtColor(gpuRGB, gpuYUV, cv::COLOR_RGB2YUV);
// 编码为h265数据
cv::Mat yuv;
gpuYUV.download(yuv);
cv::cuda::GpuMat gpuH265(yuv);
cv::cuda::GpuMat gpuH265Encoded;
cv::Ptr<cv::cudacodec::EncoderParams> params = cv::cudacodec::createEncoderParams();
params->outputFileName = filename;
cv::Ptr<cv::cudacodec::Encoder> encoder = cv::cudacodec::createVideoEncoder("h265", params);
encoder->encode(gpuH265, gpuH265Encoded);
// 写入h265文件
std::ofstream file(filename, std::ios::binary);
if (!file) {
std::cerr << "Failed to create H265 file." << std::endl;
return;
}
std::vector<unsigned char> encodedData;
gpuH265Encoded.download(encodedData);
file.write(reinterpret_cast<char*>(encodedData.data()), encodedData.size());
}
```
这样,你就可以在C++中实现h265格式和cv::Mat之间的互转了。
阅读全文