Я использую Tensor RT и у меня есть входное изображение в opencv::Mat
, и я хочу загрузить его в функцию ниже и преобразовать в float4*
.Функция ниже получает путь к имени файла в const char* filename
.
Приведенная ниже функция будет читать имя файла с помощью QImage
и преобразовывать его в float4*
.Допустим, у меня есть cv::Mat input
вместо пути к имени файла, и я хочу преобразовать Mat
напрямую в float4*
без использования QImage
.Есть ли способ сделать это?
Пример взят из: https://github.com/dusty-nv/jetson-utils/blob/2fb2b9dfd8323f99c22d3e2755b88345abd2f3a8/loadImage.cpp
bool loadImageRGBA( const char* filename, float4** cpu, float4** gpu, int* width, int* height )
{
if( !filename || !cpu || !gpu || !width || !height )
{
printf("loadImageRGBA - invalid parameter\n");
return false;
}
// verify file path
const std::string path = locateFile(filename);
if( path.length() == 0 )
{
printf("failed to find image '%s'\n", filename);
return false;
}
// load original image
QImage qImg;
if( !qImg.load(path.c_str()) )
{
printf("failed to load image '%s'\n", path.c_str());
return false;
}
if( *width != 0 && *height != 0 )
qImg = qImg.scaled(*width, *height, Qt::IgnoreAspectRatio);
const uint32_t imgWidth = qImg.width();
const uint32_t imgHeight = qImg.height();
const uint32_t imgPixels = imgWidth * imgHeight;
const size_t imgSize = imgWidth * imgHeight * sizeof(float) * 4;
printf("loaded image %s (%u x %u) %zu bytes\n", filename, imgWidth, imgHeight, imgSize);
// allocate buffer for the image
if( !cudaAllocMapped((void**)cpu, (void**)gpu, imgSize) )
{
printf(LOG_CUDA "failed to allocated %zu bytes for image %s\n", imgSize, filename);
return false;
}
float4* cpuPtr = *cpu;
for( uint32_t y=0; y < imgHeight; y++ )
{
for( uint32_t x=0; x < imgWidth; x++ )
{
const QRgb rgb = qImg.pixel(x,y);
const float4 px = make_float4(float(qRed(rgb)),
float(qGreen(rgb)),
float(qBlue(rgb)),
float(qAlpha(rgb)));
cpuPtr[y*imgWidth+x] = px;
}
}
*width = imgWidth;
*height = imgHeight;
return true;
}