【发布时间】: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()先行,后列。 -
感谢您的回复,我已针对您的回答进行了详细说明。
标签: c++ opencv unreal-engine4 mat texture2d