簡體   English   中英

如何在Linux中編程截圖(高fps)(編程)

[英]How to take screenshot (high fps) in Linux (programming)

首先,我想說我已經閱讀了很多關於這個的內容,並且我已經學到了很多方法,但是我還沒能在linux上做到這一點。

我的項目是arduino的流光溢彩,所以我需要截取桌面的截圖並分析它的顏色。

一開始我使用Processing 2.0和'java.awt'中的'Robot'類。 最初我可以每秒拍攝5幀,然后我得到13幀。 這有效,但我想要更多性能,所以我開始閱讀。

在Windows或Mac中,您可以使用庫直接訪問'frameBuffer',因此您可以非常“輕松”地截取屏幕截圖。

在Ubuntu中我用Gtk,PIL,Qt嘗試過python ......最快的方法是GTK,但我也只有大約15fps。

我的問題是:我想跨平台做,但我更喜歡我的程序在開始時在Linux中工作,然后在Windows中工作(我不太喜歡它:P)。

那么,第一個問題:python是否能夠提供這種性能? 因為我認為C ++可以是更好的選擇。

第二個問題:我需要做什么? 我讀過關於Xlib(X11)但我找不到讓我截取屏幕截圖的文檔。 我也知道,例如,FFmpeg是一個強大的工具,但我不知道如何實現它。

我希望你能幫助我(如果我犯了任何錯誤,請原諒我)。

使這項工作跨平台可能是相當多的工作。 如果您的最終目標是Windows,那么為什么不使用amblone項目,這似乎完全符合您的要求?

http://amblone.com/guide

無論如何,這里有一個ffmpeg和graphicsmagick的解決方案非常快(在我的i7 8GB筆記本電腦上)。 ffmpeg只捕獲一個屏幕,將其縮小到它可以的最小方塊大小,將輸出管道傳輸到graphicsmagick轉換,將其大小調整為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

這將為您提供以下內容:

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設備作為視頻輸入,將結果縮小到1x1像素並使用生成的顏色平均值來驅動你的pwm通過一些UDP廣播的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM