Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2012, 15:38   #1
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию Искажение видео

Доброго всем! Народ, возникла необходимость искажать видео записываемое с веб камеры. Искажения типа "выпуклая линза". Как это сделать - ума не приложу. Для записи видео используется TVideoGrabber, если что. Как вообще происходит процесс искажения? Что для этого стоит использовать? Есть какие нибудь идеи?
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 30.01.2012, 15:54   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...идеи, они конечно есть: приложить линзу выпуклую к объективу , а вообще добавить в цепочку соответствующий фильтр-обработчик (если бы речь шла о видеозахвате средствами DirectShow). По сути, выхватить изображение-кадр, провести обработку и передать дальше.

Как основа, пример над изображением:
Код:
type
  TRGB = packed record
    B, G, R: Byte;
  end;
  pRGB = ^TRGB;

function ILimit(Val, AMin, AMax: Integer): Integer;
begin
  Result := Min(Max(Val, AMin), AMax);
end;

procedure Lens(Bitmap: TBitmap; xx, yy, Width, Height: Integer; Refraction: Double);

  procedure find_projected_pos(Refraction, a, b, x, y: Double; projx, projy: pDouble);
  var c, ri1, ri2, nxangle, nyangle, theta1, theta2: Double;
      n: array [0..2] of Double;
  begin
    ri1 := 1.0;
    ri2 := Refraction;
    c := DMin(a, b);
    n[0] := x;
    n[1] := y;
    n[2] := Sqrt((1 - x*x/(a*a) - y*y/(b*b))*(c*c));
    nxangle := Cos(n[0]/Sqrt(n[0]*n[0] + n[2]*n[2]));
    theta1 := PI/2 - nxangle;
    theta2 := ArcSin(Sin(theta1)*ri1/ri2);
    theta2 := PI/2 - nxangle - theta2;
    projx^ := x - Tan(theta2)*n[2];
    nyangle := ArcCos(n[1] / Sqrt(n[1]*n[1] + n[2]*n[2]));
    theta1 := PI/2 - nyangle;
    theta2 := ArcSin(Sin(theta1) * ri1/ri2);
    theta2 := PI/2 - nyangle - theta2;
    projy^ := y - Tan(theta2) * n[2];
  end;
var row, col, scol, srow,
    RegionWidth, RegionHeight, x1, y1, x2, y2: Integer;
    px1, px2: pRGB;
    dx, dy, xsqr, ysqr, a, b, asqr, bsqr, x, y: Double;
    Bmp: TBitmap;
begin
  x1 := Width div 2;
  y1 := Height div 2;
  x2 := xx + x1;
  y2 := yy + y1;
  if Refraction < 1 then Refraction := 1;
  RegionWidth := x2 - x1;
  a := RegionWidth / 2;
  RegionHeight := y2 - y1;
  b := RegionHeight / 2;
  asqr := Sqr(a);
  bsqr := Sqr(b);
  Bmp := TBitmap.Create;
  Bmp.PixelFormat := Bitmap.PixelFormat;
  Bmp.Width := RegionWidth;
  Bmp.Height := RegionHeight;
  try
    for col := 0 to RegionWidth - 1 do begin
      dx := col - a + 0.5;
      xsqr := Sqr(dx);
      for row := 0 to RegionHeight - 1 do begin
        dy := -(row - b) - 0.5;
        ysqr := Sqr(dy);
        px1 := Bmp.ScanLine[row];
        Inc(px1, col);
        if (ysqr < (bsqr - (bsqr*xsqr)/asqr)) then begin
   find_projected_pos(refraction, a, b, dx, dy, @x, @y);
          y := -y;
          srow := Trunc(y + b);
          srow := ILimit(srow, 0, Bitmap.Height - 1);
          scol := Trunc(x + a);
          scol := ILimit(scol, 0, Bitmap.Width - 1);
          px2 := Bitmap.ScanLine[y1 + srow];
          Inc(px2, x1 + scol);
          px1^ := px2^;
        end
        else begin
          px2 := Bitmap.ScanLine[y1 + row];
          Inc(px2, x1 + col);
          px1^ := px2^;
        end;
      end;
    end;
    Bitmap.Canvas.Draw(x1, y1, Bmp);
  finally
    Bmp.Free;
  end;
end;
А кстати, вот тут http://algolist.manual.ru/graphics/effect/overlens.php хорошо расписан алгоритм линзы с примерами кода.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 30.01.2012, 15:59   #3
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Программа WebCam Max
Вадим Мошев вне форума Ответить с цитированием
Старый 01.02.2012, 18:30   #4
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

raxp, спасибо. теперь хоть понятно что к чему. с линзой получилось. а вот с закручиванием что то не очень. не могли бы вы посоветовать алгоритм?
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 01.02.2012, 20:47   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...в смысле, вот это скручивание http://algolist.manual.ru/graphics/effect/bend.php ?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.02.2012, 21:08   #6
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

мой приятель просто отломал от какой-то ненужной детсткой игрушки прозрачную выпуклую пластмасску и прицепил скотчем на свою веб-камеру. и получил очень забавный эффект - выпуклость своего лица, как в мыльном пузыре.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Искажение координат при рисовании многоугольника на канве temeah Общие вопросы Delphi 4 03.01.2012 01:24
JQuery UI, как убрать искажение фото при эффекте slide? AlienNation JavaScript, Ajax 0 11.10.2011 01:49
искажение данных DBGrid в Excel-? Evgenii БД в Delphi 2 18.11.2009 00:43
Искажение цвета в TImage igordz Мультимедиа в Delphi 2 10.07.2009 22:37