是否可以将 UTexture2D 转换为 OpenCV::Mat

Posted

技术标签:

【中文标题】是否可以将 UTexture2D 转换为 OpenCV::Mat【英文标题】:Is it possible to convert a UTexture2D to an OpenCV::Mat 【发布时间】:2021-11-25 06:33:09 【问题描述】:

我是一名从事虚幻 (C++) 插件开发的开发人员,我的任务是将 openCV 集成到项目的虚幻引擎中。我能够处理解决 std:: 问题,但我对尝试将 UTexture2D 转换为 opencv::Mat 感到困惑和沮丧。我有一个接受 UTexture2D* 的 C++ 函数,需要使用 openCV 来操作它。为此,必须将其转换为 opencv::Mat。我尝试进行像素到像素的转换,但每次都会崩溃或挂起。非常感谢任何有关如何进行此必要转换的指南,谢谢!

我尝试了几个版本的代码都没有成功,但这是我最近的失败:

//obtain all the pixel information from the mipmaps
FTexture2DMipMap* MyMipMap = &MyTexture2D->PlatformData->Mips[0];
FByteBulkData* RawImageData = &MyMipMap->BulkData;

//store in fcolor array
uint8* Pixels = static_cast<uint8*>(RawImageData->Lock(LOCK_READ_ONLY));

//trying via constructor
cv::Mat myImg = cv::Mat( 3000, 1100, CV_8UC3);

//trying to map the pixels individually
for (int32 y = 0; y < height; y++)

    for (int32 x = 0; x < width; x++)
    
        int32 curPixelIndex = ((y * width) + x);
        myImg.at<cv::Vec3b>(x, y)[0] = Pixels[4 * curPixelIndex];
        myImg.at<cv::Vec3b>(x, y)[1] = Pixels[4 * curPixelIndex + 1];
        myImg.at<cv::Vec3b>(x, y)[2] = Pixels[4 * curPixelIndex + 2];
    
;

//unlock thread
RawImageData->Unlock();

【问题讨论】:

您能否分享一个代码 sn-p 以便我们了解您的崩溃代码? 是的,添加了我尝试过的最新代码! cv::Mat 有各种构造函数。其中之一采用指向数据的指针(以及宽度、高度、元素类型)。指针保存在 cv::Mat 中(它不会分配/释放自己的内存,而是使用指针)。您的数据的步长为 4 个字节,因此您应该使用 CV_8UC4。 请使用文档。它包含教程。 BTW:“虚幻开发者”意味着您在虚幻引擎本身上工作。但是,我怀疑您是引擎/库的用户。 at() 先行,后列 感谢您的回复,我已针对您的回答进行了详细说明。 【参考方案1】:

使用带有数据指针的cv::Mat 的正确构造函数。该 Mat 对象不会分配或释放自己的内存。它将使用分配给它的内存。这样的 Mat 不能调整大小,并且只有在给定的内存可以访问时才有效。

https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#a51615ebf17a64c968df0bf49b4de6a3a

...
uint8* Pixels = ...;

cv::Mat myImg  height, width, CV_8UC4, Pixels ;
// myImg is now usable

// access pixels like so: myImg.at<Vec4b>(y,x)

...

此示例使用统一初始化。 “旧”样式也可以。

【讨论】:

代码已更改以反映此表示法,并且图像在创建后访问图像时仍然挂起(访问imshow,dilate等的方法)('hangs'定义为包含opencv的进程非-在主进程退出时响应和孤立)。另外,我知道数组每个像素使用 4 个字节,因为虚幻包含一个 alpha 层。我忽略了循环中的那个字节,因此忽略了 Vec3b。至于被交换的行和列,那是我的。 这种行为是间歇性的,因为再运行几次后,它最终放大了图像而没有挂起。我认为在生成过程中的其他地方存在内存泄漏。不管怎样,谢谢你的帮助!

以上是关于是否可以将 UTexture2D 转换为 OpenCV::Mat的主要内容,如果未能解决你的问题,请参考以下文章

Python - 如何使用Open-cv或PIL将24位PNG图像转换为32位

open cv mat怎样将数据类型转化为double

使用 node-forge 将 ssh 公钥从各种格式转换为 Open SSH

python 将KITTI velodyne bin转换为open3d pcd

无法使用 Open Vino 工具包将 tensorflow Mask-Rcnn 转换为 IR

是否可以将一维张量转换为列表? (张量流)