最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV實現簡單錄屏功能

 更新時間:2022年01月19日 15:16:42   作者:蓬?蒿?人  
這篇文章主要為大家詳細介紹了OpenCV實現簡單錄屏功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了OpenCV實現簡單錄屏功能的具體代碼,供大家參考,具體內容如下

OpenCV中VideoCapture和VideoWriter用于讀寫視頻文件,這里的錄屏功能用到VideoWriter,用于將捕獲的屏幕的每一幀數據保存到視頻文件。

VideoWriter寫視頻文件的步驟

1、bool open(const String& filename, int fourcc, double fps,Size frameSize, bool isColor = true);
2、void write(InputArray image);或者VideoWriter& operator << (const Mat& image);
3、void release();

下列代碼用于獲取屏幕的截圖

int width = GetSystemMetrics(SM_CXSCREEN);
int height = GetSystemMetrics(SM_CYSCREEN);
HDC hdcScreen = GetDC(NULL);
HDC hdcMemDC = CreateCompatibleDC(hdcScreen);
HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen, width, height);
?
BITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = width;
bi.bmiHeader.biHeight = height;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = 0;
bi.bmiHeader.biXPelsPerMeter = 0;
bi.bmiHeader.biYPelsPerMeter = 0;
bi.bmiHeader.biClrUsed = 0;
bi.bmiHeader.biClrImportant = 0;
SelectObject(hdcMemDC, hbmScreen);
int lineBytes = ((width * bi.bmiHeader.biBitCount + 31) / 32) * 4;//每行字節(jié)數必須是4字節(jié)的整數倍
int bmpSize = lineBytes * height;
char* lpbitmap = new char[bmpSize];
BitBlt(hdcMemDC, 0, 0, width, height, hdcScreen, 0, 0, SRCCOPY);
GetDIBits(hdcMemDC, hbmScreen, 0, height, lpbitmap, &bi, DIB_RGB_COLORS);

lpbitmap為屏幕的像素顏色數據,下列代碼將lpbitmap作為一幀寫到視頻中(假設VideoWriter為已正常打開的VideoWriter實例)

cv::Mat bmpMat(height, width, CV_8UC3);
for (int i = 0; i < height; i++)
{
? ? int srcIndex = (height-i-1) * lineBytes;
? ? int destIndex = i * width * 3;
? ? memcpy(&bmpMat.data[destIndex],&lpbitmap[srcIndex],width*3);
}
videoWriter.write(bmpMat);//或videoWriter << bmpMat;

因為lpbitmap中的數據是從左下角到右上角排列,而視頻幀圖像的數據是從左上角到右下角排列,所以要將數據按行上下翻轉,即lpbitmap第一行對應視頻圖像的最后一行。另外BMP圖像數據每行的字節(jié)數必須是4字節(jié)的整數倍,而寫入視頻的Mat數據沒有這個要求,即每行數據大小是圖像實際寬度乘以每個顏色占用的字節(jié)數,所以實際每行拷貝的數據是width*3節(jié)字。

下面是一段測試代碼,這里只錄制100幀,實際使用中可通過命令行參數、快捷鍵或按鈕等自行決定開始和結束時間,幀率這里也設為固定的25,其實也應該根據具體形況設定合適的值。最后別忘了將opencv_ffmpegXXX.dll文件放到可執(zhí)行文件目錄下。

#include<windows.h>
#include"opencv2/opencv.hpp"
int main()
{
?
? ? cv::VideoWriter videoWriter;
? ? double fps = 25;
? ? int codec = cv::VideoWriter::fourcc('m', 'p', '4', 'v');
? ? int width = ?GetSystemMetrics(SM_CXSCREEN);
? ? int height = GetSystemMetrics(SM_CYSCREEN);
?
? ? time_t seconds = time(0);
? ? int s = seconds % 60;
? ? int m = (seconds % 3600) / 60;
? ? int h = (seconds % (3600 * 24)) / 3600 + 8;
? ? char timeBuf[128] = { 0 };
? ? sprintf_s(timeBuf, "CaptureScreen-%d-%d-%d.mp4", h, m, s);
? ? cv::String filePath = timeBuf;
? ? videoWriter.open(filePath, codec, fps, cv::Size(width, height), true);
? ? if (!videoWriter.isOpened())
? ? {
? ? ? ? return -1;
? ? }
?
? ? HDC hdcScreen = GetDC(NULL);
? ? HDC hdcMemDC = CreateCompatibleDC(hdcScreen);
? ? HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen, width, height);
?
? ? BITMAPINFO bi;
? ? bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
? ? bi.bmiHeader.biWidth = width;
? ? bi.bmiHeader.biHeight = height;
? ? bi.bmiHeader.biPlanes = 1;
? ? bi.bmiHeader.biBitCount = 24;
? ? bi.bmiHeader.biCompression = BI_RGB;
? ? bi.bmiHeader.biSizeImage = 0;
? ? bi.bmiHeader.biXPelsPerMeter = 0;
? ? bi.bmiHeader.biYPelsPerMeter = 0;
? ? bi.bmiHeader.biClrUsed = 0;
? ? bi.bmiHeader.biClrImportant = 0;
? ? SelectObject(hdcMemDC, hbmScreen);
?
? ? int lineBytes = ((width * bi.bmiHeader.biBitCount + 31) / 32) * 4;
? ? int bmpSize = lineBytes * height;
? ? char* lpbitmap = new char[bmpSize];
? ? cv::Mat bmpMat(height, width, CV_8UC3);
? ? for (int i=0;i<100;i++)
? ? {
? ? ? ? if (BitBlt(hdcMemDC, 0, 0, width, height, hdcScreen, 0, 0, SRCCOPY))
? ? ? ? {
? ? ? ? ? ? GetDIBits(hdcMemDC, hbmScreen, 0, height, lpbitmap, &bi, DIB_RGB_COLORS);
? ? ? ? ? ? for (int i = 0; i < height; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? int srcIndex = (height-i-1) * lineBytes;
? ? ? ? ? ? ? ? int destIndex = i * width * 3;
? ? ? ? ? ? ? ? memcpy(&bmpMat.data[destIndex],&lpbitmap[srcIndex],width*3);
? ? ? ? ? ? }
? ? ? ? ? ? videoWriter.write(bmpMat);//videoWriter << bmpMat;
? ? ? ? }
? ? }
? ? delete[] lpbitmap;
? ? if (videoWriter.isOpened())
? ? {
? ? ? ? videoWriter.release();
? ? }
? ? return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

  • 關于c++11與c風格路徑拼接的速度對比

    關于c++11與c風格路徑拼接的速度對比

    這篇文章主要介紹了關于c++11與c風格路徑拼接的速度對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • error LNK2019: 無法解析的外部符號 問題的解決辦法

    error LNK2019: 無法解析的外部符號 問題的解決辦法

    error LNK2019: 無法解析的外部符號 問題的解決辦法,需要的朋友可以參考一下
    2013-05-05
  • C++?拷貝構造函數與賦值的區(qū)別

    C++?拷貝構造函數與賦值的區(qū)別

    拷貝構造函數和賦值函數非常容易混淆,本文主要介紹了C++?拷貝構造函數與賦值的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • C語言實現奇數階魔方陣的方法

    C語言實現奇數階魔方陣的方法

    這篇文章主要介紹了C語言實現奇數階魔方陣的方法,涉及數組及相關數學函數的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • C語言超全面講解字符串函數

    C語言超全面講解字符串函數

    字符串函數(String?processing?function)也叫字符串處理函數,指的是編程語言中用來進行字符串處理的函數,如C,pascal,Visual以及LotusScript中進行字符串拷貝,計算長度,字符查找等的函數
    2022-06-06
  • 深入理解c/c++ 內存對齊

    深入理解c/c++ 內存對齊

    這篇文章主要介紹了c/c++ 內存對齊,有需要的朋友可以參考一下
    2014-01-01
  • C語言修煉之路一朝函數思習得?模塊思維世間生上篇

    C語言修煉之路一朝函數思習得?模塊思維世間生上篇

    函數是一組一起執(zhí)行一個任務的語句。每個?C?程序都至少有一個函數,即主函數?main()?,所有簡單的程序都可以定義其他額外的函數
    2022-03-03
  • C 語言編寫一個計算器界面(可視化界面和多功能)

    C 語言編寫一個計算器界面(可視化界面和多功能)

    今天給大家分享一個計算器功能,主要功能有加法減法乘除法求余功能,用戶可以在主菜單選擇需要計算的功能,接下來根據用戶輸入的數字進行計算輸出結果,喜歡的朋友拿去用吧
    2021-06-06
  • C語言中的自定義類型之結構體與枚舉和聯合詳解

    C語言中的自定義類型之結構體與枚舉和聯合詳解

    今天我們來學習一下自定義類型,自定義類型包括結構體、枚舉、聯合體,小編覺得挺不錯的,現在就分享給大家,也給大家做個參考
    2022-06-06
  • C++ abs函數實際應用詳解

    C++ abs函數實際應用詳解

    本文我們來講C++的abs函數以及實戰(zhàn)運用,C++中的abs函數。在C++中使用abs函數要注意存在兩種版本,一種是在stdlmb.h中定義的版本,另一個是在cmath頭文件中定義的。夷實上在stdlib.h文件是C的函數,而cmath中的是C++版本
    2022-08-08

最新評論

平乡县| 老河口市| 五峰| 洪湖市| 弥渡县| 瑞丽市| 谢通门县| 龙陵县| 甘德县| 潮安县| 慈利县| 小金县| 垦利县| 亳州市| 灵璧县| 怀来县| 建始县| 陈巴尔虎旗| 大田县| 广宗县| 延川县| 新昌县| 出国| 延长县| 武冈市| 永德县| 文昌市| 新河县| 唐河县| 淳化县| 旌德县| 玉溪市| 石门县| 雷波县| 海安县| 乌兰县| 嘉祥县| 鄂托克前旗| 宁蒗| 上栗县| 南康市|