pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

將數據從 glReadPixels() 轉換為 OpenCV::Mat

Converting data from glReadPixels() to OpenCV::Mat(將數據從 glReadPixels() 轉換為 OpenCV::Mat)
本文介紹了將數據從 glReadPixels() 轉換為 OpenCV::Mat的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我想使用 glReadPixels() 從動畫中獲取每個 OpenGL 幀,并將數據轉換為 OpenCV::Mat.我知道 glReadPixels() 從下到上,從左到右按行獲取數據.另一方面,OpenCV 以不同的方式存儲數據.

I want to get every OpenGL frame from an animation with glReadPixels() and convert the data to OpenCV::Mat. I know that glReadPixels() gets the data by rows from the lower one to upper one, from left to right. On the other hand, OpenCV stores the data differently.

有沒有人知道任何可以幫助我將數據從 glReadPixels 轉換為 C++ 中的 OpenCV:Mat 的庫或任何教程/示例?

Does anybody know any library or any tutorial/example that helps me to convert data from glReadPixels to a OpenCV:Mat in C++?

總結

 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 位彩色圖像.

First we create an empty (or unititialized) cv::Mat for our data to be read into directly. This can be done once at startup, but on the other hand cv::Mat::create doesn't really cost much when the image already has matching size and type. The type depends on your needs, usually it's something like CV_8UC3 for a 24-bit color image.

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

img.create(height, width, CV_8UC3);

然后您必須考慮 cv::Mat 不必連續存儲圖像行.每行末尾可能有一個小的填充值,以使行 4 字節對齊(或 8 字節?).所以你需要弄亂像素存儲模式:

Then you have to account for cv::Mat not neccessarily storing image rows contiguously. There might be a small padding value at the end of each row to make rows 4-byte aligned (or 8?). So you need to mess with the pixel storage modes:

//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_REDGL_GREEN、...(獲取單個分量).因此,對于我們的 CV_8UC3 圖像,將其直接讀入 cv::Mat 的最終調用將是:

Next, the type of the matrix influences the format and type parameters of glReadPixels. If you want color images you have to keep in mind that OpenCV usually stores color values in BGR order, so you need to use GL_BGR(A) (which were added with OpenGL 1.2) instead of GL_RGB(A). For one component images use either GL_LUMINANCE (which sums the individual color components) or GL_RED, GL_GREEN, ... (to get an individual component). So for our CV_8UC3 image the final call to read it directly into the cv::Mat would be:

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

最后,OpenCV 從上到下存儲圖像.因此,您可能需要在獲取它們后翻轉它們,或者首先在 OpenGL 中渲染它們(這可以通過調整投影矩陣來完成,但在這種情況下要注意三角形方向).要垂直翻轉 cv::Mat,您可以使用 cv::flip:

Finally, OpenCV stores images from top to bottom. So you may need to either flip them after getting them or render them flipped in OpenGL in the first place (this can be done by adjusting the projection matrix, but keep an eye on triangle orientation in this case). To flip a cv::Mat vertically, you can use cv::flip:

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

所以要記住 OpenCV:

So to keep in mind OpenCV:

  • 從上到下,從左到右存儲圖像
  • 按 BGR 順序存儲彩色圖像
  • 可能不會將圖像行存儲得緊湊

這篇關于將數據從 glReadPixels() 轉換為 OpenCV::Mat的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Assertion failed (size.widthgt;0 amp;amp; size.heightgt;0)(斷言失敗(size.width0 amp;amp; size.height0))
Rotate an image in C++ without using OpenCV functions(在 C++ 中旋轉圖像而不使用 OpenCV 函數)
OpenCV: process every frame(OpenCV:處理每一幀)
Why can#39;t I open avi video in openCV?(為什么我不能在 openCV 中打開 avi 視頻?)
OpenCV unable to set up SVM Parameters(OpenCV 無法設置 SVM 參數)
Convert a single color with cvtColor(使用 cvtColor 轉換單一顏色)
主站蜘蛛池模板: 海日牌清洗剂-打造带电清洗剂、工业清洗剂等清洗剂国内一线品牌 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 | 车牌识别道闸_停车场收费系统_人脸识别考勤机_速通门闸机_充电桩厂家_中全清茂官网 | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 中国品牌门窗网_中国十大门窗品牌_著名门窗品牌 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 304不锈钢无缝管_不锈钢管厂家 - 隆达钢业集团有限公司 | 河南道路标志牌_交通路标牌_交通标志牌厂家-郑州路畅交通 | ZHZ8耐压测试仪-上海胜绪电气有限公司 | 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 免费个人pos机申请办理-移动pos机刷卡-聚合收款码办理 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 成都思迪机电技术研究所-四川成都思迪编码器 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 智能楼宇-楼宇自控系统-楼宇智能化-楼宇自动化-三水智能化 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | 找果网 | 苹果手机找回方法,苹果iPhone手机丢了找回,认准找果网! | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 排烟防火阀-消防排烟风机-正压送风口-厂家-价格-哪家好-德州鑫港旺通风设备有限公司 | 膜结构_ETFE膜结构_膜结构厂家_膜结构设计-深圳市烨兴智能空间技术有限公司 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 山东齐鲁漆业有限公司【官网】-工业漆专业生产厂家 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 |