shishu 发表于 2023-11-21 18:21:12

一个透明度算法的问题c1+c2*(1-a)

最近小弟在使用go的fyne库在嵌入式板子上画界面。要实现fyne库在嵌入式板子上运行,用buildroot编译了xorg和opengl等,最后能在lcd上显示界面。但是实时刷新摄像头数据的时候cpu占用率极高。
原因就是嵌入式板子没有gpu。fyne使用opengl作为后端,编译的opengl实际上是软光栅算法模拟的gpu所以会很慢。后来自己改了一个月fyne的底层库,把画图相关的opengl使用在framebuffer上直接
画图后,cpu从25%降到了5%左右。但是现在又出现一个问题就是透明度的混叠的问题。
要实现c1+c2*(1-a)的算法。c1是前置图像素rgb中的一个,c2是背景图中rgb中的对应的一个,a是前置图像素的alph透明度。
现在有一个dsp模块能实现f1(a,c1,c2) = c1*a+c2*(1-a),其中c1/c2是0-255的整数,a是0-1的浮点数。
我做了变换使用两个f1相加f1(a,c1,c2)+ f1(a,0,c1) = c1*a+c2*(1-a) + 0*a+c1*(1-a) = c1 + c2*(1-a) 可以满足结果要求。
但是中间还使用加法运算,最后240x320的像素cpu要累加240*320*4次,cpu占用率又高了。
后来又发现dsp的f2函数可以实现如下
0: v0&v1; 1: v0&~v1; 2: ~v0&v1; 3: ~(v0|v1); 4: v0|v1; 5: v0|~v1;6: ~v0|v1; 7: ~(v0&v1); 8: v0^v1; 9: ^(v0^v1). Default is 0 (v0&v1).
的与或非等功能。
请问大侠们可以使用f1和f2等不使用加法运算实现c1+c2*(1-a)的算法吗?谢谢大家了

tomzbj 发表于 2023-11-21 22:24:41

a如果只用4bit呢,改成0-15的整数?
然后 return ((c1<<4)*a + (c2<<4)*(15-a)) >> 4

amigenius 发表于 2023-11-22 00:07:01

本帖最后由 amigenius 于 2023-11-22 00:09 编辑

楼主什么平台?上linux应该是A核吧,A核处理320*240的Alpha很轻松,用NEON优化一下更是轻松至极。俺之前用480M的M7,640*480的拜耳toRGB,转Gray,2次3*3的卷积,2次5*5的卷积,1次欧几里得距离,还有一次池化,还要处理UI,那个才酸爽,搞了半个多月的优化,使用汇编和M7孱弱的SIMD以及各种优化,硬是把幻灯片拉到60多fps,刚好能应对客户性能需求。。。迟点打算换4核A核来做升级,上更高的分辨率和fps,4核可以随便玩,不用担心性能瓶颈。
页: [1]
查看完整版本: 一个透明度算法的问题c1+c2*(1-a)