2016-06-10 973 views
0

在opencv(或其他C++ lib)中,是否有类似的函数,如matlab fit可以做3d多项式曲面拟合(即f(x,y)= p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2)。由于Opencv - 多项式函数拟合

+0

提高格式化 –

回答

1

我不认为这是在OpenCV的一个lib,但你可以做这样的:

int main(int argc, char** argv) 
{ 
Mat z = imread("1449862093156643.jpg",CV_LOAD_IMAGE_GRAYSCALE); 

Mat M = Mat_<double>(z.rows*z.cols,6); 
Mat I=Mat_<double>(z.rows*z.cols,1); 
for (int i=0;i<z.rows;i++) 
    for (int j = 0; j < z.cols; j++) 
    { 
     double x=(j - z.cols/2)/double(z.cols),y= (i - z.rows/2)/double(z.rows); 
     M.at<double>(i*z.cols+j, 0) = x*x; 
     M.at<double>(i*z.cols+j, 1) = y*y; 
     M.at<double>(i*z.cols+j, 2) = x*y; 
     M.at<double>(i*z.cols+j, 3) = x; 
     M.at<double>(i*z.cols+j, 4) = y; 
     M.at<double>(i*z.cols+j, 5) = 1; 
     I.at<double>(i*z.cols+j, 0) = z.at<uchar>(i,j); 
    } 
SVD s(M); 
Mat q; 
s.backSubst(I,q); 
cout<<q; 
imshow("Orignal",z); 
cout<<q.at<double>(2,0); 
Mat background(z.rows,z.cols,CV_8UC1); 
for (int i=0;i<z.rows;i++) 
    for (int j = 0; j < z.cols; j++) 
    { 
     double x=(j - z.cols/2)/double(z.cols),y= (i - z.rows/2)/double(z.rows); 
     double quad=q.at<double>(0,0)*x*x+q.at<double>(1,0)*y*y+q.at<double>(2,0)*x*y; 
     quad+=q.at<double>(3,0)*x+q.at<double>(4,0)*y+q.at<double>(5,0); 
     background.at<uchar>(i,j) = saturate_cast<uchar>(quad); 
    } 
imshow("Simulated background",background); 
waitKey(); 
return 0; 
} 

Original post is here

+0

很不错的解决方案。谢谢 – fnhdx