如何使用opencv映射相机图像以创建实时的funhouse镜像?

时间:2011-06-29 18:20:41

标签: c linux opencv camera

使用Opencv和Linux我想使用现场网络摄像头创建一个有趣的镜面效果,短而深蹲,高瘦效果。我的女儿喜欢这些东西,我想用相机创造一个。我不太确定这些效果所必需的变换。任何帮助,将不胜感激。我有很多框架在运行,实时视频播放等等,而不是转换。

感谢名单

1 个答案:

答案 0 :(得分:0)

我认为你需要使用'径向'变换和'反向径向'的“针垫”。 为了制作变换的对称性,您可以在之前和之后拉伸图像:

  1. 假设您的图片是300x300 像素。
  2. 将其拉伸至300x600或 600x300使用cvResize()
  3. 应用变换:径向,枕形或 正弦
  4. 回到300x300
  5. 我从未在openCV中使用径向或正弦变换,因此我没有一段代码可以附加。但是你可以使用cvUndistort2()并查看它是否正常。 使用范围为0..100的轨迹栏创建窗口。每个轨迹栏控制失真参数:

    static IplImage* srcImage;
    static IplImage* dstImage;
    
    static double _camera[9];
    static double _dist4Coeff[4];        // This is the transformation matrix
    static int _r = 50;   // Radial transform. 50 in range 0..100
    static int _tX = 50;  // Tangetial coef in X directio
    static int _tY = 50;  // Tangetial coef in Y directio
    static int allRange = 50;
    
    // Open windows
    cvNamedWindow(winName, 1);
    
    // Add track bars.
    cvShowImage(winName, srcImage );
    cvCreateTrackbar("Radial", winName, &_r         , 2*allRange, callBackFun);
    cvCreateTrackbar("Tang X", winName, &_tX        , 2*allRange, callBackFun);
    cvCreateTrackbar("Tang Y", winName, &_tY        , 2*allRange, callBackFun);
    callBackFun(0);
    
    // The distortion call back
    void callBackFun(int arg){
     CvMat intrCamParamsMat = cvMat( 3, 3, CV_64F, _camera );
     CvMat dist4Coeff       = cvMat( 1, 4, CV_64F, _dist4Coeff );
    
     // Build distortion coefficients matrix.
     dist4Coeff.data.db[0] = (_r-allRange*1.0)/allRange*1.0;
     dist4Coeff.data.db[1] = (_r-allRange*1.0)/allRange*1.0;
     dist4Coeff.data.db[2] = (_tY-allRange*1.0)/allRange*1.0;
     dist4Coeff.data.db[3] = (_tX-allRange*1.0)/allRange*1.0;
    
     // Build intrinsic camera parameters matrix.
     intrCamParamsMat.data.db[0] = 587.1769751432448200/2.0;
     intrCamParamsMat.data.db[1] = 0.;
     intrCamParamsMat.data.db[2] = 319.5000000000000000/2.0+0;
     intrCamParamsMat.data.db[3] = 0.;
     intrCamParamsMat.data.db[4] = 591.3189722549362800/2.0;
     intrCamParamsMat.data.db[5] = 239.5000000000000000/2.0+0;
     intrCamParamsMat.data.db[6] = 0.;
     intrCamParamsMat.data.db[7] = 0.;
     intrCamParamsMat.data.db[8] = 1.;
    
     // Apply transformation
     cvUndistort2( srcImage, dstImage, &intrCamParamsMat, &dist4Coeff );
     cvShowImage( winName, dstImage );
    }