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

首先我想说的是,我一直在阅读很多关于这方面的知识,而且我已经学会了很多方法来做到这一点,但是我一直无法在Linux中做到这一点。

我的项目是arduino的stream光溢彩,所以我需要截取桌面并分析它的颜色。

在开始时,我使用了来自“java.awt”的类“Robot”的Processing 2.0。 最初我可以每秒5帧,然后我有13fps。 这工作,但我想要更多的性能,所以我开始阅读。

在Windows或Mac中,您可以使用库直接访问“frameBuffer”,因此您可以非常简单,快速地截取屏幕截图

在Ubuntu中,我已经尝试了与Gtk,PIL,Qt的Python …最快的方法是GTK,但我也只能有大约15fps。

我的问题是:我想跨平台,但我更喜欢我的程序在Linux的一开始,然后在Windows(我不喜欢它太多:P)。

那么,第一个问题是python能够提供这种性能吗? 因为我认为C ++可以是更好的select。

第二个问题:我需要做什么? 我已经阅读了关于Xlib(X11),但我找不到让我截图的文档。 另外我知道,例如,FFmpeg是一个强大的工具,但我不知道如何实现它。

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

Solutions Collecting From Web of "如何在Linux(编程)采取截图(高fps)"

使这个跨平台的工作可能是相当多的工作。 如果你的最终目标是Windows,那么为什么不使用amblone项目,这似乎是你想要的?

http://amblone.com/guide

无论如何,这里是一个与ffmpeg&graphicsmagick相当快的解决方案(在我的i7 8GB笔记本电脑上)。 ffmpeg只捕获一个屏幕,将其减小到最小的正方形大小,将输出传输到graphicsmagick转换,其中将其大小调整为1×1像素,然后报告图像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 

这会给你如下的东西:

 0,0: ( 62, 63, 63) #3E3F3F 0,0: (204,205,203) #CCCDCB 0,0: ( 77, 78, 76) #4D4E4C 

0,0是正在读取的像素的位置。 括号中的数字是相应的R,G,B值,最后的数字是典型的html-esque十六进制值。 在上面的例子中,只有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 

我会留给你把这些信息传递给你的arduino。

ffmpeg非常棒,但是你必须记得把你的windows系统使用的屏幕截图(在我的例子中是-f x11grab )切换出来。 这里是一个SO链接 ,进一步详细一点。

如果你真的坚持要做跨平台的东西,那么我建议你用python绑定插件来使用openCV,然后使用framebuffer设备作为视频输入,把结果缩小到1×1像素,然后使用结果颜色平均值来驱动你的pwm UDP广播的类型。