Добавлен alexprey,
опубликован
Программирование
Язык:
C#
Продолжаю тему предыдущего своего поста
У меня уже давно чешутся руки сделать стерео картинку полученную с 2х веб-камер.
У меня уже давно чешутся руки сделать стерео картинку полученную с 2х веб-камер.
3D-Generator
Название конечно левое, но и пофиг. За основу взял опять библиотеку WebCam_Capture для C#. Как оказалось она жутко криво работает. Я просто был в шоке, когда узнал принцип действия этой библиотеки. Она заставляет камеру сохранять картинку в буфер обмена, а потом программно доставала оттуда данные и выдавала Image. Так что мне придется искать замену этой кривой либы, либо писать самому, если буду в дальнейшем еще баловаться с веб-камерами. Ну а пока, что я не стал заморачиваться.
Для сооружения нужной конструкции мне потребовалось:
Для сооружения нужной конструкции мне потребовалось:
- веб-камера
- еще одна веб-камера
- красно-синие анаглифные очки
- Visual Studio 2010
И так как это работает?
А работает это все просто. Надо получить две картинки для левого и правого глаза, а затем правильно смешать эти картинки, чтобы получить итоговую картинку. Алгоритм я нашел на одном сайте по фотошопу. Делается все в пару этапов.
- На картинке для левого глаза убирается красный канал. То есть, значение красного канала ставиться в 0.
- На картинке для правого глаза убирается синий и зеленый каналы.
- Затем накладывают левую картинку на правую с помощью режима наложения Screen
Ок. Смотрим, как работает MultiplyScreen. Работает так же как и Multiply, только для результата используется обратное значение
Мда... Много чего выяснил. Попробовал посчитать вручную, ничего не получилось. Отправился дальше искать алгоритм работы. В итоге нашел на одном сайте записки по каждому из режимов наложения слоев с подробным описанием и формулами. А формула оказалось не такой уж и простойMultiply. Обычное умножение, тут и так все ясно
R = 255 - (255 - S)*(255 - C)/255
где, R - результирующий цвет, S - исходное изображение, С - корректирующее изображение.
Вот в принципе и все. Осталось только написать код, что не так уж и долго
Вот в принципе и все. Осталось только написать код, что не так уж и долго
Вот он
public static int ScreenMixInt(int S, int C)
{
return 255 - (255 - S) * (255 - C) / 255;
}
public static Color ScreenMixColor(Color S, Color C)
{
return Color.FromArgb(255, ScreenMixInt(S.R, C.R),
ScreenMixInt(S.G, C.G),
ScreenMixInt(S.B, C.B));
}
public static Image Mix(Image left, Image right, bool lNeedInverse = false, bool rNeedInverse = false)
{
int width = left.Width;
int height = left.Height;
Bitmap32 lBmp = new Bitmap32((Bitmap)left);
Bitmap32 rBmp = new Bitmap32((Bitmap)right);
Bitmap32 result = new Bitmap32(new Bitmap(width, height));
lBmp.Lock();
rBmp.Lock();
result.Lock();
for (int x = 0; x < width; x++)
for (int y = 0; y < height; y++)
{
Color lColor = lBmp.GetPixel(lNeedInverse ? width - x - 1 : x, y);
Color rColor = rBmp.GetPixel(rNeedInverse ? width - x - 1 : x, y);
rColor = Color.FromArgb(255, 0, rColor.G, rColor.B);
lColor = Color.FromArgb(255, lColor.R, 0, 0);
Color resultColor = ScreenMixColor(rColor, lColor);
result.SetPixel(x, y, resultColor);
}
lBmp.UnLock();
rBmp.UnLock();
result.UnLock();
return result.Bitmap;
}
Ну и собственно результат
Программа, чтобы вы тоже могли побаловаться
Программа, чтобы вы тоже могли побаловаться
Полезное чтение
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ну, кому фан, а кому смысл жизни.
Doc, спс. поправил