gpt4 book ai didi

c - 如何使用 opencv 映射相机图像来创建现场 Playground 镜子?

转载 作者:行者123 更新时间:2023-11-30 18:05:21 25 4
gpt4 key购买 nike

使用 Opencv 和 Linux,我想使用实时网络摄像头创建一个有趣的镜子效果,矮矮、高瘦的效果。我女儿喜欢这些东西,我想用相机制作一个。我不太确定这些效果所需的变换。任何帮助,将不胜感激。我运行了很多框架、实时视频播放等,只是没有转换。

谢谢

最佳答案

我认为您需要使用“径向”变换和逆径向的“针垫”。为了破坏变换的对称性,您可以在前后拉伸(stretch)图像:

  1. 假设您的图片尺寸为 300x300像素。
  2. 将其拉伸(stretch)至 300x600 或使用 cvResize() 600x300
  3. 应用变换:径向、枕形或正弦曲线
  4. 拉伸(stretch)回 300x300

我从未在 openCV 中使用过径向或正弦变换,因此我没有要附加的代码。但你可以使用cvUn Distort2()看看是否可以。创建带有范围为 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 );
}

关于c - 如何使用 opencv 映射相机图像来创建现场 Playground 镜子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6525375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com