生产三维模型,输入为DSM和DOM,首先生成.obj文件,然后转为OSGB文件。如果模型过大,则首先会将模型进行分块,生成多块.obj文件再进行后续处理。
生产.obj文件时,可以通过vt的数值来索引纹理图片(例如JPG图片)的像素值,但如果纹理图片过大,obj转为osgb格式后数据量会较大,因此需要对JPG图片也按照同样比例大小进行分块。
但分块后发现,用之前的vt(即UV坐标)计算方法,各模型块之间有明显的分界条纹!!,如下图所示:
原vt计算方法为:(注:原始数据是按原始影像行列号,从左上到右下,先行后列,规则排列的,共有lPixelCount各元素,每行wsPart个,每列hsPart个,lPixelCount = wsPart * hsPart,该算法其实就是计算第n个点所在行和列,与该行、列总元素数做比,Y向要作差)
for (long n = 0; n < lPixelCount; n++)
{
long lVert1Ind = n;
long lVert1Ind_x = 0;
long lVert1Ind_y = 0;
//
pdVtCloudX[n] = (double)(lVert1Ind % wsPart) / (double)(wsPart - 1);
lVert1Ind_y = lVert1Ind / wsPart + 1;
pdVtCloudY[n] = (double)(hsPart - lVert1Ind_y) / (double)(hsPart);
}
后来对vt的计算方式做了修改,代码如下:
for (long n = 0; n < lPixelCount; n++)
{
long lVert1Ind = n;
long lVert1Ind_x = 0;
long lVert1Ind_y = 0;
////UV不为1
pdVtCloudX[n] = (double)(lVert1Ind % wsPart + 1) / (double)(wsPart + 1);
lVert1Ind_y = lVert1Ind / wsPart + 1;
pdVtCloudY[n] = (double)(hsPart - lVert1Ind_y + 1) / (double)(hsPart + 1);
}
上述代码保证了vt坐标不会为0和1,模型拼接后不再有边界条纹,但是出现了像素拼接不上的情况,如下图:
做了很多测试,比如对JPG分块分别是用CV库,或者直接将DOM在代码中截取然后转成JPG图片,或者使用其他格式图片(例如BMP、png等),这些方法仍然会有上述现象,初步猜想可能是JPG图片边缘有一圈边框条纹,请教如何解决上述问题?