Еще немного баловства с камерой

Добавлен , опубликован
Программирование
Язык:
C#
Продолжаю тему предыдущего своего поста
У меня уже давно чешутся руки сделать стерео картинку полученную с 2х веб-камер.

3D-Generator

Название конечно левое, но и пофиг. За основу взял опять библиотеку WebCam_Capture для C#. Как оказалось она жутко криво работает. Я просто был в шоке, когда узнал принцип действия этой библиотеки. Она заставляет камеру сохранять картинку в буфер обмена, а потом программно доставала оттуда данные и выдавала Image. Так что мне придется искать замену этой кривой либы, либо писать самому, если буду в дальнейшем еще баловаться с веб-камерами. Ну а пока, что я не стал заморачиваться.
Для сооружения нужной конструкции мне потребовалось: Сперва пробовал использовать встроенную камеру в ноутбук, но из-за проблем правильного расположения второй камеры пришлось лезть отключать от настольного ПК вторую вебку.

И так как это работает?

А работает это все просто. Надо получить две картинки для левого и правого глаза, а затем правильно смешать эти картинки, чтобы получить итоговую картинку. Алгоритм я нашел на одном сайте по фотошопу. Делается все в пару этапов.
  1. На картинке для левого глаза убирается красный канал. То есть, значение красного канала ставиться в 0.
  2. На картинке для правого глаза убирается синий и зеленый каналы.
  3. Затем накладывают левую картинку на правую с помощью режима наложения Screen
В принципе ничего сложного. Первые два пункта сделал быстро, а вот с третьим пришлось немного туго. Сперва хотел сам понять как работает режим наложения Screen. Открыл фотошоп, начал экспериментировать со слоями разных цветов, но так и не допер. Нашел описание каждого из наложения. Цитирую:
Screen. Работает так же как и Multiply, только для результата используется обратное значение
Ок. Смотрим, как работает 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;
        }

0
37
12 лет назад
0
Мне всегда кажется, что 2 камеры - бесперспективное занятие и всё будущее за реалтаймовыми анализаторами окружения.
0
29
12 лет назад
0
ScorpioT1000, однако крупные фирмы используют несколько камер для создание реалистичной анимации. А вообще да согласен. Наиболее эффективна технология, которая используется в кинекте, это обычная веб-камера и лазерный сканер, для измерения глубины изображения. Но опять же, это чисто фан не более того. Не зря же назвал пост "баловство". Хотя в предыдущем пришлось намутить не хилый алгоритм преобразования
0
37
12 лет назад
0
просто обычная камера.
Ну, кому фан, а кому смысл жизни.
0
22
12 лет назад
0
А можно подробнее объяснить что это такое и зачем это... Я что-то ничего не понял
1
29
12 лет назад
1
Первые два пункта сделал быстро, а вот со второй немного пришлось туго
Поправь чо.
0
29
12 лет назад
0
Freak,
А можно подробнее объяснить что это такое
Это программа для создания стерео изображения на ходу с использованием двух камер
зачем это
говорю же, давно руки чешутся такую фигню сделать
Doc, спс. поправил
1
37
12 лет назад
1
вот кстати поучитальная штука что надо юзать Qt =)
0
6
9 лет назад
0
Суровая библиотека. Есть еще проблема позиционирования камер относительно друг друга для получения нормального 3D эффекта. В плане работы с камерой аугментированная реальность выглядит более перспективной))
0
29
9 лет назад
0
ivostrikov, ну я бы не сказал, что это какая-то острая проблема. Тут больше проблема в том, что требуется, чтобы обе камеры были сфокусированы на один объект и вот тут уже без нормального оборудования не обойтись)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.