求助:摄像头采集的视频和QT的GUI显示到LCD的不同显示层,具体该怎么操作啊?

chutianya 2014-08-02 08:22:12
求教个问题,请大家帮个忙啊: 我现在想把从摄像头采集的视频和QT的GUI显示到LCD的不同显示层,具体该怎么操作啊。。我现在的情况是视频把QT gui给盖住了啊。。。我想让QT gui在上面。。不知道怎么搞啊。。。对framebuffer一点不懂啊。。。我用的是SX4412,/dev下面有5个fb, fb0,fb1,..fb4。。。


...全文
935 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuierpeng 2015-11-19
  • 打赏
  • 举报
回复
楼主你好,你多屏显示可以实现吗? 我的也是多个fb,先同时两个屏幕显示的,不知道具体如何指定QWS_DISPLAY
chutianya 2015-08-01
  • 打赏
  • 举报
回复
引用 23 楼 kevin_wxh 的回复:
楼主,我的只有fb,fb0,fb1,fb2,fb3,我尝试把QT gui显示到fb1,fb2,fb3都不行,没有界面显示出来,视频只能显示在fb0,这种情况下怎么实现分层显示呢?求教!!!!
你要其它层都搞成透明的,否则是被挡住看不到的。。。 具体看我的博客。。 http://blog.csdn.net/chutianya/article/details/43206559
kevin_wxh 2015-07-31
  • 打赏
  • 举报
回复
楼主,我的只有fb,fb0,fb1,fb2,fb3,我尝试把QT gui显示到fb1,fb2,fb3都不行,没有界面显示出来,视频只能显示在fb0,这种情况下怎么实现分层显示呢?求教!!!!
霁月清风 2015-07-28
  • 打赏
  • 举报
回复
只有一个fb的话,是不是就不能分层显示了?
chutianya 2015-05-24
  • 打赏
  • 举报
回复
引用 20 楼 u012175394 的回复:
输入:ls /dev后显示这些设备文件,也就是帧缓冲去就:fb,fb0,fb1,fb2,4个,不知道 video0-video6与fb有什么关系?? 你的那程序我稍作了下修改,但只显示了一块白色条,究竟怎么设置成透明啊? QWS设置成透明是QWSServer::setBackground((QColor(0,0,0,0));还是 QWSServer::setBackground((QColor(255,255,255,0)); 菜鸟一枚!还望大神多多指点!!!!万谢不辞!!!!!!!!!! TI81XX_HDMI ti81xx_edma block tty bus tty0 char tty1 cmem tty10 console tty11 cpu_dma_latency tty12 disk tty13 fb tty14 fb0 tty15 fb1 tty16 fb2 tty17 full tty18 fuse tty19 i2c-1 tty2 i2c-2 tty20 initctl tty21 input tty22 kmem tty23 kmsg tty24 log tty25 loop0 tty26 loop1 tty27 loop2 tty28 loop3 tty29 loop4 tty3 loop5 tty30 loop6 tty31 loop7 tty32 mem tty33 mtd0 tty34 mtd0ro tty35 mtd1 tty36 mtd1ro tty37 mtd2 tty38 mtd2ro tty39 mtd3 tty4 mtd3ro tty40 mtdblock0 tty41 mtdblock1 tty42 mtdblock2 tty43 mtdblock3 tty44 network_latency tty45 network_throughput tty46 null tty47 port tty48 ptmx tty49 pts tty5 ram0 tty50 ram1 tty51 ram10 tty52 ram11 tty53 ram12 tty54 ram13 tty55 ram14 tty56 ram15 tty57 ram2 tty58 ram3 tty59 ram4 tty6 ram5 tty60 ram6 tty61 ram7 tty62 ram8 tty63 ram9 tty7 random tty8 rtc tty9 rtc0 ttyO0 rtc1 ttyO1 sda ttyO2 sg0 ttyS0 shm ttyS1 snd ttyS2 spidev1.1 ttyS3 spidev1.2 ubi0 spidev1.3 ubi0_0 syslinkipc_ClientNotifyMgr ubi_ctrl syslinkipc_FrameQ udev_network_queue syslinkipc_FrameQBufMgr urandom syslinkipc_GateMP v4l syslinkipc_HeapBufMP vcs syslinkipc_HeapMemMP vcs1 syslinkipc_Ipc vcsa syslinkipc_ListMP vcsa1 syslinkipc_MessageQ vga_arbiter syslinkipc_MultiProc video0 syslinkipc_NameServer video1 syslinkipc_Notify video2 syslinkipc_Osal video3 syslinkipc_ProcMgr video4 syslinkipc_RingIO video5 syslinkipc_RingIOShm video6 syslinkipc_SharedRegion watchdog syslinkipc_SyslinkMemMgr zero
具体可以参见我的博客: http://blog.csdn.net/chutianya/article/details/43206559
codeshawn 2015-01-26
  • 打赏
  • 举报
回复
输入:ls /dev后显示这些设备文件,也就是帧缓冲去就:fb,fb0,fb1,fb2,4个,不知道 video0-video6与fb有什么关系?? 你的那程序我稍作了下修改,但只显示了一块白色条,究竟怎么设置成透明啊? QWS设置成透明是QWSServer::setBackground((QColor(0,0,0,0));还是 QWSServer::setBackground((QColor(255,255,255,0)); 菜鸟一枚!还望大神多多指点!!!!万谢不辞!!!!!!!!!! TI81XX_HDMI ti81xx_edma block tty bus tty0 char tty1 cmem tty10 console tty11 cpu_dma_latency tty12 disk tty13 fb tty14 fb0 tty15 fb1 tty16 fb2 tty17 full tty18 fuse tty19 i2c-1 tty2 i2c-2 tty20 initctl tty21 input tty22 kmem tty23 kmsg tty24 log tty25 loop0 tty26 loop1 tty27 loop2 tty28 loop3 tty29 loop4 tty3 loop5 tty30 loop6 tty31 loop7 tty32 mem tty33 mtd0 tty34 mtd0ro tty35 mtd1 tty36 mtd1ro tty37 mtd2 tty38 mtd2ro tty39 mtd3 tty4 mtd3ro tty40 mtdblock0 tty41 mtdblock1 tty42 mtdblock2 tty43 mtdblock3 tty44 network_latency tty45 network_throughput tty46 null tty47 port tty48 ptmx tty49 pts tty5 ram0 tty50 ram1 tty51 ram10 tty52 ram11 tty53 ram12 tty54 ram13 tty55 ram14 tty56 ram15 tty57 ram2 tty58 ram3 tty59 ram4 tty6 ram5 tty60 ram6 tty61 ram7 tty62 ram8 tty63 ram9 tty7 random tty8 rtc tty9 rtc0 ttyO0 rtc1 ttyO1 sda ttyO2 sg0 ttyS0 shm ttyS1 snd ttyS2 spidev1.1 ttyS3 spidev1.2 ubi0 spidev1.3 ubi0_0 syslinkipc_ClientNotifyMgr ubi_ctrl syslinkipc_FrameQ udev_network_queue syslinkipc_FrameQBufMgr urandom syslinkipc_GateMP v4l syslinkipc_HeapBufMP vcs syslinkipc_HeapMemMP vcs1 syslinkipc_Ipc vcsa syslinkipc_ListMP vcsa1 syslinkipc_MessageQ vga_arbiter syslinkipc_MultiProc video0 syslinkipc_NameServer video1 syslinkipc_Notify video2 syslinkipc_Osal video3 syslinkipc_ProcMgr video4 syslinkipc_RingIO video5 syslinkipc_RingIOShm video6 syslinkipc_SharedRegion watchdog syslinkipc_SyslinkMemMgr zero
codeshawn 2015-01-16
  • 打赏
  • 举报
回复
怎么设置framebuffer透明啊 我的QT对话框后面是采集的视频,我想让Qt所在的framebuffer设置成透明的,这样就能看到后面的视频了!!!不胜感激!!
codeshawn 2015-01-15
  • 打赏
  • 举报
回复
你现在设置成透明的没有啊!!!!!急求!!!!!!!!谢啦!!!!!!!
chutianya 2014-08-18
  • 打赏
  • 举报
回复
引用 16 楼 fighter0593 的回复:
我以前碰到过这个问题,后面解决思路是这样的. 比如GUI显示在fb1, 视频显示在fb0,那么在fb1导入一个bit文件(貌似有工具来做来着,也就是全绿色的方框),然后把fb1挖空了,就能显示视频了.
现在我的已经能够分层显示了。。我把视频放到fb0,Qt的GUI界面放到了fb4,出了要将每个fb设置成透明之外,还需要将QT的QWS服务器背景已经GUI本身的背景都设置成透明才能让底层视频透过来。。。 这个分层透明显示的问题我现在有了一个临时的方案,不过还是不太好。。就是我在15L贴的代码,先用这个mmap之后直接循环对每一个FB层的每一个点进行赋值,将它们的 Alpha 通道赋值为0,这样就是的每个像素点都是透明的了。。。不过这做法感觉好麻烦,不靠谱,我是现在是想知道能不能有一个什么类似ioctl的方法能够直接一个函数就能将每一fb层的 Alpha 通道搞成透明的。。。 另:纠正一下15L的一个错误说法,SX4412经测试,确实是分为5个fb,每个fb也就是对应着一个datasheet上说的window,并且这几个fb的优先级确实就是fb4>fb3>fb2>fb1>fb0,也就是fb4是在最上面的。。。
天意可违 2014-08-15
  • 打赏
  • 举报
回复
我以前碰到过这个问题,后面解决思路是这样的. 比如GUI显示在fb1, 视频显示在fb0,那么在fb1导入一个bit文件(貌似有工具来做来着,也就是全绿色的方框),然后把fb1挖空了,就能显示视频了.
chutianya 2014-08-04
  • 打赏
  • 举报
回复
还有这一段 QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0" QWS_DISPLAY=EP93xx:/dev/fb0 QWS_DISPLAY=:1:/dev/fb0 最后这一句不符合规范写法啊。。规范是: myApplication -display "<driver>[:<driver specific options>]... [:<display num>]" 那我该如何理解 :1啊,如果是display num不是要放到最后的么?
chutianya 2014-08-04
  • 打赏
  • 举报
回复
QT 官网有这么一段 export QWS_DISPLAY="Multi: QVFb:0 QVFb:offset=640,0:1 :2" ,具体这个环境变量的设置是怎么解释的我还是有点搞不清楚。。。因为我看网上有一段说明是下面这样的: 2.显示在本机上 QWS_DISPLAY=QVFb:0 冒号后面的是旋转角度。 它可以在0 90 180 270中取值,对应的屏幕就会发生旋转。 Rot90 Rot180 Rot270是规范写法 按这个说法QVFb后面的就是旋转角度。。那这样官网上的QVFb:offset=640,0:1,最后面这个:1岂不是旋转1度?不可能啊。。很奇葩。。。搞不懂这个到底是如何断句的啊,如何解释 export QWS_DISPLAY="Multi: QVFb:0 QVFb:offset=640,0:1 :2"这个字段,,后的:2是不是说有两个子驱动?
chutianya 2014-08-04
  • 打赏
  • 举报
回复
斑竹大神。。。。我设置成fb1,用这句 export QWS_DISPLAY=LinuxFb:/dev/fb1,QT GUI总是无法在LCD上显示出来。。不知道是为什么??只有当设置成 export QWS_DISPLAY=LinuxFb:/dev/fb0 才能正常显示QT GUI ,设置成其他的几个fb都不行。。。请指点下。。。
chutianya 2014-08-04
  • 打赏
  • 举报
回复
自顶。。。求围观。。。。CSDN人气不够旺啊。。。
chutianya 2014-08-04
  • 打赏
  • 举报
回复
参照友善之臂论坛里面一个帖子的例子,成功调用不同的fb,显示出不同的色块。。。程序如下:
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <sys/ioctl.h>
        #include <sys/mman.h>
        #include <fcntl.h>
        #include <stdio.h>
        #include <string.h>
        #include <linux/fb.h>
        
        
        #define    WIN0    0
        #define    WIN1    1
        #define    WIN2    2
        #define    WIN3    3
        #define    WIN4    4
        #define    WIN_MAX    5
        
        const char * fb_file_path[ WIN_MAX ] = {
        /* WIN0 */"/dev/fb3",
        /* WIN1 */"/dev/fb4",
        /* WIN2 */"/dev/fb0",
        /* WIN3 */"/dev/fb1",
        /* WIN4 */"/dev/fb2"
        };
        const int fb_x[ WIN_MAX ] = {
        /* WIN0 */500,
        /* WIN1 */400,
        /* WIN2 */300,
        /* WIN3 */200,
        /* WIN4 */100
        };
        const int fb_color[ WIN_MAX ] = {
        /* WIN0 */0x10FFFFFF,
        /* WIN1 */0x10FF0000,
        /* WIN2 */0x1000FF00,
        /* WIN3 */0x100000FF,
        /* WIN4 */0x10000000,
        };
        
        void draw_framebuffer( int win, int fd, int xres, int yres )
        {
            int i, j;
            int *p;
            int color;
            
            p = mmap( NULL, xres*yres*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0 );
            if( !p ){
                printf( "mmap failed\n" );
                return;
            }
        
            /* draw default color with alpha : all pass through*/
            for( j = 0; j < yres; j++ ){
                for( i = 0; i < xres ; i++ ){
                    *( p + j * xres + i ) = 0x00FFFFFF;
                }
            }
        
            /* draw color */
            for( j = 0; j < yres; j++ ){
                for( i = 0; i < fb_x[win] ; i++ ){
                    *( p + j * xres + i ) = fb_color[win];
                }
            }
        
            munmap( p, xres*yres*4 );
        }
        
        int main( int argc, char *argv[] )
        {
            int i;
            int ret;
            struct fb_var_screeninfo var;
            int    blank;
            int fd[ WIN_MAX ];
        
            /* initial */
            memset( fd, -1, sizeof( fd ) );
        
            /* open framebuffer */
            for( i=0; i<WIN_MAX; i++ ){
                fd[i] = open( fb_file_path[i], O_RDWR );
                if( fd[i] < 0 ){
                    printf( "open %s failed\n", fb_file_path[i] );
                    goto end;
                }
            }
            printf( "open framebuffer ok\n" );
        
            /* set screen info */
            ret = ioctl( fd[WIN2], FBIOGET_VSCREENINFO, &var );
            if( ret < 0 ){
                printf( "ioctl %s FBIOGET_VSCREENINFO failed\n", fb_file_path[WIN2] );
                goto end;
            }
        
            var.activate = FB_ACTIVATE_FORCE;
            var.yres_virtual = var.yres;
            
            for( i=0; i<WIN_MAX; i++ ){
                ret = ioctl( fd[i], FBIOPUT_VSCREENINFO, &var );
                if( ret < 0 ){
                    printf( "ioctl %s FBIOPUT_VSCREENINFO failed\n", fb_file_path[i] );
                    goto end;
                }
            }
            printf( "set screeninfo ok\n" );
        
            /* draw some color */
            for( i=0; i<WIN_MAX; i++ ){
                draw_framebuffer( i, fd[i], var.xres, var.yres );
            }
            printf( "draw color ok\n" );
        
            /* show window */
            blank = FB_BLANK_UNBLANK;
        
            for( i=0; i<WIN_MAX; i++ ){
                ret = ioctl( fd[i], FBIOBLANK, blank );
                if( ret < 0 ){
                    printf( "ioctl %s FBIOBLANK failed\n", fb_file_path[i] );
                    goto end;
                }
            }
            printf( "show window ok\n" );
        
            /* wait input */    
            getchar();
        end:
            return 0;
        }
从这段代码我发现原来手册里面说的这个几个window与fb的对应关系原来不是fb0对应win0的关系。。。具体的对应关系如下: /* WIN0 */"/dev/fb3", /* WIN1 */"/dev/fb4", /* WIN2 */"/dev/fb0", /* WIN3 */"/dev/fb1", /* WIN4 */"/dev/fb2" 优先级关系:win4>win3>win2>win1>win0,也就是win4在最上面,win0在最下面 这个例子在我的tiny4412上面显示出了几个色块。说明这几个fb都是可用的。。。 那接下来还是考虑我这个QT的GUI 如何能在显示在视频的上面的问题。。几个fb都可用。。但是为什么我将export QWS_DISPLAY=LinuxFb:/dev/fb1 就无法显示出QT GUI呢。。。奇怪啊。。只有设置成fb0才可以显示出来。。。
chutianya 2014-08-04
  • 打赏
  • 举报
回复
为了验证着几个fb的可用性。我采用了一下代码:
#include <sys/types.h>  
#include <sys/stat.h>  
#include <sys/ioctl.h>  
#include <sys/mman.h>  
#include <fcntl.h>  
#include <stdio.h>  
#include <string.h>  
#include <linux/fb.h>  
#define WIN_MAX 5  
const char * fb_file_path[5] = {  
"/dev/fb0",  
"/dev/fb1",  
"/dev/fb2",  
"/dev/fb3",  
"/dev/fb4"  
};  
int color[5] = {  
0x50ffffff,  
0x50ff0000,  
0x5000ff00,  
0x500000ff,  
0x50000000,  
};  
int main(int argc, char *argv[])  
{  
    int i,j,k;  
    int ret;  
    struct fb_var_screeninfo var;  
    int    blank;  
    int fd[5];  
    int width;  
    int height;  
    int *p[5];  
  
    /* open framebuffer */  
    for(i=0; i<WIN_MAX; i++)  
    {  
        fd[i] = open(fb_file_path[i], O_RDWR);  
        if( fd[i] < 0 )  
        {  
            printf("open %s failed\n", fb_file_path[i]);  
            goto end;  
        }  
        printf("open %s success:%d\n", fb_file_path[i],fd[i]);  
    }  
  
  
    ret = ioctl(fd[0], FBIOGET_VSCREENINFO, &var);  
    if(ret < 0)  
    {  
        printf("ioctl %s FBIOGET_VSCREENINFO failed\n", fb_file_path[0]);  
        goto end;  
    }  
    width = var.xres;  
    height = var.yres;  
    printf("width:%d,height:%d\n",width, height);  
      
    printf("set screeninfo ok\n");  
      
  
    for(i=0; i<WIN_MAX; i++)  
    {  
        p[i] = (int *)mmap(NULL, width * height * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd[i], 0);  
        if((p[i] == NULL) || (p[i] == -1))  
        {  
            printf("the mmap:%d is NULL\n",i);  
            goto end;  
        }  
    }  
    for(k = 0; k < WIN_MAX; k++)  
    {  
        for(i = 0; i < height - (k * 100); i++)  
        for(j = 0; j < width; j++)  
        {  
            p[k][i * width + j] = color[k];  
          
        }  
        printf("draw %d, 0x%08lx\n",k, color[k]);  
    }  
    while(1)  
    {  
      
        for(i = 0; i < height; i++)  
        {  
            for(j = 0; j < width; j++)  
            {  
                p[4][i * width + j] = 0x50ff0000;  
            }  
            usleep(1000);  
        }  
        for(i = 0; i < height; i++)  
        {  
            for(j = 0; j < width; j++)  
            {  
                p[4][i * width + j] = 0x00000000;  
            }  
            usleep(1000);  
        }  
              
    }  
    end:  
    return 0;  
}  
按照网上那个例子的说法应该是显示几个颜色的色条块。。。但是实际上我这只显示了fb0的颜色。。。其他的都没有出现。。。但是/dev/下面确实是存在5个fb的啊。。为什么其他的都不能在lCD上显示呢。。难道这个fb0在最上面?把其他的都给盖住了?
foruok 2014-08-04
  • 打赏
  • 举报
回复
如果你省略,Qt E 会尝试找一个可用的plugin。
chutianya 2014-08-03
  • 打赏
  • 举报
回复
视频采集显示那个进程,我的视频采集编程接口也是采用的linux的通用的视频接口V4L2,然后最后输出到fb0了。。。我尝试换到其他的fb1 fb2 等都无法显示视频。。不知道是不是哪里没设置对。。按说支持视频输出去的fb也不止是fb0一个吧。。。而且我还有一个问题。。。就是现在我是想分层显示。。等这个问题解决了我还想支持多屏显示。。也就是同时支持HDMI输出到大屏幕。。不知道还需要什么设置。。跟这个QWS_DISPLAY有没有什么关系。。。请各位大神指点下。。。
foruok 2014-08-03
  • 打赏
  • 举报
回复
可以读取每个fb的格式信息,有的视频显示不出来,也可能是你采集出来的图像格式与fb支持的不一样。比如采集的是yuv,而fb只支持rgb565
chutianya 2014-08-02
  • 打赏
  • 举报
回复
我记得友善之臂的启动脚本里面输出的环境变量配置写的是export QWS_DISPLAY=:0或者:1,不知道这个是不是指定输出到fb0或者fb1...跟斑竹的写法不太一样。。。export QWS_DISPLAY=LinuxFb:/dev/fb1。。。。。
加载更多回复(5)

16,245

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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