Opencv - 多项式函数拟合

标签 opencv model-fitting function-fitting

在 opencv(或其他 c++ 库)中,是否有类似 matlab fit 的函数可以进行 3d 多项式曲面拟合(即 f(x,y)= p00 + p10* x + p01*y + p20*x^2 + p11*x*y + p02*y^2)。谢谢

最佳答案

我认为 opencv 中没有库,但您可以这样做:

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

关于Opencv - 多项式函数拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37757409/

相关文章:

python - 当 scipy.optimize.minimize 可能用于相同的事情时,为什么 scipy.optimize.least_squares 存在?

python - 如果某些数据点是 NaN,如何拟合二维函数?

python - 如何在随机点云上拟合点网格

python - Python 中的电阻率非线性拟合

python - plt.show 和 cv2.imshow 的区别?

c++ - 使用 OpenCV C++ 创建遵循高斯分布的图像

android - 带有非免费软件包(SURF)的OpenCV Android

python - 曲线拟合与 python 错误

machine-learning - 是否有必要为卡住层定义后向函数?

Python OpenCV Hough Circles 返回 None