我采用ov7725作为视屏数据采集,采用一个2.2寸屏来显示。其中ov7725采集视频分辨率为320*240,2.2寸显示屏分辨率为240*320。ov7725采集的数据是yuv422的,而显示屏是RGB565的,将摄像头采集回来的数据的部分图像做彩色空间转换,用于LCD的显示。我的做法是,建立一个表以Y为下标对应到相应的RGB灰度,表的形式如下: volatile unsigned short Y2Gray[] = {
4 |" j6 R" c8 T6 E% j" [0x0000,0x0000,0x0000,0x0000,0x0020,0x0020,0x0020,0x0020,$ j' T( `4 t: ?' N: G
0x0841,0x0841,0x0841,0x0841,0x0861,0x0861,0x0861,0x0861,
6 j2 {/ h/ Z; H* A- |* m3 M0x1082,0x1082,0x1082,0x1082,0x10a2,0x10a2,0x10a2,0x10a2,
8 s) n) M5 A: C.... 0xffdf,0xffdf,0xffdf,0xffdf,0xffff,0xffff,0xffff,0xffff, }; 色彩空间转换的部分如下: volatile unsigned char *videoTopY, *videoTopC;
3 e4 S/ T. M* i- Rvolatile unsigned short *videoTopRgb1, *videoTopRgb2; for(i = 0; i < 240; i++); L% z3 W# t, [1 I# v- B
{, R2 p% _( _/ x* G, f) I% U1 J% |
for(j = 0; j < 240; j+=8)7 o, g, n' [9 n" T' Q% ]! R% }
{5 }) `; U( p: F3 w- B! @9 T
index = i * 240+ j;
% e4 e, q2 ^3 B* w* l/ S; c: A index1 = i * 320+ j;
4 A6 e- f; ?# Z9 u9 s" s& W2 X0 x videoTopRgb1[index] = Y2Gray[videoTopY[index1 * 2]];- }2 [' v0 @3 L6 ^4 L* N
videoTopRgb1[index + 1] =Y2Gray[videoTopY[(index1 + 1) * 2]];' ?: f: C, S5 o
videoTopRgb1[index + 2] = Y2Gray[videoTopY[(index1 + 2) * 2]];
6 Q8 g8 [ {+ N+ h videoTopRgb1[index + 3] = Y2Gray[videoTopY[(index1 + 3) * 2]];+ ?4 m5 Y: ~! H% m$ v" j) @/ U; O
videoTopRgb1[index + 4] = Y2Gray[videoTopY[(index1 + 4) * 2]];
2 @- u& M+ q( _7 u9 Z) y; E; c videoTopRgb1[index + 5] = Y2Gray[videoTopY[(index1 + 5) * 2]];
2 ~( C" x& f' t/ C$ w4 ^# `& z- C videoTopRgb1[index + 6] = Y2Gray[videoTopY[(index1 + 6) * 2]];
% C- T! v1 C* o4 C4 q- g videoTopRgb1[index + 7] = Y2Gray[videoTopY[(index1 + 7) * 2]]; }
( O% S: C+ \8 {) w
7 x% g9 X0 ~! v, T4 i} 我用的是双buffer显示的。 问题是图像只会显示一半。 使用CCS5.5将DSP内存中的数据保存,放到matlab中显示如下: 我的摄像头采集回来的数据是这样的(图一) 小黑点忽略yuv 理论上处理完成之后应该是这个样子的(图二) 但是dsp处理完数据后显示buff里的数据是这样的(图三,图四):
# ]# X% D+ Y4 c程序运行过过程中图三,图四是交替显示的。 请问这是为什么?我开了L1cache,cache inv和wb都用了,也不起作用。 请TL的工程师帮忙解决一下,困扰了两周了,不胜感激。 # U' Z$ {+ F4 k+ h. ]* ?
& V6 P3 _- U! V' t
|