是否可以将 UTexture2D 转换为 OpenCV::Mat
Is it possible to convert a UTexture2D to an OpenCV::Mat
我是一名从事 unreal (C++) 插件开发的开发人员,我的任务是将 openCV 集成到 unreal engine 项目中。我能够解决 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();
使用带数据指针的 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)
...
本例使用统一初始化。 “老”的款式也可以。
我是一名从事 unreal (C++) 插件开发的开发人员,我的任务是将 openCV 集成到 unreal engine 项目中。我能够解决 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();
使用带数据指针的 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)
...
本例使用统一初始化。 “老”的款式也可以。