在 OpenCV 中放大数组
Up-scaling an array in OpenCV
我想制作一个包含 X、Y、Z、RGBA 和标签字段的 PCD 文件。现在我有一个 XYZRGBA,PCD 文件。它包括640*480个点。另一方面,我有另一个文件,其中包含 320*256 个数字,代表分割图像中的标签。我想放大标签数组并将其添加到我当前的 PCD 文件中,以制作具有相应 x、y、z、rgba 和标签的新 PCD 文件 information.This 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);
我得到这个结果:
那是因为 cv::Mat LabelsMat=cv::Mat(320,256, CV_32SC1, label);
生成了一个高度为 320 和宽度为 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);
你得到这个看起来好多了的垫子:
但是与您的其他图像相比,该图像以某种方式旋转了?!?
我想制作一个包含 X、Y、Z、RGBA 和标签字段的 PCD 文件。现在我有一个 XYZRGBA,PCD 文件。它包括640*480个点。另一方面,我有另一个文件,其中包含 320*256 个数字,代表分割图像中的标签。我想放大标签数组并将其添加到我当前的 PCD 文件中,以制作具有相应 x、y、z、rgba 和标签的新 PCD 文件 information.This 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);
我得到这个结果:
那是因为 cv::Mat LabelsMat=cv::Mat(320,256, CV_32SC1, label);
生成了一个高度为 320 和宽度为 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);
你得到这个看起来好多了的垫子:
但是与您的其他图像相比,该图像以某种方式旋转了?!?