我是一个从事虚幻(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();
发布于 2021-10-04 23:48:56
使用带数据指针的正确的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)
...
此示例使用统一初始化。“旧”风格也没问题。
https://stackoverflow.com/questions/69442663
复制相似问题