如何在Linux下截图(高fps)(编程)

2024-09-30 22:27:15 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我想说的是,我已经读了很多关于这方面的文章,并且我已经学会了很多方法来做到这一点,但是我还没有能够在linux下做到这一点。在

我的项目是arduino的ambilight,所以我需要拍一张桌面的屏幕截图并分析它的颜色。在

一开始我用Processing 2.0和类“Robot”fromjava.awt文件'. 一开始我可以拍5帧每秒,然后我得到了13帧每秒。这很管用,但我想要更多的表现,所以我开始阅读。在

在Windows或Mac中,你有一些库可以让你直接访问“frameBuffer”,所以你可以非常“简单”而且非常快速地获取屏幕截图。在

在Ubuntu中我尝试过python和Gtk,PIL,Qt。。。15GTI也是最快的。在

我的问题是:我想跨平台实现它,但我更喜欢我的程序一开始在Linux下运行,然后在Windows下运行(我不太喜欢:p)。在

所以,第一个问题:python能够提供这种性能吗?因为我认为C++是一个更好的选择。在

第二个问题:我需要做什么?我读过关于Xlib(X11)的文章,但是我找不到让我截图的文档。我也知道,例如,FFmpeg是一个功能强大的工具,但我不知道如何实现它。在

我希望你能帮助我(如果我犯了什么错误,请原谅)。在


Tags: 项目方法屏幕颜色linuxwindows文章robot
1条回答
网友
1楼 · 发布于 2024-09-30 22:27:15

使这项工作跨平台进行可能需要相当多的工作。如果你的最终目标是windows,那么为什么不使用amblone项目呢,它似乎正是你想要的呢?在

http://amblone.com/guide

无论如何,这里有一个使用ffmpeg&graphicsmagick的解决方案,速度非常快(在我的i7 8GB笔记本电脑上)。ffmpeg只捕获一个屏幕,将其缩小到最小的正方形大小,将输出通过管道传输到graphicsmagick convert,然后将其调整为1x1像素,然后报告图像的rgb值。在

#!/bin/bash

mkfifo /tmp/screencap.fifo

while true
    do
        # this version will send the info to a fifo
        # ffmpeg -y -loglevel error -f x11grab -s 1920x1080 -i :0.0 -s 32x32 \
        # -vframes 1 -f image2 -threads 2 - |  gm convert - -resize 1x1 \
        # txt:- > /tmp/screencap.fifo

        # this version will write out the info to the command line
        # and will show you what is going on.
        ffmpeg -y -loglevel error -f x11grab -s 1920x1080 -i :0.0 -s 32x32 \
         -vframes 1 -f image2 -threads 2 - |  gm convert - -resize 1x1 txt:-
    done
exit

这将为您提供如下内容:

^{pr2}$

0,0是被读取像素的位置。括号中的数字分别是R、G、B值,末尾的数字是典型的html格式的十六进制值。在上面的例子中只有1个像素,但是您可以(如果您希望将基数方向作为通用的RGB值)简单地将上面的-resize 1x1部分改为-resize 3x3,您将得到如下结果:

0,0: ( 62, 63, 65) #3E3F41
1,0: ( 90, 90, 91) #5A5A5B
2,0: (104,105,106) #68696A
0,1: ( 52, 51, 52) #343334
1,1: ( 60, 60, 59) #3C3C3B
2,1: ( 64, 64, 64) #404040
0,2: ( 49, 49, 50) #313132
1,2: ( 60, 60, 60) #3C3C3C
2,2: ( 65, 65, 65) #414141

我会让你把这些信息传给你的阿杜诺。在

ffmpeg很好,但是您必须记住将屏幕捕获位(在我的示例中-f x11grab)切换到windows系统使用的任何位置。下面是一个SO link,它将更详细地介绍。在

如果你真的坚持要做一些跨平台的东西,那么我建议你使用python绑定的openCV并使用帧缓冲设备作为视频输入,将结果缩小到1x1像素,并使用产生的平均颜色来驱动pwm通过某种UDP广播。在

相关问题 更多 >