求YUV420数据流处理方法(YUV解码)

east_0012 2010-08-19 11:40:44
最近遇到个问题,摄像头把YUV数据流给我传过来,我通过什么方式能把它转换成图片直接画出来,我给大家说说我现在的想法。

数据流是一段一段传的,在网上有YUV 转 RGB 什么的算法公式什么的,我首先要接收完这段流,然后在找YUV分量值,这样面写太慢了,肯定不行。

我想用directShow能不能把YUV数据流转换成图片直接画出来,这样一边获取流一边画应该就不慢了。

急急急,这些都是很经典的问题了,问问大家有什么好的办法,说说大家的想法互相交流下,目前我是用C#解,我获取到的就

是一段字节流,什么都没有,还知道发过来的流最后转成的图像是720*576的,剩余的不知道了,而且我想的编码什么的找找

有什规律吧,让我失望了,一直是乱码。
...全文
581 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinhaijian 2010-08-19
  • 打赏
  • 举报
回复
C++里写dll库,查询下就有
http://blog.sina.com.cn/s/blog_628cc2b70100im4a.html
east_0012 2010-08-19
  • 打赏
  • 举报
回复
汗,很失望,结贴了!
east_0012 2010-08-19
  • 打赏
  • 举报
回复
您是否能给我一个C++写好的dll库,能让C#掉就行了,100分就归你了,或告诉我怎么在C++里面写dll库啊,我不熟悉C++,咱俩反了
jinhaijian 2010-08-19
  • 打赏
  • 举报
回复
C#不熟悉
east_0012 2010-08-19
  • 打赏
  • 举报
回复
是,你说的很对大哥,我现在要用C#调,可是这些都是C++写的,网上这方面的资料是很多,我用C#调要传RGB的 buffer的指针什么的,我应该怎么调?

void ConvertYUVtoRGB(unsigned char *src0,unsigned char *src1,unsigned char *src2,unsigned char *dst_ori,int width, int height)
{
extern long int crv_tab[];
extern long int cbu_tab[];
extern long int cgu_tab[];
extern long int cgv_tab[];
extern long int tab_76309[];
int y11, y21;
int y12, y22;
int y13, y23;
int y14, y24;
int u, v;
int i, j;
int c11, c21, c31, c41;
int c12, c22, c32, c42;
unsigned int DW;
unsigned int *id1, *id2;
unsigned char *py1, *py2, *pu, *pv;
unsigned char *d1, *d2;

d1 = dst_ori;
d1 += width * height * 3 - width * 3;
d2 = d1 - width * 3;

py1 = src0;
pu = src1;
pv = src2;
py2 = py1 + width;

id1 = (unsigned int *) d1;
id2 = (unsigned int *) d2;
for (j = 0; j < height; j += 2)



{
/* line j + 0 */
for (i = 0; i < width; i += 4)
{
u = *pu++;
v = *pv++;
c11 = crv_tab[v];
c21 = cgu_tab[u];
c31 = cgv_tab[v];
c41 = cbu_tab[u];
u = *pu++;
v = *pv++;
c12 = crv_tab[v];
c22 = cgu_tab[u];
c32 = cgv_tab[v];
c42 = cbu_tab[u];

y11 = tab_76309[*py1++]; /* (255/219)*65536 */
y12 = tab_76309[*py1++];
y13 = tab_76309[*py1++]; /* (255/219)*65536 */
y14 = tab_76309[*py1++];

y21 = tab_76309[*py2++];
y22 = tab_76309[*py2++];
y23 = tab_76309[*py2++];
y24 = tab_76309[*py2++];

/* RGBR */
DW = ((clp[(y11 + c41) >> 16])) |
((clp[(y11 - c21 - c31) >> 16]) << 8) |
((clp[(y11 + c11) >> 16]) << 16) |
((clp[(y12 + c41) >> 16]) << 24);
*id1++ = DW;

/* GBRG */
DW = ((clp[(y12 - c21 - c31) >> 16])) |
((clp[(y12 + c11) >> 16]) << 8) |
((clp[(y13 + c42) >> 16]) << 16) |
((clp[(y13 - c22 - c32) >> 16]) << 24);
*id1++ = DW;

/* BRGB */
DW = ((clp[(y13 + c12) >> 16])) |
((clp[(y14 + c42) >> 16]) << 8) |
((clp[(y14 - c22 - c32) >> 16]) << 16) |
((clp[(y14 + c12) >> 16]) << 24);
*id1++ = DW;

/* RGBR */
DW = ((clp[(y21 + c41) >> 16])) |
((clp[(y21 - c21 - c31) >> 16]) << 8) |
((clp[(y21 + c11) >> 16]) << 16) |
((clp[(y22 + c41) >> 16]) << 24);
*id2++ = DW;

/* GBRG */
DW = ((clp[(y22 - c21 - c31) >> 16])) |
((clp[(y22 + c11) >> 16]) << 8) |
((clp[(y23 + c42) >> 16]) << 16) |
((clp[(y23 - c22 - c32) >> 16]) << 24);
*id2++ = DW;

/* BRGB */
DW = ((clp[(y23 + c12) >> 16])) |
((clp[(y24 + c42) >> 16]) << 8) |
((clp[(y24 - c22 - c32) >> 16]) << 16) |
((clp[(y24 + c12) >> 16]) << 24);
*id2++ = DW;
}
id1 -= (9 * width) >> 2;
id2 -= (9 * width) >> 2;
py1 += width;
py2 += width;
}
}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zsJum/archive/2007/11/18/1891155.aspx
jinhaijian 2010-08-19
  • 打赏
  • 举报
回复
directshow本身就支持color space converter(色彩空间)转换的。
如果你不想用directshow来画,自己画。
数据流是一段一段传的,在网上有YUV 转 RGB 什么的算法公式什么的,我首先要接收完这段流,然后在找YUV分量值,这样面写太慢了,肯定不行
数据流不是一段一段,而是一帧一帧的传。YUV的分类是很容易算的,在camera中,一般传过来的是YV12数据,首先是Y分量,然后才是V和U的分量。如果你的视频长宽式w和h,数据首地址是P,那么Y=P,V=w*h + p,U=V + w*h/4。
对于预览来说,YUV->RGB的速度还是很快的。
内容概要:本文聚焦于线性时不变系统的容错模型预测控制(FT-MPC)策略,系统研究了故障诊断与容错控制的理论框架及其实现方法,并结合Matlab代码进行了算法仿真与验证。文章深入剖析了FT-MPC的整体控制架构,涵盖状态估计、故障检测、隔离与重构机制,重点展示了在执行器或传感器发生故障时系统的自适应调节能力与鲁棒性保持策略。通过数值仿真验证了所提方法在维持系统稳定性、保证控制精度和实现快速容错响应方面的有效性,体现了模型预测控制与容错机制深度融合的技术优势,适用于对安全性、可靠性和连续运行要严苛的工业控制场景。; 适合人群:具备自动控制理论基础、熟悉现代控制方法与Matlab/Simulink仿真工具,从事控制工程、自动化、系统工程及相关领域的研究人员、工程技术人员及研究生。; 使用场景及目标:①应用于航空航天、智能制造、能源电力等高可靠性要系统的控制器设计;②开展容错控制算法的研究与模型预测控制的工程化落地;③作为学术研究参考资料,支持相关课题的算法开发、仿真验证与性能优化。; 阅读建议:建议结合提供的Matlab代码逐模块分析,重点关注状态观测器设计、残差生成与阈值判断逻辑、故障重构策略以及MPC优化解过程,配合仿真结果进行调试与对比,以深入理解容错控制系统的动态响应特性与鲁棒性能表现。
内容概要:本文围绕圆柱形永磁体的磁场建模展开系统性研究,基于毕奥-萨伐尔定律构建有限长度圆柱形永磁体在三维空间中的磁场分布数学模型,详细推导磁感应强度的积分表达式,并采用离散化数值方法将其转化为可在计算机中高效解的形式。研究通过Matlab编程实现完整的仿真流程,涵盖坐标系设定、空间网格划分、矢量积分计算、磁场分量合成及可视化呈现等关键步骤,能够精确模拟永磁体外部任意位置的磁场大小与方向分布,为电磁场理论分析与工程应用提供可靠的数值仿真手段。; 适合人群:具备电磁场与电磁波基础知识及Matlab编程能力的高等院校研究生、科研机构研究人员以及从事电机设计、磁性传感器开发、磁导航系统研究等领域的工程技术人才。; 使用场景及目标:①用于高校电磁学课程中磁场建模的教学演示与数值实验;②支撑科研项目中对永磁体空间磁场的高精度建模需;③服务于磁力计算、磁耦合机构设计、磁悬浮系统开发等实际工程问题,提供理论依据与仿真验证支持。; 阅读建议:建议读者结合经典电磁理论教材,深入理解物理公式的数学推导过程,逐行分析Matlab代码实现逻辑,动手运行程序并尝试调整永磁体几何参数、磁化方向或观测平面位置,从而全面掌握磁场分布特性及其影响规律。
代码转载自:https://pan.quark.cn/s/a4b39357ea24 Adams 软件动力学仿真分析的规范流程是运用 Adams 工具针对机械系统开展动力学仿真分析的规范流程,此流程致力于引导使用者从模型构建至仿真结果解读的完整环节。一、模型构建在 Adams 平台操作时,使用者须首先将 SolidWorks 生成的模型文件转换成 Parasolid 格式,接着将转换后的文件载入 Adams 软件并完成保存操作。于模型构建阶段,使用者务必核对并调整系统的相关配置,核心环节在于确认单位制式及重力加速度参数,此举是为了保障仿真输出数据的精确度。二、模型调适在模型构建环节结束后,使用者需对模型实施必要的调整,主要包含对构件名称、材质属性以及色彩样式的变更。使用者可通过模型交互界面借助线框图功能来更正构件的命名及材质,同时运用 view part only 功能来设定构件的颜色。此类调整的主要目的是提升模型的直观性并优化操作体验。三、运动关联与驱动配置在模型调适环节完成后,使用者需增设运动关联及驱动约束。在增设运动关联时,使用者应留意构件的选择次序,需明确首个构件是相对第二个构件进行运动。对于需施加驱动的运动关联,当采用垂直于网格的方式来确立运动关联的方向时,必须仔细核实视图的朝向是否准确,应依据右手法则进行判定。倘若视图朝向存在偏差,运动方向亦将随之错误,此时驱动函数的符号需进行反向调整。增设运动关联时,应尽可能选取零件的质心位置,同时亦需核查零件的质心点是否处于几何中心。四、仿真运算在运动关联与驱动配置环节结束后,使用者需执行初步的仿真运算,以验证前序工作的有效性。由于已设定了材质参数且考虑了重力效应,但尚未定义接触条件,因此模型将在重力作用下产生...

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧