在我看来,您将 YUV422 流解码为 YUV444。尝试对您提供的代码进行此修改: for(int i = 0, j=0; i < 1280 * 720 * 3; i+=6, j+=4) m_RGB->imageData[i] = pData[j] + pData[j+3]*((1 - 0.299)/0.615); m_RGB->imageData[i+1] = pData[j] - pData[j+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[j+3]*((0.299*(1 - 0.299))/(0.615*0.587)); m_RGB->imageData[i+2] = pData[j] + pData[j+1]*((1 - 0.114)/0.436); m_RGB->imageData[i+3] = pData[j+2] + pData[j+3]*((1 - 0.299)/0.615); m_RGB->imageData[i+4] = pData[j+2] - pData[j+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[j+3]*((0.299*(1 - 0.299))/(0.615*0.587)); m_RGB->imageData[i+5] = pData[j+2] + pData[j+1]*((1 - 0.114)/0.436); 我不确定你的常数是否正确,但最坏的情况是你的颜色会消失 - 图像应该是可识别的。 原文由 Mark Ransom 发布,翻译遵循 CC BY-SA 3.0 许可协议
我使用以下 C++ 代码使用 OpenCV 将 yuv 数据(YUV_NV21)转换为 rgb 图像(OpenCV 中的 BGR) int main() const int width = 1280; const int height = 800; std::ifstream file_in; file_in.open("../image_yuv_nv21_1280_800_01.raw", std::ios::binary); std::filebuf *p_filebuf = file_in.rdbuf(); size_t size = p_filebuf->pubseekoff(0, std::ios::end, std::ios::in); p_filebuf->pubseekpos(0, std::ios::in); char *buf_src = new char[size]; p_filebuf->sgetn(buf_src, size); cv::Mat mat_src = cv::Mat(height*1.5, width, CV_8UC1, buf_src); cv::Mat mat_dst = cv::Mat(height, width, CV_8UC3); cv::cvtColor(mat_src, mat_dst, cv::COLOR_YUV2BGR_NV21); cv::imwrite("yuv.png", mat_dst); file_in.close(); delete []buf_src; return 0; 转换后的结果就像图像 yuv.png 。