Как бы я отобразил изображение камеры, чтобы создать живое зеркало funhouse с помощью opencv? - PullRequest
0 голосов
/ 29 июня 2011

Используя Opencv и Linux, я бы хотел создать эффект зеркального веселья, короткого и приземистого, высокого и худого, используя живую веб-камеру Моя дочь любит эти вещи, и я хотел бы создать ее с помощью камеры. Я не совсем уверен насчет преобразований, необходимых для этих эффектов. Любая помощь будет оценена. У меня работает большая часть фреймворка, проигрывается видео в реальном времени и все такое, только не трансформации.

* 1003 спасибо *

1 Ответ

0 голосов
/ 30 июня 2011

Я думаю, что вам нужно использовать «радиальные» преобразования и «подушечку булавки», которая обратна радиальной.Чтобы нарушить симметрию преобразований, вы можете растянуть изображение до и после:

  1. Предположим, ваше изображение имеет размер 300x300 пикселей.
  2. Растяните его до 300x600 или 600x300 с помощью cvResize ()
  3. Примените преобразование: радиальное, подушкообразное или синусоидальное
  4. Растяните обратно до 300x300

IЯ никогда не использовал радиальные или синусоидальные преобразования в 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 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...