2
我使用重映射函數將不規則網格(650 xyz-座標)映射到常規網格(160x160點從-5 .... 5步驟1/160),但我可以'似乎得到它的工作。順便說一下,我使用的插值是雙三次的。有人可以告訴我是否可以這樣做嗎?提前致謝。不規則重映射到常規網格
using namespace cv;
using namespace POINTS;
std::ofstream file;
Mat src(400,3,CV_32F);
Mat dst(160,160,CV_32F);
Mat map_x;
Mat map_y;
int ind = 0;
Mat matx(400, 1, CV_32F, &pointsx);
Mat maty(400, 1, CV_32F, &pointsy);
Mat matz(400, 1, CV_32F, &pointsz);
void matrixDump(const Mat* mat);
void createMatrix(Mat* mat);
int main()
{
hconcat(matx, maty, matx);
hconcat(matx, matz, src);
map_x.create(160,160, CV_32FC1);
map_y.create(160, 160, CV_32FC1);
createMatrix(&map_x);
createMatrix(&map_y);
Mat T = map_y.t();
remap(src, dst, map_x, T, CV_INTER_CUBIC, BORDER_CONSTANT, Scalar(0, 0, 0));
return 0;
}
void matrixDump(const Mat* mat)
{
file.open("interpolation.txt");
for(int i=0; i<mat->rows ; i++)
{
for(int j=0; j<mat->cols;j++)
{
file << mat->at<float>(i,j) << " " ;
}
}
file.close();
}
void createMatrix(Mat* mat)
{
for(int i=0; i<mat->rows; i++)
{
for(int j=0; j<mat->cols; j++)
{
float value = -1. + (j*2./(mat->rows-1));
mat->at<float>(i,j) = 5. * value;
}
}
}
謝謝安德烈,我改變了一些其他的錯誤,但你可以告訴我,如果我在正確的軌道上使用重新映射我的問題? – xyfix
您需要映射源圖像上的每個點以指向目標。正如我記得重新映射不分配:Idst(map_y(i,j),map_x(i,j))= Isrc(i,j);如果你想要的話,那麼你的方式是正確的。有時,從dst到src使用反向映射,即逐點掃描dst圖像,並評估src圖像中的座標,從中獲得要在src圖像中設置的值的效果會更加有效。這種方法可以避免在dst圖像上沒有填充點。但重新做插值,所以你不用擔心它。但無論如何,您需要填充map_x和map_y矩陣中的所有元素而不會錯過。 –
Andrey,我糾正了上面的代碼,它現在運行時沒有任何崩潰,但不幸的是結果似乎不正確。 map_x(160x160)中的每一行從-5到5(步長爲1/160),map_y(160x160)中的每一列都從-5 t0 5開始(步長爲1/160)。 – xyfix