调试经验--图像

调试经验--图像


    随着芯片技术的发展,嵌入式设备也拥有较强的图像处理能力了。而当中的佼佼者,davinci平台提供了非常强的图像处理功能。


    在davinci平台的使用过程中。我们遇到几个图像相关的问题:
1,图像质量差;
2。上位机显示图像色度不对;
3,颜色分量;
4。yuv传输数据时的裁切。


一、图像质量差

背景:
    在描写叙述问题前,说明一下我们嵌入式设备的开发工作流程,应该有助于说明问题。
主板是硬件开发者參考dm6446开发板的原理图设计的,软件是以dvsdk1.3为开发工具进行的,视频输入是标清的模拟视频,在视频输出端接显示器能够查看图像。

arm接收到输入图像后,传送给dsp,dsp分析图像之后,将结果返回给arm,arm将部分结果,以osd的方式叠加在输出图像上。
    关于图像的buffer,简单说明一下:
dm6446的图像输入buffer。与图像输出buffer。是在两个不同的内存区域,我们叠加的osd信息,是在输出buffer中实现的。
    另外有PC上的配置软件,能够进行设备的配置,当中有一个抓图功能,是使用PC上的配置软件下发捕获图像命令,嵌入式程序运行捕获,即从输入的图像buffer中取出一幅yuv来,然后上传给PC。

问题现象:
    在dm6446平台上,接入标清的模拟视频输入,在视频输出端接显示器查看图像,发现图像质量不好,现象例如以下:
 有模糊的彩色短条移动,在短条所在行附件。运动物体通过时抖动非常厉害(彩色短条的形状比較类似于我们叠加的字符信息OSD);
 不但OSD会造成画面影像移动,其它醒目物体也有类似模糊影像移动。
 进行单张抓图,图像上也有彩条。
 图像底部是黑条。没有图像。
 
进一步的測试:
     採用对照法,正常的程序执行。是既有视频输入也有视频输出。而且还有较多其他功能。我们对系统功能进行简化,进行相同硬件环境下的对照执行測试。
 视频环路程序:同一时候有输入输出,将输入的图像直接送至输出。输出画面有OSD叠加。此时,捕获的图像中还是有OSD的影像。图像底部无图像。
 视频解码显示程序:这是dvsdk中自带的例程,进行视频解码。然后视频输出。

此时,图像清晰、完整。

分析: 
    图像有影子移动,是模拟信号的干扰。当仅仅进行视频输出时图像清晰。说明视频输出部分的线路没有问题,则视频输入部分线路有问题。


    单张抓图的图像上也有彩条,说明了视频输出对视频输入有影响:OSD仅仅用于输出。而抓图抓的仅仅是输入图像。可见输出干扰了输入。
    图像底部无图像,是嵌入式软件对图像的设置有问题。

原因: 
    问题分两部分,一个是图像上有影子移动。一个是图像底部无图像。

图像上有影子移动:
    板卡的视频输出线反向走过整块板卡,当中有一段与输入线非常接近。干扰了输入信号。
对于这个问题,后来还知道,另一条分离输入输出问题的測试方法:VPBE能够设置为彩条输出,能够区分输出图像显示问题的来源是图像还是驱动 。

图像底部无图像:
    是设置图像參数时出了问题,因为osd层是使用半字节表示一个像素,又须要osd层的宽度是32字节对齐的。带来一个问题:720/2=360不是32的倍数,所以,须要使用一个比360大的又最接近的32的倍数。本系统中使用的是384:
OSD属性层:384×576
在设置透明度时。原来设置的是720×576/2 的区域,改为768×576/2 ,恢复varInfo.yres=576,图像及OSD都能全屏显示。


下表简单描写叙述了视频输出的buffer:

设备名          数据内容       缓冲区大小     每像素占字节数
/dev/fb/0 --> OSD内容     1440×576        2 (RGB565)
/dev/fb/2 --> OSD透明度  384×576          0.5 (行宽384,有效使用360)
/dev/fb/3 --> 视频图像      1440×576        2 (UYVY)


二、上位机显示图像色度不对     
现象:
    在嵌入式设备输出端连接的显示屏上。图像显示正常。在用PC上的配置软件抓图。显示的图像不正常。
分析:
    图像显示不正常的地方,往往是画面中最亮的地方。可能是某些值在转换中越界。
原因:
    分析代码,是在dm6446系统中,使用的是yuv,而在PC上显示,是使用的RGB,在进行格式转换时,某些值越界了。比如。在RGB色彩系统中,3个255就是白色,若当中一个越界,造成两个255与一个0。就成了黄色。


三、颜色分量

    高清图像输出,採用3个颜色分量Y、Cb、Cr,输出,使用色差分量线外接显示器。

分量                 Y、  Cb、 Cr
用颜色线表示  绿、 蓝、 红

与我们通常说得RGB有较大的差异。RGB的全0为黑色,全255为白色。

而YCbCr的几种典型颜色,我们有必要知道一下:

0。    0,   0         绿色
255。255,255   粉红色
255,0,255      黄色
255,255,0      亮篮色


四、yuv传输数据时的裁切

    bt656、bt1120都禁止使用0与255。

当遇到0时。应当转换为1;当遇到255时,应该转换为254。
    dm6467的vport in与out口都没有进行数据裁减。真正实现数据裁剪的,是内核驱动。

    比如,在dvsdk1.4中。使用vport传输yuv数据。就没有裁切;而在dvsdk3.10中,就实现了0与255的裁切。

    当遇到数据裁切时。有时会导致新的问题。比如,我想覆盖yuv的第一行来传输某些信息,若被裁切了,数据就不是原来的意义了。


    此时。我们能够使用数据转换法,即让0与255不出现就是了。比較简单的方法,我使用两字节来表示一个字节:0-253。我用高字节置1。低字节使用1-254来表示;而254-255,我使用高字节置2,低字节为1-2就可以。


原文地址:https://www.cnblogs.com/mfmdaoyou/p/6721262.html