将 CGImage 转换为 python 图像 (pil/opencv)

2023-12-07

我想在屏幕上进行一些模式识别,并将使用 Quartz/PyObjc 库来获取屏幕截图。

我得到的屏幕截图是 CGImage。我想使用 openCV 库搜索其中的模式,但似乎找不到如何将数据转换为 opencv 可读的。

所以我想做的是:

#get screenshot and reference pattern
img = getScreenshot() # returns CGImage instance, custom function, using Quartz
reference = cv2.imread('ref/reference_start.png') #get the reference pattern

#search for the pattern using the opencv library
result = cv2.matchTemplate(screen, reference, cv2.TM_CCOEFF_NORMED)

#this is what I need
minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(result)

我不知道如何做到这一点,也无法通过谷歌找到信息。


要添加到 Arqu 的答案中,如果您的最终目标是使用 opencv 或 numpy,您可能会发现使用 np.frombuffer 而不是首先创建 PIL 图像更快,因为 np.frombuffer 与 Image.frombuffer 花费的时间大约相同,但节省了时间从图像转换为 numpy 数组的步骤(在我的机器上大约需要 100 毫秒(其他所有操作大约需要 50 毫秒))。

import Quartz.CoreGraphics as CG
from PIL import Image 
import time
import numpy as np

ct = time.time()
region = CG.CGRectInfinite

# Create screenshot as CGImage
image = CG.CGWindowListCreateImage(
    region,
    CG.kCGWindowListOptionOnScreenOnly,
    CG.kCGNullWindowID,
    CG.kCGWindowImageDefault)

width = CG.CGImageGetWidth(image)
height = CG.CGImageGetHeight(image)
bytesperrow = CG.CGImageGetBytesPerRow(image)

pixeldata = CG.CGDataProviderCopyData(CG.CGImageGetDataProvider(image))
image = np.frombuffer(pixeldata, dtype=np.uint8)
image = image.reshape((height, bytesperrow//4, 4))
image = image[:,:width,:]

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

将 CGImage 转换为 python 图像 (pil/opencv) 的相关文章

随机推荐

  • 创建 SQL Server ODBC 数据源的最简单、最可维护的方法是什么?

    我需要一种编程方式来创建 SQL Server ODBC 数据源 我可以通过直接访问注册表来做到这一点 如果可以通过可用的 SQL Server Windows API 来完成此操作 以防止注册表项或值因更新的 SQL Server 驱动程
  • ASP.NET MVC 中的@Url.Action 到action formaction?

    我一天的大部分时间都在追这个问题 有很多很棒的建议 但没有一个能解决我的所有问题 我们有一个现有的网站 其中有人将按钮 href 链接到绝对地址 我正在尝试找出一种方法来做到这一点 我已经掌握了大部分内容 但是带有样式按钮和 formact
  • 如何在Windows Phone 8中异步发送带参数的POST请求

    我想在 Windows Phone 8 环境中发送 POST 请求 我的代码运行成功 但出现 NotFound 异常 它的意思是我想发布一些数据 但我发送的是空值 所以请让我知道如何在 Windows Phone 8 环境中使用数据异步发送
  • MVC 3 项目中的奇怪异常

    我在 MVC 3 0 RC 项目中遇到奇怪的错误 看来它对我的申请不是同质应用程序域昨天还好好的 不知道有什么变化 System InvalidOperationException was unhandled by user code Me
  • 使用PHP形成跨域POST请求

    我正在尝试将数据从表单发送到 php 文件 以便我可以将其存储在数据库中 但它不起作用 表单的代码与 php 文件不在同一服务器上 因为表单将位于移动应用程序上 html div div div div
  • 是否可以在 msys /mingw 上模拟进程替换(使用 bash 3.x)

    我正在尝试使用进程替换来避免使用临时文件 我尝试了以下方法 diff lt echo a lt echo b 在 mingw32 msys 上 来自http www mingw org 截至 2013 年 12 月 并得到 sh synta
  • 将画布保存为 JSON 并将 JSON 加载到画布

    我想做到这一点 以便当我按下 保存 按钮时 文件资源管理器会打开并选择我选择保存画布 JSON 文件的位置 我还希望能够通过加载按钮加载带有 JSON 文件的画布 我该如何开始呢 任何帮助表示赞赏 我希望这就是您想要实现的目标 var ca
  • 如何将 JSON 字符串转换为字典?

    我想在我的 swift 项目中创建一个函数 将 String 转换为 Dictionary json 格式 但出现一个错误 无法转换表达式的类型 lvalue NSData options IntegerLitralConvertible
  • 我应该先学C再学C++吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 今天我参观了大学计算机科学
  • 我需要 jquery 中的脚本,使该页面成为浏览器中的默认主页网站

    我需要 jquery javascript 中的脚本 使特定站点作为浏览器中的主页 如果可能的话 我需要它与所有浏览器兼容 我并不是说它应该自动完成 thanks 在 Internet Explorer 7 及更早版本中 可以使用以下命令来
  • 为什么在 Skylake-Xeon 上写入 2 个缓存行的部分内容时,`_mm_stream_si128` 比 `_mm_storeu_si128` 慢很多?但对Haswell影响较小

    我的代码如下所示 简单加载 修改 存储 我已简化它以使其更具可读性 asm volatile vzeroupper while m128i in mm loadu si128 inptr m128i out in real code doe
  • 我可以在 PostgreSQL 中自动从带有标题的 csv 文件创建表吗?

    我在 OS X 10 6 8 上运行 PostgreSQL 9 2 6 我想将带有列标题的 CSV 文件中的数据导入到数据库中 我可以用COPY语句 但前提是我首先手动创建一个表 并为 CSV 文件中的每一列创建一个列 有什么方法可以根据
  • 相当于不依赖innerHTML的html_entity_decode的javascript?

    我正在寻找 PHP 的 javascript 版本html entity decode 我找到了这个 function html entity decode str var tarea document createElement text
  • 启动第二个 JavaFX 应用程序

    我正在尝试从 JavaFx 应用程序中启动 JavaFx 应用程序 但看起来 Application launch 只能调用一次 这是否意味着我必须启动一个单独的 JVM 如 exec java 或者还有其他方法吗 更多背景信息 我希望我的
  • 从函数中的列表中返回项目。蟒蛇[重复]

    这个问题在这里已经有答案了 my list a b c def func input for i in input print i print func my list Output a b c None 我不想要 无 所以如何执行一行代码
  • UIScrollView 不随 UItextfields 一起滚动

    我正在制作一个普通视图 用户可以在其中更新他们的个人资料 我按照以下步骤制作了该视图 创建了一个新的UIViewController带有 xib 文件 Added a UIScrollView在超级视图中 添加了近9个UITextField
  • 使用 .onLoad 加载依赖包

    我的包需要 ggplot2 包 但我无法修复运行 R CMD 检查时得到的以下注释 no visible global function definition for qplot library or require call not de
  • 这个比较器是如何工作的?

    package vehicles order import java util ArrayList import java util Collections import java util Iterator public class ve
  • 理解 let 与 var 提升 [重复]

    这个问题在这里已经有答案了 With let vs var我了解到主要区别在于 let 变量的作用域为最近的块并且不会被提升 也让变量可以重新赋值 但不能在同一作用域内重新声明 那么为什么这段代码会返回 未定义 错误呢 let x 10 i
  • 将 CGImage 转换为 python 图像 (pil/opencv)

    我想在屏幕上进行一些模式识别 并将使用 Quartz PyObjc 库来获取屏幕截图 我得到的屏幕截图是 CGImage 我想使用 openCV 库搜索其中的模式 但似乎找不到如何将数据转换为 opencv 可读的 所以我想做的是 get