如果不使用规定的YUV2RGB 转换矩阵来转换可能会造成overflkow
#include <stdio.h> static const float matrix_rgb2yuv_709[] = { 0.2126, 0.7152, 0.0722, - 0.1146, -0.3854, 0.5000, 0.5000, -0.4542, -0.0458 }; static const float matrix_rgb2yuv_709_invert[] = { 1, 0, 1.5747, 1, -0.1873, -0.4682, 1, 1.8556, 0 }; static const float matrix_rgb2yuv_ntsc[] = { 0.2989, 0.5866, 0.1145, -0.1688, -0.3312, 0.5000, 0.5000, -0.4184, -0.0816 }; static const float matrix_rgb2yuv_ntsc_invert[] = { 1, 0, 1.4022, 1, -0.3456, -0.7145, 1, 1.7710, 0 }; void mul32f_3x3(const float* matrix, float* in, float* out) { out[0] = matrix[0] * in[0] + matrix[1] * in[1] + matrix[2] * in[2]; out[1] = matrix[3] * in[0] + matrix[4] * in[1] + matrix[5] * in[2]; out[2] = matrix[6] * in[0] + matrix[7] * in[1] + matrix[8] * in[2]; } int check_if_overflow() { for (int i = 0; i < 256; i+=255) { for (int j = 0; j < 256; j+=255) { for (int k = 0; k < 256; k+=255) { float src[] = { i/255.0,j/255.0,k/255.0 }; //float src[] = { 0/255.0,255/255.0,0/255.0 }; float srcyuv[3], dstrgb[3]; mul32f_3x3(matrix_rgb2yuv_709, src, srcyuv); mul32f_3x3(matrix_rgb2yuv_ntsc_invert, srcyuv, dstrgb); if (dstrgb[0] < -0.1 || dstrgb[1] < -0.1 || dstrgb[2] < -0.1) { printf("srcyuv:%.4f %.4f %.4f dstrgb:%.4f %.4f %.4f\n", srcyuv[0], srcyuv[1], srcyuv[2], dstrgb[0], dstrgb[1], dstrgb[2]); //return -1; } } } } return 0; } int main() { return check_if_overflow(); }
output
srcyuv:0.2126 -0.1146 0.5000 dstrgb:0.9137 -0.1050 0.0096
srcyuv:0.2848 0.3854 0.4542 dstrgb:0.9217 -0.1729 0.9673
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2019-05-10 使用shared memory 计算矩阵乘法 (其实并没有加速多少)
2018-05-10 mark ubuntu 16.04 64bit + cpu only install mtcnn