首先,我想说的是,我已经读了很多关于这方面的文章,并且我已经学会了很多方法来做到这一点,但是我还没有能够在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是一个功能强大的工具,但我不知道如何实现它。在
我希望你能帮助我(如果我犯了什么错误,请原谅)。在
使这项工作跨平台进行可能需要相当多的工作。如果你的最终目标是windows,那么为什么不使用amblone项目呢,它似乎正是你想要的呢?在
http://amblone.com/guide
无论如何,这里有一个使用ffmpeg&graphicsmagick的解决方案,速度非常快(在我的i7 8GB笔记本电脑上)。ffmpeg只捕获一个屏幕,将其缩小到最小的正方形大小,将输出通过管道传输到graphicsmagick convert,然后将其调整为1x1像素,然后报告图像的rgb值。在
这将为您提供如下内容:
^{pr2}$0,0是被读取像素的位置。括号中的数字分别是R、G、B值,末尾的数字是典型的html格式的十六进制值。在上面的例子中只有1个像素,但是您可以(如果您希望将基数方向作为通用的RGB值)简单地将上面的
-resize 1x1
部分改为-resize 3x3
,您将得到如下结果:我会让你把这些信息传给你的阿杜诺。在
ffmpeg很好,但是您必须记住将屏幕捕获位(在我的示例中
-f x11grab
)切换到windows系统使用的任何位置。下面是一个SO link,它将更详细地介绍。在如果你真的坚持要做一些跨平台的东西,那么我建议你使用python绑定的openCV并使用帧缓冲设备作为视频输入,将结果缩小到1x1像素,并使用产生的平均颜色来驱动pwm通过某种UDP广播。在
相关问题 更多 >
编程相关推荐