https://blog.csdn.net/qq_44575789/article/details/127935697像素处理太慢,这里换种方式

#pragma once
#include <QDebug>
#include <QImage>
#include <QTimer>
#include <qwindowdefs.h>
#include <wtypes.h>
// opencv
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>template <typename T>
// 限定cv::Mat类型
concept MatType = std::is_same_v<T, cv::Mat>;template <typename T>
// 限定QImage类型
concept QImageType = std::is_same_v<T, QImage>;class WindowImageVideo : public QObject {Q_OBJECT;private:// 窗口句柄WId _wid;// 帧定时器QTimer* timer = nullptr;// 刷新率int _fps = 30;// 视频编码器cv::VideoWriter writer;// 写入路径QString _path;// 图片缓冲区uchar* bits = nullptr;public:void openVideo(){if (writer.isOpened()) {return;}// 视频帧率double fps = _fps;auto size = getWindowSize();// 打开视频文件bool s = writer.open(_path.toStdString(), cv::VideoWriter::fourcc('I', '4', '2', '0'), fps, cv::Size(size.width(), size.height()));qDebug() << (s ? "打开视频成功" : "打开视频失败");}// opencv图片写入视频void writeVideo(cv::Mat& mat){qDebug() << "New Frame";// 写入视频writer << mat;}void releaseVideo(){if (writer.isOpened()) {qDebug() << "Close Video";// 关闭视频文件writer.release();}}void initBuff(size_t size){if (bits == nullptr) {bits = new uchar[size];}}void releaseBuff(){if (bits != nullptr) {delete[] bits;bits = nullptr;}}public:
signals:void started();
signals:void stoped();public slots:void start(){if (timer != nullptr && timer->isActive()) {return;}openVideo();timer = new QTimer(this);QObject::connect(timer, &QTimer::timeout, this, [this]() {// 计时auto start = std::chrono::high_resolution_clock::now();cv::Mat mat;getGDIBitmap(mat);// 结束auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);qDebug() << "GetGDIBitmap:" << duration.count() << "ms";writeVideo(mat);});timer->start(1000 / _fps);}void stop(){if (timer != nullptr && timer->isActive()) {// 停止定时器timer->stop();releaseVideo();}}public:// 获取窗口大小QSize getWindowSize(){// 获取窗口大小RECT rect;GetWindowRect((HWND)_wid, &rect);return QSize(rect.right - rect.left, rect.bottom - rect.top);}template <MatType T>T bitmapTo(HBITMAP& hBitmap){return BitmapToMat(hBitmap);}template <QImageType T>T bitmapTo(HBITMAP& hBitmap){return bitmapToQImage(hBitmap);}// 获取窗体句柄窗口的图像template <typename T>void getGDIBitmap(T& image){// 获取窗口大小RECT rect;GetWindowRect((HWND)_wid, &rect);int width = rect.right - rect.left;int height = rect.bottom - rect.top;// 创建设备上下文HDC hdc = GetDC((HWND)_wid);HDC hdcMem = CreateCompatibleDC(hdc);// 创建位图HBITMAP hBitmap = CreateCompatibleBitmap(hdc, width, height);// 选择位图HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);// 拷贝图像BitBlt(hdcMem, 0, 0, width, height, hdc, 0, 0, SRCCOPY);// 释放资源SelectObject(hdcMem, hOldBitmap);DeleteDC(hdcMem);ReleaseDC((HWND)_wid, hdc);// 转换为imageimage = bitmapTo<T>(hBitmap);DeleteObject(hBitmap);}// return: W HQPair<size_t, size_t> updateBitmapToBits(HBITMAP& hBitmap){BITMAP bitmap {};GetObject(hBitmap, sizeof(BITMAP), &bitmap);BITMAPINFOHEADER bih {};bih.biSize = sizeof(BITMAPINFOHEADER);bih.biWidth = bitmap.bmWidth;bih.biHeight = bitmap.bmHeight;bih.biPlanes = 1;bih.biBitCount = 32;bih.biCompression = BI_RGB;bih.biSizeImage = 0;bih.biXPelsPerMeter = 0;bih.biYPelsPerMeter = 0;bih.biClrUsed = 0;bih.biClrImportant = 0;if (bits == nullptr) {initBuff(static_cast<size_t>(bih.biWidth) * bih.biHeight * 4);}HDC hdc = GetDC((HWND)_wid);GetDIBits(hdc, hBitmap, 0, bih.biHeight, bits, (BITMAPINFO*)&bih, DIB_RGB_COLORS);ReleaseDC((HWND)_wid, hdc);return { bih.biWidth, bih.biHeight };}//将HBITMAP转为QImageQImage bitmapToQImage(HBITMAP& hBitmap){auto&& wh = updateBitmapToBits(hBitmap);return QImage(bits, wh.first, wh.second, QImage::Format_ARGB32);}// Bitmap To Matcv::Mat BitmapToMat(HBITMAP& hBitmap){auto&& wh = updateBitmapToBits(hBitmap);return cv::Mat(wh.second, wh.first, CV_8UC4, bits);}public:WindowImageVideo(QObject* parent = nullptr): QObject(parent){QObject::connect(this, &WindowImageVideo::started, this, &WindowImageVideo::start);QObject::connect(this, &WindowImageVideo::stoped, this, &WindowImageVideo::stop);}~WindowImageVideo(){stop();releaseBuff();}void setWid(WId wid){this->_wid = wid;}void setFPS(int fps){this->_fps = fps;}WId wid(){return _wid;}int fps(){return _fps;}void setPath(QString path){this->_path = path;}QString path(){return _path;}
};

加快BITMAP像素访问速度,取代GetPixel相关推荐

  1. squid正反向代理-加快网站访问速度

    配置squid代理服务器加快网站访问速度 一:squid服务概述   Squid cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器.Squid有 ...

  2. 使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度

    碰到问题:移动用户访问web服务器www.osyunwei.com很慢 解决办法: 1.在移动机房放置一台nginx反向代理服务器 2.通过域名DNS智能解析,所有移动用户访问www.osyunwei ...

  3. 通过nginx反向代理配置,及缓存功能配置,加快CDN服务器各个节点的访问速度

    前言 若网站数据中心在国内,怎样才能加快海外访问速度呢?那就需要搭建一台CDN服务器,在海外机房,通过nginx反向代理的方式读取国内数据中心的数据,并且进行缓存.CDN服务器,及nginx反向代理配 ...

  4. [技术博客]使用CDN加快网站访问速度

    [技术博客]使用CDN加快网站访问速度 2s : most users are willing to wait 10s : the limit for keeping the user's atten ...

  5. 加快使用Google的CDN网站访问速度

    由于众所周知的原因,只需替换一个域名就可以继续使用Google提供的前端公共库了. 同样,通过script标记引用这些资源,让网站访问速度瞬间提速吧骚年! 很多网站,尤其是国外网站,为了加快网站的速度 ...

  6. 加快网站访问速度--jquery.js

    jquery现在是越来越大,网络加载速度上我们应该做到能省就省,毫无疑问google的服务器和cdn以及访问速度是非常快的,而且google敞开怀抱,提供各种代码库给我们下载调用.jquery就是其中 ...

  7. 使用hosts加快网站访问速度

    文章目录 前言 第一步:找到对应的 IP 第二步:修改 hosts 第三步:刷新 dns 缓存 github 的问题 前言 我们在浏览网页时候,有时候会发现网站响应速度比较慢,我们可以考虑利用 hos ...

  8. H5ai 更换字体库加快访问速度及相关优化

    前几天在访问我自己搭建的H5ai时,发现访问速度奇慢,通过chrome抓包发现,是谷歌字体的锅.理论上谷歌字体在国内是能正常使用的,也不知抽了什么风,下面就讲讲我的解决办法吧. 谷歌字体在国内是能正常 ...

  9. Android粒子篇之Bitmap像素级操作

    零.前言 1.粒子效果的核心有三个点:收集粒子.更改粒子.显示粒子 2.Bitmap的可以获取像素,从而得到每个像素的颜色值 3.可以通过粒子拼合一张图片,并对粒子操作完成很多意想不到的效果 4.本项 ...

最新文章

  1. 一文回顾2018英特尔人工智能大会
  2. 关于页面加载的方法收集
  3. jsp servlet table 集合list 数据 绑定
  4. 简单的家庭无线路由设置
  5. 利用Hexo搭建个人博客-博客初始化篇
  6. pytorch查看模型的可训练参数
  7. Bone collector//动态规划
  8. 菜鸟的IT道路ing (一)
  9. python-简单邮件报警
  10. windows 安装php7.4并配置phpstorm环境
  11. 局域网文件共享服务器软件,局域网文件夹加密工具哪个好?文件共享服务器软件介绍...
  12. 手机模拟门禁卡 — 手机软件教程
  13. Mac OS 开机密码重置
  14. 数仓建模—ID Mapping(下)
  15. OpenCV 读写图像、读写像素、修改像素值(案例:图像反处理)
  16. print函数 stm32_STM32 DSP库函数详解
  17. 微信支付申请资料及费率
  18. Win10 系统 C 盘飘红,6 招瞬间腾出十几 GB 空间
  19. yamaha php mt8评测,诶哟这个盒子不错哟,NUC 8i5BEK简单开箱+评测(更新完毕)
  20. 测量标准误(Standard Error of Measurement;SEm)

热门文章

  1. 基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition
  2. macOS Big Sur 11.7 (20G817) Boot ISO 原版可引导镜像
  3. 最美的十大经典爱情句子{转}
  4. 计算机音乐数字乐谱梦中的婚礼,乐谱梦中的婚礼代码是什么-天谕手游梦中的婚礼歌曲最新乐谱代码分享 - QT软件园...
  5. 南方科技大学计算机唐博,唐博 - 教师个人主页 - 南方科技大学
  6. python中怎么撤回_python如何查看微信消息撤回
  7. excel 分组求和
  8. linux注销登录用户
  9. 情人节朋友圈秀恩爱九宫格配图
  10. python三级联动菜单_Excel–这才是三级联动下拉菜单的正确做法