不囉唆, 直接看原始碼 x1.cpp:
#include <opencv2/opencv.hpp>
#include <X11/Xutil.h>
#include <stdio.h>
using namespace std;
int main(int argc, char ** argv){
XWindowAttributes x = { 0 };// x window 屬性(參數群)
auto display = XOpenDisplay(nullptr); // 打開 x window server 的顯示器
auto root = DefaultRootWindow(display); // get default root?
XGetWindowAttributes(display, root, &x);// 取得螢幕參數
int height = x.height;
int width = x.width;
auto buffer = XGetImage(display, root,
0, 0, width, height,
AllPlanes, ZPixmap
);// 全螢幕影像
int cvType = CV_8UC4;// default 4 bytes's A,R,G,B
switch (buffer->bits_per_pixel) {
case 24: cvType = CV_8UC3; break;// 3 bytes
case 16: cvType = CV_8UC2; break;// 2 bytes
case 8: cvType = CV_8UC1; break;// 1 bytes
}
const char *name = "ScreenCapture";
cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
cv::Mat m(height, width, cvType, buffer->data); // 暫時包成 cv::Mat
cv::imshow(name, m); // 顯示全螢幕影像
cv::resize(m, m, cv::Size(), 0.25, 0.25, cv::INTER_LINEAR);// 長寬各縮 1/4
XDestroyImage(buffer) ;// 釋放 buffer
XCloseDisplay(display);// 關閉 x window session
cv::imshow("1/16 Screen Shot", m); // 顯示 1/16 螢幕影像
cv::waitKey(0);
}
用 g++ 編譯並執行程式:
g++ x1.cpp -lX11 `pkg-config --cflags --libs opencv4` && ./a.out
2021年8月20日 星期五
linux 上使用 opencv 抓取螢幕影像
訂閱:
張貼留言 (Atom)
使用 pcie 轉接器連接 nvme SSD
之前 AM4 主機板使用 pcie ssd, 但主機板故障了沒辦法上網, 只好翻出以前買的 FM2 舊主機板, 想辦法讓老主機復活, 但舊主機板沒有 nvme 的界面, 因此上網買了 pcie 轉接器用來連接 nvme ssd, 遺憾的是 grub2 bootloader 無法識...
-
市面上便宜的時鐘, 內部機芯大多使用晶體振盪器產生固定頻率的脈沖去驅動 Lavet-type 步進馬達, 它只要一個 1.5V 電池就足以推動, 而馬達扭力主要是靠線圈內的電流產生磁力所致, 因此電流才是動力來源. 電壓太高會造成線圈電流飽和導致發熱,可能影響震盪頻率甚至燒毀...
-
參考資料: https://developer.android.com/training/connect-devices-wirelessly/nsd linux mint 上針對區域網路的名稱服務協定可以使用 avahi, 透過 avahi-browse -a -r 就能...
沒有留言:
張貼留言