OpenCV 代码在 C++ 中使用的 CPU 比 Python 多

2023-12-26

我正在研究 python 和C++,但我还是缺乏经验。我捕获两种语言的窗口图像并将其转换为hsv format.结果如下:

Python: %5-9 CPU / 67-72 FPS

C++: %45-50 CPU / 28-35 FPS

我在某个地方犯了错误,这是肯定的。如果我不将结果转换为hsv format我得到的几乎相同fps and cpu使用量但仍处于C++ more.

C++:

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <Windows.h>

using namespace std;
using namespace cv;

Mat hwnd2mat(HWND hwnd) {
    HDC hwindowDC, hwindowCompatibleDC;

    int height, width, imgheight, imgwidth;
    HBITMAP hbwindow;
    Mat img;
    BITMAPINFOHEADER  bi;

    hwindowDC = GetDC(hwnd);
    hwindowCompatibleDC = CreateCompatibleDC(hwindowDC);
    SetStretchBltMode(hwindowCompatibleDC, COLORONCOLOR);

    RECT windowsize; 
    GetClientRect(hwnd, &windowsize);

    imgheight = windowsize.bottom;
    imgwidth = windowsize.right;
    height = windowsize.bottom / 1;  
    width = windowsize.right / 1;

    img.create(height, width, CV_8UC4);

    hbwindow = CreateCompatibleBitmap(hwindowDC, width, height);
    bi.biSize = sizeof(BITMAPINFOHEADER);  
    bi.biWidth = width;
    bi.biHeight = -height; 
    bi.biPlanes = 1;
    bi.biBitCount = 32;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;

    SelectObject(hwindowCompatibleDC, hbwindow);
    StretchBlt(hwindowCompatibleDC, 0, 0, width, height, hwindowDC, 0, 0, imgwidth, imgheight,     SRCCOPY); //change imgCOPY to NOTimgCOPY for wacky colors !
    GetDIBits(hwindowCompatibleDC, hbwindow, 0, height, img.data, (BITMAPINFO*)&bi, DIB_RGB_COLORS);  //copy from hwindowCompatibleDC to hbwindow

    DeleteObject(hbwindow);
    DeleteDC(hwindowCompatibleDC);
    ReleaseDC(hwnd, hwindowDC);

    return img;
}

int main() {
    Mat imgBGR, imgHSV;
    HWND hwnd = FindWindowA(NULL, "Dragon Age: Origins");

    while (1) {

        Mat img = hwnd2mat(hwnd);
        cvtColor(img, imgHSV, COLOR_BGR2HSV);
        imshow("Capture Window C++", imgHSV);
        waitKey(1);
    }
}

Python:

import win32gui, win32ui, win32con
import cv2 as cv
import numpy as np

def captureWindow(window_name):
    hwnd = win32gui.FindWindow(None, window_name)


    window_rect = win32gui.GetWindowRect(hwnd)
    w = window_rect[2] - window_rect[0]
    h = window_rect[3] - window_rect[1]

    border_pixels = 3
    titlebar_pixels = 28
    w = w - (border_pixels * 2)
    h = h - titlebar_pixels - border_pixels
    cropped_x = border_pixels
    cropped_y = titlebar_pixels

    wDC = win32gui.GetWindowDC(hwnd)
    dcObj = win32ui.CreateDCFromHandle(wDC)
    cDC = dcObj.CreateCompatibleDC()
    dataBitMap = win32ui.CreateBitmap()
    dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
    cDC.SelectObject(dataBitMap)
    cDC.BitBlt((0, 0), (w, h), dcObj, (cropped_x, cropped_y), win32con.SRCCOPY)

    signedIntsArray = dataBitMap.GetBitmapBits(True)
    img = np.fromstring(signedIntsArray, dtype='uint8')
    img.shape = (h, w, 4)


    dcObj.DeleteDC()
    cDC.DeleteDC()
    win32gui.ReleaseDC(hwnd, wDC)
    win32gui.DeleteObject(dataBitMap.GetHandle())

    return img

while (1):

    img = captureWindow("Dragon Age: Origins")
    imgBGR = cv.cvtColor(img, cv.COLOR_BGRA2BGR)
    imgHSV = cv.cvtColor(imgBGR, cv.COLOR_BGR2HSV)

    cv.imshow("Capture Window Python", imgHSV)

    cv.waitKey(1)

如果您有帮助,我会很高兴。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV 代码在 C++ 中使用的 CPU 比 Python 多 的相关文章

随机推荐

  • 覆盖css文件中的定义

    我有一个 css 文件 它定义了所有样式 tags 像这样 p 我怎样才能写一个在包含具有默认样式的样式表的页面中 没有简单的方法可以做到这一点 不过 有一些常见的技巧可以模拟这种行为 最好使用的方法取决于被覆盖区域的复杂程度以及您想要执行
  • 适用于 GAE 的 Weasyprint Dockerfile

    我正在尝试在 gae 上安装 weasyprint 我知道我们可以通过将运行时从 python 更改为 app yaml 中的自定义来将其传递到 Dockerfile 中来安装外部库 我在为 weasyprint 库创建 Dockerfil
  • Flink:是否有另一种方法来计算平均值和状态变量而不是使用 RichAggregateFunction?

    我不确定必须使用哪个流 Flink 转换来计算某个流的平均值并在 5 秒的窗口内更新状态 假设它是我的状态的整数数组 如果我使用RichFlatMapFunction我可以计算平均值并更新我的数组状态 但是 我必须打电话 streamSou
  • 如何修复“无法识别的 Guid 格式”

    如果我单击以下文件类型 我在 VS 2013 中不断收到此错误 cs cshtml config asax html 我最近刚刚更新到 Visual Studio 2013 Update 2 并修复了兼容性问题以始终运行 devenv ex
  • 如何使用 Meteor 更新插入

    让我的 Meteor upsert 功能正常工作时遇到了一些问题 我相当新 200 行代码 并且遇到了一些麻烦 该集合不断插入额外的行 而不仅仅是更新 我花了过去 30 分钟谷歌搜索 但找不到任何我能理解的例子 这是我的代码 Values
  • 在 Python 中创建菜单 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在用 python 制作一个菜单 需要 打印带有编号选项的菜单 让用户输入编号选项 根据用户选择的选项号 运行特定于该操作的函数 现在
  • 为什么 rspec 没有获取我的规范/支持文件?

    我有一个奇怪的错误 我的spec support文件夹中有一个utilities rb文件来保存一些辅助功能 例如登录方法 规范 支持 utilities rb include ApplicationHelper def sign in u
  • Django REST Framework - 在序列化器测试中设置请求?

    我构建了一个 Web 应用程序 其中后端是使用 Django REST Framework 实现的 现在我正在编写单元测试 并且在测试序列化器方法时遇到了问题 这是我正在努力解决的序列化器方法的一个示例 def get can edit s
  • 学习 Java 编程最重要的事情是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对面向对象编程有很好的理解 但我已经有一段时间没有编程了 我想再学一遍 Java 编程的哪些最重要的方面是必须学习的 这样我才能将自己定位为一
  • jdk/jmods中的jmods目录在应用程序运行时有什么作用吗?

    我有一个使用 OpenJDK 在沙箱环境中运行的应用程序 JDK目录中有一个jmods文件夹 关于 jmods 的文档不是很好 据我了解 如果我想使用 JLink 创建另一个自定义 JRE jmods 很有用 假设我不想这样做 只想拥有一个
  • 负载测试苹果推送通知服务器应用程序

    我开发了一个服务器应用程序 可以将推送消息发送到苹果服务器 我已经用几个设备对其进行了测试 并且能够在设备上获取消息 问题是 当我的数据库中有大约一百万台设备时 我无法知道我的应用程序将如何执行 在这种情况下有没有办法对您的服务器应用程序进
  • WMD Markdown 编辑器 - HTML 到 Markdown 的转换

    我在用wmd http wmd editor com 在做一个项目的markdown编辑器时 有一个问题 当我发布包含 markdown 文本区域的表单时 它 如预期 将 html 发布到服务器 但是 假设服务器端验证失败 我需要将用户发送
  • 为什么 Array#each 返回具有相同元素的数组?

    我正在学习如何做的细节each在 ruby 中工作 我尝试了以下代码行 p 1 2 3 4 5 each element el 结果是一个数组 1 2 3 4 5 为什么返回值是each相同的数组 没有each只是提供一种迭代方法 或者这只
  • 使用 Doctrine 2 强制编码和解码

    我正在与遗产一起工作大泥球 http en wikipedia org wiki Big ball of mud使用一个latin1数据库但适用于utf8字符串 每次应用程序读取或写入数据库时 它都会进行解码或编码by hand和商店utf
  • 在 NHibernate 中使用 Enterprise Library 日志记录应用程序块

    我们正在尝试将 NHibernate 集成为我们的 OR M 但是 我们目前正在使用 Enterprise Library 的日志记录应用程序块 我知道NHibernate使用log4net来记录日志 有谁有关于如何使用 Enterpris
  • ASMX Web 服务 - “此 Web 服务使用 http://tempuri.org/ 作为其默认命名空间。”消息 - 但不应该是这样

    我已经使用 Visual Studio 创建了一个 Web 服务 2005 年 我知道我很守旧 一切都编译得很好 但当它打开时 我收到警告 此 Web 服务不符合 WS I Basic Profile v1 1 而且 该网络服务正在使用ht
  • 在 Java 中运行 Bash 命令

    我有以下课程 它允许我通过java执行命令 public class ExecuteShellCommand public String executeCommand String command StringBuffer output n
  • 使用 Azure DevOps REST API 创建管道失败,并出现错误“未指定池”

    使用 Azure DevOps REST API 创建管道时 不会创建管道 我用过 创建 Rest API https learn microsoft com en us rest api azure devops pipelines pi
  • 我需要将 SQL 本机放入查询生成器 Doctrine2 中

    我需要在查询生成器学说 2 中使用 SQL NATIVE 来使用 SQL 函数 CONCAT REPLACE LDAP 请帮我 您可以尝试 connection this gt get doctrine gt getConnection t
  • OpenCV 代码在 C++ 中使用的 CPU 比 Python 多

    我正在研究 python 和C 但我还是缺乏经验 我捕获两种语言的窗口图像并将其转换为hsv format 结果如下 Python 5 9 CPU 67 72 FPS C 45 50 CPU 28 35 FPS 我在某个地方犯了错误 这是肯