我想制作一个带有X,Y,Z,RGBA和标签字段的PCD文件。现在,我有一个XYZRGBA,PCD文件。它包括640 * 480点。另一方面,我有另一个文件,其中包含320 * 256的数字,这些数字表示分段图像中的标签。我想放大标签阵列并将其添加到当前的PCD文件中,以制作具有相应x,y,z,rgba和标签信息的新PCD文件。此PCD文件将与分割的图像相关。
这是我的尝试。
Label是包含标签信息的文件的名称,首先我将其转换为OpenCV矩阵,现在我希望将其放大到640 * 480,然后将其添加到当前的xyzrgba pcd文件中。再次放大后,我将生成的OpenCV矩阵转换为名称为“array”的普通矩阵,以添加到当前的PCD数据中。

cv::Mat LabelsMat=cv::Mat(320,256, CV_32SC1, label);
cv::Mat OriginalLabels=cv::Mat::zeros(320,256, CV_32SC1);
LabelsMat.copyTo(OriginalLabels);
cv::Mat UpScaledLabels=cv::Mat::zeros(640, 480, CV_32FC1);
cv::resize(OriginalLabels, UpScaledLabels, UpScaledLabels.size(), 0, 0,cv::INTER_NEAREST);
std::vector<int> array;
array.assign((int*)UpScaledLabels.datastart, (int*)UpScaledLabels.dataend);

但是有一些问题。当我制作这个新的PCD文件并只想查看图像的一个片段时,例如如图4所示,根据我的基本图像,出现了错误的形状,这与段4截然不同。我确定问题出在这部分和上面的代码。请问有人可以帮助我找到问题吗?感谢您的宝贵帮助。

最佳答案

好,终于有时间了...

查看您生成的Mat对象总是很好的,只需使用cv::imshow或cv::imwrite并相应地缩放数据即可。

使用以下代码(基本上是您自己的固定数组编写代码):

int label[320][256];

std::ifstream in("../inputData/UPSCALE_data.dat");
for (int i = 0; i < 320; i++)
    for (int j = 0;j< 256; j++)
    {
        in >> label[i][j];
    }
in.close();

// create Mat with label input:
cv::Mat LabelsMat=cv::Mat(320,256, CV_32SC1, label);

cv::Mat OriginalLabels = LabelsMat.clone(); // you could instead work on the non-copied data, if you liked to...

// upscale:
cv::Mat UpScaledLabels; // no need to allocate memory here during testing
cv::resize(OriginalLabels, UpScaledLabels, cv::Size(640, 480), 0, 0,cv::INTER_NEAREST);

std::vector<int> marray;
marray.reserve(UpScaledLabels.cols*UpScaledLabels.rows);
for(int j=0; j<UpScaledLabels.rows; ++j)
    for(int i=0; i<UpScaledLabels.cols; ++i)
    {
        marray.push_back(UpScaledLabels.at<int>(j,i));
    }

// now here marray has information about the upscaled image.


cv::Mat convertedCorrect;
UpScaledLabels.convertTo(convertedCorrect, CV_8UC1);

cv::imwrite("../outputData/UPSCALED_RESULT_ORIG.png", convertedCorrect*50);

我得到这个结果:

opencv - 在OpenCV中扩展阵列-LMLPHP

这是因为cv::Mat LabelsMat=cv::Mat(320,256, CV_32SC1, label);产生的图像具有HEIGHT 320和WIDTH 256(我以为我已经在评论中提到了它,但是找不到atm ...)

因此,使用以下代码修复该问题:
int label[320][256];

std::ifstream in("../inputData/UPSCALE_data.dat");
for (int i = 0; i < 320; i++)
    for (int j = 0;j< 256; j++)
    {
        in >> label[i][j];
    }
in.close();

// create Mat with label input: HERE THE DIMENSIONS ARE SWAPPED
cv::Mat LabelsMat=cv::Mat(256,320, CV_32SC1, label);

cv::Mat OriginalLabels = LabelsMat.clone(); // you could instead work on the non-copied data, if you liked to...

// upscale:
cv::Mat UpScaledLabels; // no need to allocate memory here during testing
cv::resize(OriginalLabels, UpScaledLabels, cv::Size(640, 480), 0, 0,cv::INTER_NEAREST);

std::vector<int> marray;
marray.reserve(UpScaledLabels.cols*UpScaledLabels.rows);
for(int j=0; j<UpScaledLabels.rows; ++j)
    for(int i=0; i<UpScaledLabels.cols; ++i)
    {
        marray.push_back(UpScaledLabels.at<int>(j,i));
    }

// now here marray has information about the upscaled image.


cv::Mat convertedCorrect;
UpScaledLabels.convertTo(convertedCorrect, CV_8UC1);

cv::imwrite("../outputData/UPSCALED_RESULT_CORRECTED.png", convertedCorrect*50);

您会得到看起来更好的Mat:

opencv - 在OpenCV中扩展阵列-LMLPHP

但是与您的其他图像相比,该图像以某种方式旋转了?!

opencv - 在OpenCV中扩展阵列-LMLPHP

关于opencv - 在OpenCV中扩展阵列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32183141/

10-12 01:40