2013-08-23 95 views
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; 
     } 
    } 
} 

回答

0

map_x.create(160,160, CV_32FC1);是浮動,但是當你填寫你使用mat.at<double>(i,j) = 5. * value;。我不知道它是否能解決您的問題,但應該糾正。

+0

謝謝安德烈,我改變了一些其他的錯誤,但你可以告訴我,如果我在正確的軌道上使用重新映射我的問題? – xyfix

+0

您需要映射源圖像上的每個點以指向目標。正如我記得重新映射不分配:Idst(map_y(i,j),map_x(i,j))= Isrc(i,j);如果你想要的話,那麼你的方式是正確的。有時,從dst到src使用反向映射,即逐點掃描dst圖像,並評估src圖像中的座標,從中獲得要在src圖像中設置的值的效果會更加有效。這種方法可以避免在dst圖像上沒有填充點。但重新做插值,所以你不用擔心它。但無論如何,您需要填充map_x和map_y矩陣中的所有元素而不會錯過。 –

+0

Andrey,我糾正了上面的代碼,它現在運行時沒有任何崩潰,但不幸的是結果似乎不正確。 map_x(160x160)中的每一行從-5到5(步長爲1/160),map_y(160x160)中的每一列都從-5 t0 5開始(步長爲1/160)。 – xyfix