目前在用的这款芯片,图像翻转有专门的一个图像处理IP来完成,同时这个IP又支持叠加OSD的功能,但是在设计的时候叠加OSD的功能单元又在图像翻转单元的前面,导致了开启了图像翻转功能后,OSD就倒着显示、位置不在原来的坐标上了,那怎么办呢?
需要在翻转图像前把OSD给记录下来他们的位置关系,然后翻转后再重新排序,重新排布位置来完成从叠加在图像上的位置不变的效果。
比如翻转前:
时间戳OSD显示在左上角,那么做一个上下翻转,也就是FLIP。从效果上我们当前要求FLIP后时间戳OSD显示还是在同样的位置,只是图像画面自己转了。但是得到的效果不正常,花了
有时候显示又是正常的,如下图:
为什么呢?
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
我们怀疑是在OSD重新排序的时候,把OSD画布内容做翻转不成功,因此做了一个实验,就是只设置一次OSD,后期时间戳不刷新,显示是正常的,只不过是倒立的,
实验的时候,我们把做翻转的动作给取消了,相当于不翻转,图像只是倒立而已,但是做翻转的接口又是调用的OPENCV的接口,这种接口也不大可能出问题,再说它能完成一次就有理由说明人家这个翻转接口功能没问题,这种是纯软件的接口,经久耐用的接口我们应该还是信任的,那就剩OSD画布的内存同步了,怀疑是内存同步的问题。OSD画布用的是物理内存快,通过system map得到虚拟地址然后调opencv来处理,处理完后再memcpy回到映射的虚拟地址上。那怎么查呢?
项目进行得有点深了,只能通过回看代码提交记录了,很幸运的是发现了一点情况,
有一个提交把VB都改成CACHED的了,这样在读这个VB内存块的时候要快一些,但是回写到这个VB块就需要去做一下同步。马上做了一个实验,改完非CACHED的,
这样操作VB慢一点,但是没有同步的问题了。
后期还可以继续用CACHED的配置,再加一个VB flush的接口来做同步,也是可以解决问题的。