亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

OpenCV實現(xiàn)簡單錄屏功能

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

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

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

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é)數(shù)必須是4字節(jié)的整數(shù)倍
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為屏幕的像素顏色數(shù)據(jù),下列代碼將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中的數(shù)據(jù)是從左下角到右上角排列,而視頻幀圖像的數(shù)據(jù)是從左上角到右下角排列,所以要將數(shù)據(jù)按行上下翻轉(zhuǎn),即lpbitmap第一行對應視頻圖像的最后一行。另外BMP圖像數(shù)據(jù)每行的字節(jié)數(shù)必須是4字節(jié)的整數(shù)倍,而寫入視頻的Mat數(shù)據(jù)沒有這個要求,即每行數(shù)據(jù)大小是圖像實際寬度乘以每個顏色占用的字節(jié)數(shù),所以實際每行拷貝的數(shù)據(jù)是width*3節(jié)字。

下面是一段測試代碼,這里只錄制100幀,實際使用中可通過命令行參數(shù)、快捷鍵或按鈕等自行決定開始和結束時間,幀率這里也設為固定的25,其實也應該根據(jù)具體形況設定合適的值。最后別忘了將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;
}

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

您可能感興趣的文章:

相關文章

  • C語言中有哪些字符處理函數(shù)你知道嗎

    C語言中有哪些字符處理函數(shù)你知道嗎

    這篇文章主要為大家詳細介紹了C語言字符處理函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言中對文件最基本的讀取和寫入函數(shù)

    C語言中對文件最基本的讀取和寫入函數(shù)

    這篇文章主要介紹了C語言中對文件最基本的讀取和寫入函數(shù),是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08
  • QT實現(xiàn)多文件拖拽獲取路徑的方法

    QT實現(xiàn)多文件拖拽獲取路徑的方法

    這篇文章主要為大家詳細介紹了QT實現(xiàn)多文件拖拽獲取路徑的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Qt圖形圖像開發(fā)之曲線圖表模塊QChart庫讀取/設置X軸的顯示區(qū)間

    Qt圖形圖像開發(fā)之曲線圖表模塊QChart庫讀取/設置X軸的顯示區(qū)間

    這篇文章主要介紹了Qt圖形圖像開發(fā)之曲線圖表模塊QChart庫讀取/設置X軸的顯示區(qū)間,需要的朋友可以參考下
    2020-03-03
  • C++中的拷貝構造函數(shù)詳解

    C++中的拷貝構造函數(shù)詳解

    大家好,本篇文章主要講的是C++中的拷貝構造函數(shù)詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C++ 中類的拷貝、賦值、銷毀的實例詳解

    C++ 中類的拷貝、賦值、銷毀的實例詳解

    這篇文章主要介紹了C++ 中類的拷貝、賦值、銷毀的實例詳解的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C++二級指針和指針的引用

    C++二級指針和指針的引用

    這篇文章主要介紹了C++二級指針和指針的引用,下文舉例實現(xiàn)形參指針改變實參指針所指向的對象,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-03-03
  • c語言排序之歸并排序(遞歸和非遞歸)

    c語言排序之歸并排序(遞歸和非遞歸)

    這篇文章主要介紹了?c語言排序之歸并排序(遞歸和非遞歸),歸并就是把兩個或多個序列合并,本文主要介紹二路歸并,下文相關資料需要的小伙伴可以參考一下
    2022-04-04
  • C++基于棧實現(xiàn)鐵軌問題

    C++基于棧實現(xiàn)鐵軌問題

    這篇文章主要介紹了C++基于棧實現(xiàn)鐵軌問題,實例分析了C++使用棧實現(xiàn)鐵軌問題的思路與解決方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • c++實現(xiàn)堆排序的示例代碼

    c++實現(xiàn)堆排序的示例代碼

    本文主要介紹了c++實現(xiàn)堆排序的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02

最新評論