将数据从 glReadPixels() 转换为 OpenCV::Mat

2024-01-07

我想从动画中获取每个 OpenGL 帧glReadPixels()并将数据转换为OpenCV::垫。我知道glReadPixels()从下一层到上一层,从左到右,按行获取数据。另一方面,OpenCV 以不同的方式存储数据。

有谁知道任何库或任何教程/示例可以帮助我转换数据glReadPixels to a OpenCV:垫子 in C++?

SUMMARY

 OpenGL frame      ----------------------->        CV::Mat

Data from left to right,                    Data from left to right,
bottom to top.                              top to bottom.

首先我们创建一个空的(或未初始化的)cv::Mat以便直接读取我们的数据。这可以在启动时完成一次,但另一方面cv::Mat::create当图像已经具有匹配的尺寸和类型时,实际上并不会花费太多。类型取决于您的需求,通常是这样的CV_8UC3对于 24 位彩色图像。

cv::Mat img(height, width, CV_8UC3);

or

img.create(height, width, CV_8UC3);

那么你必须考虑到cv::Mat不一定存储连续的图像行。每行末尾可能有一个小的填充值,以使行 4 字节对齐(或 8 字节?)。所以你需要搞乱像素存储模式:

//use fast 4-byte alignment (default anyway) if possible
glPixelStorei(GL_PACK_ALIGNMENT, (img.step & 3) ? 1 : 4);

//set length of one complete row in destination data (doesn't need to equal img.cols)
glPixelStorei(GL_PACK_ROW_LENGTH, img.step/img.elemSize());

接下来,矩阵的类型影响格式和类型参数glReadPixels。如果你想要彩色图像,你必须记住 OpenCV 通常以 BGR 顺序存储颜色值,所以你需要使用GL_BGR(A)(随 OpenGL 1.2 添加)而不是GL_RGB(A)。对于一个组件图像,使用GL_LUMINANCE(将各个颜色分量相加)或GL_RED, GL_GREEN, ...(获取单个组件)。所以对于我们的CV_8UC3图像最终调用将其直接读入cv::Mat将会:

glReadPixels(0, 0, img.cols, img.rows, GL_BGR, GL_UNSIGNED_BYTE, img.data);

最后,OpenCV从上到下存储图像。因此,您可能需要在获取它们后翻转它们,或者首先在 OpenGL 中渲染它们翻转(这可以通过调整投影矩阵来完成,但在这种情况下请注意三角形方向)。翻转一个cv::Mat垂直,你可以使用cv::flip http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html#cv-flip:

cv::flip(img, flipped, 0);

所以要记住 OpenCV:

  • 从上到下、从左到右存储图像
  • 按 BGR 顺序存储彩色图像
  • 可能不会存储紧密排列的图像行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数据从 glReadPixels() 转换为 OpenCV::Mat 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • 如何在 for 循环中重用 ES6 javascript 中的生成器?

    我正在尝试编写一个可以接受列表或生成器作为输入的函数 例如这个函数 function x l for let i of l console log i for let i of l console log i 如果我像这样运行它 x 1 2
  • jqGrid:如果主键列被编辑,如何更新行ID

    主键值用作从服务器返回的 json 数据中的行 ID 如果主键值被编辑并保存两次 第二次保存会因jqGrid而出错 再次将原始主键值传递给编辑方法 如果在内联编辑中更改主键值 如何将 jqGrid 行 ID 更新为新的主键值 functio
  • 从 Java/C# 到 C++ 的最佳方式是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 注入修改后的 Spring 安全表达式语言实现后,“需要调试符号信息 (...)”

    我有一个示例类要测试 PreAuthorize注释 看起来或多或少像这样 class BankService PreAuthorize hasCustomRole ROLE CUSTOM or hasRole ROLE EXAMPLE Do
  • 从 SQL Server 数据库生成 DDL 脚本

    如何使用 SQL 选择 存储过程 等 从 SQL Server 数据库生成所有表的 DDL 带有外键 索引等 脚本 除了数据之外我需要一切 I can t使用 Sql Server Management Studio 因为我想在将在 Lin
  • Python重新加载模块不会立即生效

    请参阅下面的复制代码 跟踪内存泄漏我发现 reload module 不会立即生效 下面的程序应该打印 0 1 2 3 4 但是 当快速执行时 它会打印 0 0 0 3 3 等序列 将 sleep 函数中的时间增加到例如 1 秒似乎可以解决
  • 如何在 Swift 中使用 addAttribute

    我正在尝试添加到 UITextViews 的链接 因此我按照以下代码进行操作这个帖子 http www raywenderlich com 48001 easily overlooked new features ios 7 textVie
  • iphone - 带有返回值的performSelectorOnMainThread

    我有以下方法 NSMutableArray getElements NSString theURL 我想知道是否有一种方法可以使用 PerformSelectorOnMainThread 来调用该方法 以便我可以获得返回值 到目前为止 我已
  • 我可以在 Visual Studio 2012 中编译和调试(运行)单个 C++ 文件吗? (如何避免创建过多的项目)

    我正在从一本书中学习 C 并使用 Visual Studio 2012 为了遵循本书的练习 我需要创建多个 cpp 文件 其中包含 main 函数 有什么方法可以编译 调试我的程序 而无需每次都创建新项目 例如 如果我写一个简单的 Hell
  • R 在使用 case_when 时提供参数(R 向量化)

    这是我之前提出的问题的后续问题 当存在大量类别 类型时 R 使用 case when R 向量化 应用多个函数 https stackoverflow com questions 62377561 r apply multiple func
  • wxpython如何退出Mainloop?

    我有一个 wxpython 应用程序 它的运行方式如下 if name main app wx App False frame MainWindow Application frame Show app MainLoop 应用程序的菜单栏上
  • 如何阻止三星手机上过多的对象创建?

    我在许多 Android 三星手机上遇到动画速度变慢的问题 我已经追踪到问题所在 是垃圾收集过多 但是 我的代码没有直接创建任何对象 这是 DDMS 中分配跟踪器的堆栈跟踪 at com samsung android multiwindo
  • 如何在Python中将整个序列推送到redis [重复]

    这个问题在这里已经有答案了 我可以用Redis rpush key 1 2 3 将三个元素推送到redis 但如果有一个序列 seq 1 2 3 Redis rpush key seq 它会将 seq 元素推送到 redis 但不会推送三个
  • 如何使用 Telegram Bot API 从电话号码获取 user_id

    我目前正在开发一个 Telegram 机器人 一旦你知道电话号码 它就能在 Telegram 中获取用户信息 主要目标是获取用户存储在 Telegram 中的所有用户信息 只需知道他 她的电话号码 因此 我尝试使用 Telegram Bot
  • TransactionScope 的层次结构

    是否可以有一个事务范围的层次结构 如果外部事务范围进行了处置 那么内部事务范围中所做的更改会发生什么 我的特殊问题是我的测试代码运行具有事务范围的代码 当我调用具有事务范围的第二组代码时 我得到 无法访问已处置的对象 事务 难道处置内层事务
  • C++ - 更改 X 窗口中的光标

    我以为这很容易找到 但谷歌搜索却毫无帮助 有没有一个简单的 API 可以改变 X 窗口中的鼠标光标 我知道在 Windows 中你可以只调用 SetCursor include
  • AVPlayer 动态音量控制

    如何动态更改 AVPlayer 的音量 我的意思是 我想在每次按下按钮时将音量静音 给定的代码似乎仅在编译时更改它 运行时怎么办 AVURLAsset asset AVURLAsset URLAssetWithURL self myAsse
  • 类路径中的 ICEfaces 库可防止文件下载时弹出“另存为”对话框

    一旦我将库icefaces jaricepush jaricefaces ace jar添加到我的类路径中以便使用ACE组件 我的另存为对话框就不会弹出吗 我不确定这是否是一个错误 但如果类路径中没有库 它就可以工作 这是我的另存为方法 p
  • 用 pyspark 之前已知的良好值填充 null

    有办法替换吗nullpyspark 数据框中的值与最后一个有效值 还有额外的timestamp and session列 如果您认为需要它们来进行 Windows 分区和排序 更具体地说 我想实现以下转换 session timestamp
  • 将数据从 glReadPixels() 转换为 OpenCV::Mat

    我想从动画中获取每个 OpenGL 帧glReadPixels 并将数据转换为OpenCV 垫 我知道glReadPixels 从下一层到上一层 从左到右 按行获取数据 另一方面 OpenCV 以不同的方式存储数据 有谁知道任何库或任何教程