Oberon space
General Category => Общий раздел => Тема начата: valexey_u от Апрель 14, 2013, 07:09:07 pm
-
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects
-
Поздравляю!
-
Присоединяюсь к поздравлениям! Подробности давай уже :)
-
Спасибо всем за поздравления, но подробности наверно завтра - я часов 36 не спал (а нормально не спал все 48) :-)
Пока можете прочитать на том самом сайте ( http://hackday.ru/events/hackday-25 ) что это вообще за мероприятие такие было.
PS. Именно на этом мероприятии, только с порядковым номером не 25, а 23 (http://hackday.ru/events/hackday-23), была допилена до полноценного прототипа The Nothing System (http://hackday.ru/events/hackday-23/projects проект номер 2), которую потом обсуждали на оберонкоре (http://forum.oberoncore.ru/viewtopic.php?f=26&t=4212)
-
ПОздравляю! Твой проект Virtualens выглядит на фоне остальных действиетльно единственным более-менее техническим и интересным...
Кстати, а что ещё за девушка там была? Она тоже в этом проекте Virtualens участвовала? Там же вроде только один участник был указан...
-
Пока не написался отчет, что-то можно прочесть тут в комментах: https://plus.google.com/114633421665967893098/posts/hdL8JMK96KA
-
Поздравляю.. я правильно понял, что ваш проект среди 25 победителей?
-
Поздравляю.. я правильно понял, что ваш проект среди 25 победителей?
Спасибо. А что за 25 победителей? Можно url?
-
Поздравляю.. я правильно понял, что ваш проект среди 25 победителей?
Спасибо. А что за 25 победителей? Можно url?
а я и спрашиваю... ибо не понятно с одной стороны "мы победили", а с другой стороны 24 номер... вот я и подумал, что все проекты из этого списка являются победителями (как со стартом Лаптева-Грачева) :)
а что не так?
-
Поздравляю.. я правильно понял, что ваш проект среди 25 победителей?
Спасибо. А что за 25 победителей? Можно url?
а я и спрашиваю... ибо не понятно с одной стороны "мы победили", а с другой стороны 24 номер... вот я и подумал, что все проекты из этого списка являются победителями (как со стартом Лаптева-Грачева) :)
а что не так?
Не, это все проекты-участники хакотона :-)
Упорядочены в порядке подачи заявки - я проект зарегистрировал последним. Впрочем, там и состав команд не правильный. Да и проекты там не все (некоторые проекты были заявлены уже после начала, а некоторые заявленные проекты не запустились, ибо народ не набрался). Более правдивая версия будет, видимо, в отчете организаторов мероприятия. Думаю через день-два они выложат это дело.
-
Отчет тут: http://valexey.blogspot.ru/2013/04/hackday25-virtualens.html
-
Отчет тут: http://valexey.blogspot.ru/2013/04/hackday25-virtualens.html
если есть скиньте ролик (демонстрирующий исходную и результирующую картинки)..
-
Отчет тут: http://valexey.blogspot.ru/2013/04/hackday25-virtualens.html
если есть скиньте ролик (демонстрирующий исходную и результирующую картинки)..
Сейчас готовится видео от интеловцев. Думаю там все будет, мы с ними сотрудничаем.
Ну и видео с демофеста будут выложены скоро-скоро, и там тоже что-то будет видно.
-
Сейчас готовится видео от интеловцев. Думаю там все будет, мы с ними сотрудничаем.
Ну и видео с демофеста будут выложены скоро-скоро, и там тоже что-то будет видно.
ну и отлично.. остается только запатентовать технологию и продавать ее (ну например как реалтаймовую замену фона в видео звонках) - думаю желающие купить будут :)
-
Какой кошмар. Мы еще и в телевизор попали. Журналюги как обычно все переврали.
-
http://www.youtube.com/watch?v=MN6l0jnGi1s
-
А вот более вменяемый репортаж с хакотона: http://www.youtube.com/watch?v=OhZUkSxLfik
Чем менее "центральный" канал, тем более вменяемые репортажи.
-
http://www.youtube.com/watch?v=MN6l0jnGi1s
гыыы угадал, однако :D - ничего ужасного - море бабла в перспективе.. кстати.. картинку увидел... ;)
-
А вот более вменяемый репортаж с хакотона: http://www.youtube.com/watch?v=OhZUkSxLfik
Чем менее "центральный" канал, тем более вменяемые репортажи.
но картинки по вашему проекту нет, однако ;)
-
А вот более вменяемый репортаж с хакотона: http://www.youtube.com/watch?v=OhZUkSxLfik
Чем менее "центральный" канал, тем более вменяемые репортажи.
но картинки по вашему проекту нет, однако ;)
А у нас интервью и не брали. Вообще нам не до того было - мы работали :-)
Это робототехники могли себе позволить иметь "менеджера" - их шесть человек было. Результатом работы получилась машинка на ардуине управляемая через WiFi.
-
Да, вот освещение всего этого во вконтакте: http://vk.com/hackday25
Там выложили все фотки только что.
А вот в фейспалме: http://www.facebook.com/events/387088108064788/
-
:)
-
http://www.youtube.com/watch?v=MN6l0jnGi1s
Опубликовано 15.04.2013
Описание отсутствует.
Категория Животные
Лицензия Стандартная лицензия YouTube
-
http://www.youtube.com/watch?v=MN6l0jnGi1s
Опубликовано 15.04.2013
Описание отсутствует.
Категория Животные
Лицензия Стандартная лицензия YouTube
Ну да, в мире животных же!
-
Кстати, в качестве одного из побочных эффектов победы получился инвайт на хабр. Так что теперь я могу нести
ахинеюслово о Обероне в промышленных масштабах.
-
Кстати, в качестве одного из побочных эффектов победы получился инвайт на хабр. Так что теперь я могу нести ахинеюслово о Обероне в промышленных масштабах.
А не имеешь морального права -- инвайт же тебе не за оберон дали! )))
-
Хорошая новость. Не думал запилить туда статью о мероприятии? :)
-
Кстати, в качестве одного из побочных эффектов победы получился инвайт на хабр. Так что теперь я могу нести ахинеюслово о Обероне в промышленных масштабах.
А не имеешь морального права -- инвайт же тебе не за оберон дали! )))
Я никогда не понимал что такое "моральное право", так что я это понятие просто игнорирую по жизни :-)
-
Хорошая новость. Не думал запилить туда статью о мероприятии? :)
Статью о мероприятии напишет и опубликует Интел в своем блоге на хабре (вероятно это будет завтра). По идее там должны быть и видюшки с демонстрацией нашего поделия - сегодня как раз отгрузил Интелу оные видео (скринкапчи).
-
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
-
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Ну, до известности info21 мне прыгать и прыгать :-)
-
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Ну, до известности info21 мне прыгать и прыгать :-)
:) Не стоит прыгать на опытного "боксера".. к тому же вы в разных весовых категориях...
-
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Ну, до известности info21 мне прыгать и прыгать :-)
:) Не стоит прыгать на опытного "боксера".. к тому же вы в разных весовых категориях...
У нас скорее даже виды спорта разные :-)
-
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Ну, до известности info21 мне прыгать и прыгать :-)
info21 мало кто знает, а вот до Сергея Губанова и правда долго тянуться придётся )))
-
http://habrahabr.ru/company/intel/blog/176985/
-
Опубликован отчет от организаторов. http://hackday.ru/events/hackday-25/report
Там в основном перечень и описание доплывших проектов, номинации и статистика.
Примечательно что среди победителей в разных номинациях нет ни одного веб-проекта. И это радует.
-
А что за проблемы были с производительностью блюра? Оно же на 640 * 480 = 307'200 должно со скоростью света летать?.. ???
for (int n = 1; n < N; n++)
{
for (int y = 1; y < 639; y++)
{
for (int x = 1; x < 479; x++)
{
b[y, x] = 0.25 * (a[y - 1, x] + a[y + 1, x] + a[y, x - 1] + a[y, x + 1]);
}
}
for (int y = 1; y < 639; y++)
{
for (int x = 1; x < 479; x++)
{
a[y, x] = 0.25 * (b[y - 1, x] + b[y + 1, x] + b[y, x - 1] + b[y, x + 1]);
}
}
}
-
Ну, то есть наоброт, y < 479, а x < 639.
-
А что за проблемы были с производительностью блюра? Оно же на 640 * 480 = 307'200 должно со скоростью света летать?.. ???
for (int n = 1; n < N; n++)
{
for (int y = 1; y < 639; y++)
{
for (int x = 1; x < 479; x++)
{
b[y, x] = 0.25 * (a[y - 1, x] + a[y + 1, x] + a[y, x - 1] + a[y, x + 1]);
}
}
for (int y = 1; y < 639; y++)
{
for (int x = 1; x < 479; x++)
{
a[y, x] = 0.25 * (b[y - 1, x] + b[y + 1, x] + b[y, x - 1] + b[y, x + 1]);
}
}
}
У нас блюр был довольно сильный - диаметр 40. Причем он делался практически по определению эффекта боке, то есть за один проход. Не оптимизированный алгоритм кушал O(W*H*D^2), оптимизированный O(W*H*D). Я затрудняюсь прямо сейчас пересчитать какая будет сложность твоего алгоритма для достижения той же силы эффекта. То есть надо как-то пересчитать N в D.
Многопроходный блюр, как у тебя, надо будет попробовать. Может даст или лучший эффект, или лучшую производительность.
-
Да, и нужно учесть еще один нюанс - это все должно было быстро работать на ультрабуке, то есть на системе с порезанными частотами и хреновым охлаждением (из за чего оно склонно еще понижать частоту процессора).
-
а что там считать то.. t=2*N*W*H*d - здесь d -время вычисления элемента массивов a,b
-
а что там считать то.. t=2*N*W*H*d - здесь d -время вычисления a(b) [j]
Я же уточнил - сложность в переводе N в D, где D - диаметр ядра свертки в нашем блюре, а N это число проходов в блюре Сергея. То есть чтобы эффект был если не эквивалентен, то по крайней мере максимально похож.
-
а что там считать то.. t=2*N*W*H*d - здесь d -время вычисления a(b) [j]
Я же уточнил - сложность в переводе N в D, где D - диаметр ядра свертки в нашем блюре, а N это число проходов в блюре Сергея. То есть чтобы эффект был если не эквивалентен, то по крайней мере максимально похож.
не надо переводить.. достаточно проверить картинку при N=sqrt(D/2)~5
-
а что там считать то.. t=2*N*W*H*d - здесь d -время вычисления a(b) [j]
Я же уточнил - сложность в переводе N в D, где D - диаметр ядра свертки в нашем блюре, а N это число проходов в блюре Сергея. То есть чтобы эффект был если не эквивалентен, то по крайней мере максимально похож.
не надо переводить.. достаточно проверить картинку при N=sqrt(D/2)~5
Дык да. Но для этого мне надо в код лезть, камеру расчехлять. Я не могу прямо сейчас проверить. Потому и написал :-)
-
не надо переводить.. достаточно проверить картинку при N=sqrt(D/2)~5
что- то день не верный... при N=D/2=20 должна наблюдаться сходная с вашей производительность алгоритма Сергея
(если ваши d имеют одинаковую вычислительную сложность), нужно оценить только качество картинки.
-
За одно N делается два прохода, так что радиус 40 это примерно N=20.
Померил на i7 2600K. Да, действительно ТОРМОЗИТ!!!
namespace ConsoleApplication67
{
class Program
{
static void Main (string[] args)
{
const int H = 480;
const int W = 640;
double[,] a = new double[H, W];
double[,] b = new double[H, W];
System.Random r = new System.Random();
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
for (int N = 1; N < 21; N++)
{
for (int y = 0; y < H; y++)
{
for (int x = 0; x < W; x++)
{
a[y, x] = r.NextDouble();
}
}
timer.Start();
for (int n = 0; n < N; n++)
{
for (int y = 1; y < H-1; y++)
{
for (int x = 1; x < W-1; x++)
{
b[y, x] = 0.25 * (a[y - 1, x] + a[y + 1, x] + a[y, x - 1] + a[y, x + 1]);
}
}
for (int y = 1; y < H-1; y++)
{
for (int x = 1; x < W-1; x++)
{
a[y, x] = 0.25 * (b[y - 1, x] + b[y + 1, x] + b[y, x - 1] + b[y, x + 1]);
}
}
}
timer.Stop();
System.Console.WriteLine("N={0}, t={1} seconds", N, timer.Elapsed.TotalSeconds);
}
System.Console.ReadLine();
}
}
}
N=1, t=0.0025269 seconds
N=2, t=0.0070202 seconds
N=3, t=0.0136165 seconds
N=4, t=0.0224988 seconds
N=5, t=0.0334735 seconds
N=6, t=0.046629 seconds
N=7, t=0.0619759 seconds
N=8, t=0.0795237 seconds
N=9, t=0.0992912 seconds
N=10, t=0.1212711 seconds
N=11, t=0.1455351 seconds
N=12, t=0.1721706 seconds
N=13, t=0.2007201 seconds
N=14, t=0.2315255 seconds
N=15, t=0.2645839 seconds
N=16, t=0.2999006 seconds
N=17, t=0.3371634 seconds
N=18, t=0.3767296 seconds
N=19, t=0.4186069 seconds
N=20, t=0.462693 seconds
При N=20 на i7 2600K будет 2 FPS.
Замена double на int ускорения не даёт.
-
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
-
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
то же верно... Алексей - плиз сделайте ролик на черным (белом) фоне обычным xor'ом- заценим качество фильтрации.
-
За одно N делается два прохода, так что радиус 40 это примерно N=20.
Померил на i7 2600K. Да, действительно ТОРМОЗИТ!!!
N=1, t=0.0025269 seconds
N=2, t=0.0070202 seconds
N=3, t=0.0136165 seconds
N=4, t=0.0224988 seconds
N=5, t=0.0334735 seconds
N=6, t=0.046629 seconds
N=7, t=0.0619759 seconds
N=8, t=0.0795237 seconds
N=9, t=0.0992912 seconds
N=10, t=0.1212711 seconds
N=11, t=0.1455351 seconds
N=12, t=0.1721706 seconds
N=13, t=0.2007201 seconds
N=14, t=0.2315255 seconds
N=15, t=0.2645839 seconds
N=16, t=0.2999006 seconds
N=17, t=0.3371634 seconds
N=18, t=0.3767296 seconds
N=19, t=0.4186069 seconds
N=20, t=0.462693 seconds
При N=20 на i7 2600K будет 2 FPS.
Замена double на int ускорения не даёт.
Пару замечаний:
1) Полученные fsp нужно разделить еще на 3, так как нам нужно все три канала обрабатывать (r,g,b).
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
-
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
Таймер не сбрасывается. Надо перед timer.Start(); указать timer.Reset();
-
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.
И нет, с блюром/боке в общем то никаких непреодолимых проблем сейчас нет - все будет быстро и красиво :-) А вот за 48 часов написать прототип, чтобы и размывал хорошо, и вообще работал как надо, было сложно. да.
-
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
потому, что у него есть внешний цикл по N ([1..20]) и внутренний по n[0..N-1] которые дают ~N*N*W*H/2=N^2*W*H/2
-
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.
это делается не ради красоты.. просто хотелось бы оценить качество фильтрации
-
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.
Короче, задача сводится к алгоритму выделения краёв силуэта человека/людей...
-
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.
Короче, задача сводится к алгоритму выделения краёв силуэта человека/людей...
Нет, не сводится.
-
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.
это делается не ради красоты.. просто хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
-
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.
это делается не ради красоты.. просто хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
... того что попало в "глубину" фокуса.. т.е человека (можно предмет.. например настольную лампу).. Я ведь правильно понял, что вы ловите не "контур" человека.. а все то что расположено ближе некоторого расстояния от детектора()?
-
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.
это делается не ради красоты.. просто хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
... того что попало в "глубину" фокуса.. т.е человека (можно предмет.. например настольную лампу).. Я ведь правильно понял, что вы ловите не "контур" человека.. а все то что расположено ближе некоторого расстояния от детектора()?
Да. на человека нам пока что плевать.
Собственно в плане отсечения там есть одна проблемка - там нет взаимнооднозначного отображения карты глубин и цветной картинки, также у них разные разрешения, также там есть всякие забавные смещения и искажения. Для прототипа на хакатоне получилось как-то магическими константами и другими костылями всё это заткнуть чтобы выглядело не слишком отвратно, но ясно что все это нужно переделывать по нормальному (а для этого нужно набрать экспериментальных данных, чтобы выяснить некоторые характеристики камеры). Вот закончу битву с виртуальными камерами, и начну возиться с этим вот.
-
если это так, то предположим что вы можете отфильтровать все то что ближе 1 метра от камеры... хотелось бы увидеть предмет (можно настольную лампу) , который находясь в фокусе постепенно удаляется из него и эта картинка должна накладываться на белый фон...
-
если это так, то предположим что вы можете отфильтровать все то что ближе 1 метра от камеры... хотелось бы увидеть предмет (можно настольную лампу) , который находясь в фокусе постепенно удаляется из него и эта картинка должна накладываться на белый фон...
Прямо сейчас ничего не сниму и не выложу - не до того. Так что пока из доступных видео есть только видео снятое по просьбе Интела для их хабрастатьи (http://habrahabr.ru/company/intel/blog/176985/): http://www.youtube.com/watch?feature=player_embedded&v=gy2oWQgv348
Также было снято еще одно, более длинное где я играюсь с этим самым виртуальным "фокусом". Попробую выложить сегодня ночером.
Эффектов сглаживания переходов в той версии, что на видео, у нас нет, так что там либо данный пиксель размывается, либо не размывается вовсе, ничего не маскируется, всё на виду и четко видна граница отсечения :-)
-
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
Таймер не сбрасывается. Надо перед timer.Start(); указать timer.Reset();
Точно, таймер не сбрасывается!
Итак, правильные результаты:
N=1, t=0.003471 seconds
N=2, t=0.0322118 seconds
N=3, t=0.009048 seconds
N=4, t=0.0119841 seconds
N=5, t=0.0149944 seconds
N=6, t=0.0179927 seconds
N=7, t=0.0210585 seconds
N=8, t=0.0256923 seconds
N=9, t=0.0274187 seconds
N=10, t=0.0306925 seconds
N=11, t=0.0347208 seconds
N=12, t=0.0362271 seconds
N=13, t=0.0395649 seconds
N=14, t=0.0422456 seconds
N=15, t=0.0448891 seconds
N=16, t=0.0485976 seconds
N=17, t=0.0517676 seconds
N=18, t=0.0574415 seconds
N=19, t=0.0571965 seconds
N=20, t=0.0606412 seconds
То есть при N=20 получаем 16.5 FPS (или 5.5 FPS если делать это для трёх каналов в однопоточной программе).
Требуемых 30 FPS всё равно не получилось.
-
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
Таймер не сбрасывается. Надо перед timer.Start(); указать timer.Reset();
Точно, таймер не сбрасывается!
Итак, правильные результаты:
N=1, t=0.003471 seconds
N=2, t=0.0322118 seconds
N=3, t=0.009048 seconds
N=4, t=0.0119841 seconds
N=5, t=0.0149944 seconds
N=6, t=0.0179927 seconds
N=7, t=0.0210585 seconds
N=8, t=0.0256923 seconds
N=9, t=0.0274187 seconds
N=10, t=0.0306925 seconds
N=11, t=0.0347208 seconds
N=12, t=0.0362271 seconds
N=13, t=0.0395649 seconds
N=14, t=0.0422456 seconds
N=15, t=0.0448891 seconds
N=16, t=0.0485976 seconds
N=17, t=0.0517676 seconds
N=18, t=0.0574415 seconds
N=19, t=0.0571965 seconds
N=20, t=0.0606412 seconds
То есть при N=20 получаем 16.5 FPS (или 5.5 FPS если делать это для трёх каналов в однопоточной программе).
Требуемых 30 FPS всё равно не получилось.
Тут возможны еще несколько нюансов которые могут как-то влиять на производительность:
1) на самом деле при N=13 тоже размытие может быть вполне вменяемым. Так что пусть N=13.
2) У нас не двумерный, а одномерный массив на входе (в котором у нас r,g,b сразу).
3) Мы все же писали на C++, это может дать прирост производительности. Кроме того, нужно проверять не в Debug-сборке.
-
2) У нас не двумерный, а одномерный массив на входе (в котором у нас r,g,b сразу).
нужно проверять не в Debug-сборке.
Еще точнее - у нас просто указатель на область памяти. Соответственно при каждом обращении нет никаких проверок на выход за границы массива.
-
Прямо сейчас ничего не сниму и не выложу - не до того.
и не надо.. важно понять , для чего это делается - для подбора адекватной модели очистки того, что попало в фокус.. по херне которой вы скормили журналюгам и участникам конкурса (и на которую вы дали ссылки) это не сделаешь... ;)
-
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.
Короче, задача сводится к алгоритму выделения краёв силуэта человека/людей...
Нет, не сводится.
но тем не менее такой подход имеет право на жизнь и существует.. в видеорегистраторах (напр. VideoNET) - он не требует специальных камер с захватом глубины... при этом подходе обьект фиксируется по небольшому движению - (например , покачиванию головы) - а дальше идет его удержание и регистрация эволюции (изменений ) со временем..- недостаток подхода.. окружение должно быть статичным....
-
Прямо сейчас ничего не сниму и не выложу - не до того.
и не надо.. важно понять , для чего это делается - для подбора адекватной модели очистки того, что попало в фокус.. по херне которой вы скормили журналюгам и участникам конкурса (и на которую вы дали ссылки) это не сделаешь... ;)
Для подбора адекватной модели не достаточно того что ты попросил. Нужно одновременно иметь depth-картинку и color-картинку. Причем depth нельзя выкладывать в виде видео (или в виде какого-нибудь png), ибо в видео не видно процентов 70 информации что в depth содержится. Также это все нельзя жать любыми видеокодеками что жмут с потерями (h263, h264 и так далее).
-
Прямо сейчас ничего не сниму и не выложу - не до того.
и не надо.. важно понять , для чего это делается - для подбора адекватной модели очистки того, что попало в фокус.. по херне которой вы скормили журналюгам и участникам конкурса (и на которую вы дали ссылки) это не сделаешь... ;)
Для подбора адекватной модели не достаточно того что ты попросил. Нужно одновременно иметь depth-картинку и color-картинку
а я и не говорил, что этого достаточно :D - просто по тому что вы дали вообще ничего не скажешь.. так поиграться только...
-
а я и не говорил, что этого достаточно :D - просто по тому что вы дали вообще ничего не скажешь.. так поиграться только...
Ну, дык, продухт же! Точнее прототип оного. Показывает конечный результат, по которому юзер и оцениват нужно оно ему или не нужно. Кстати, народ на хакатоне подходил, игрался живьем с нашей прогой.
Вообще, по хорошему, у PerC SDK есть свой формат записи "видео", где сохраняется действительно всё. Затем это файло можно через этот же PerC SDK считать и пробовать как-то обработать. Может быть полезно тем, у кого нет камеры, а повозиться хочется. Могу наснимать таких вот "видео" и выложить куда-то.
PS. PerC SDK API доступен для C++ и C#. Естественно только под винду. Винда нужна не старее Win7 SP1.
-
Возможно кто-то даже научится со всем этим работать на Обероне, или там на КП в ББ, и заткнет нас, и других конкурсантов (уже большого конкурса Intel) за пояс, на деле доказав, что КП/ББ для подобных задач действительно дает преимущество в плане скорости и качества разработки, и правильные циклы таки рулят :-)
PS. Большой конкурс Интела это вот это: http://perceptualchallenge.intel.com ну и описалово на хабре: http://habrahabr.ru/company/intel/blog/166759/
-
Еще точнее - у нас просто указатель на область памяти. Соответственно при каждом обращении нет никаких проверок на выход за границы массива.
Перешёл в unsafe C# и убрал проверку индексов массивов. Ускорилось почти в 3 раза. В однопоточной RGB FPS = 30 при N = 10 (R = 20).
N = 1 (R = 2), dt=0.0017206 seconds, FPS = 581 (RGB FPS = 193)
N = 2 (R = 4), dt=0.0024114 seconds, FPS = 414 (RGB FPS = 138)
N = 3 (R = 6), dt=0.0032783 seconds, FPS = 305 (RGB FPS = 101)
N = 4 (R = 8 ), dt=0.0047132 seconds, FPS = 212 (RGB FPS = 70)
N = 5 (R = 10), dt=0.0055715 seconds, FPS = 179 (RGB FPS = 59)
N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)
N = 8 (R = 16), dt=0.009428 seconds, FPS = 106 (RGB FPS = 35)
N = 9 (R = 18), dt=0.0100056 seconds, FPS = 99 (RGB FPS = 33)
N = 10 (R = 20), dt=0.0109701 seconds, FPS = 91 (RGB FPS = 30)
N = 11 (R = 22), dt=0.0120318 seconds, FPS = 83 (RGB FPS = 27)
N = 12 (R = 24), dt=0.0131353 seconds, FPS = 76 (RGB FPS = 25)
N = 13 (R = 26), dt=0.0149416 seconds, FPS = 66 (RGB FPS = 22)
N = 14 (R = 28), dt=0.0156479 seconds, FPS = 63 (RGB FPS = 21)
N = 15 (R = 30), dt=0.0164521 seconds, FPS = 60 (RGB FPS = 20)
N = 16 (R = 32), dt=0.0175388 seconds, FPS = 57 (RGB FPS = 19)
N = 17 (R = 34), dt=0.0185114 seconds, FPS = 54 (RGB FPS = 18)
N = 18 (R = 36), dt=0.0286554 seconds, FPS = 34 (RGB FPS = 11)
N = 19 (R = 38), dt=0.020801 seconds, FPS = 48 (RGB FPS = 16)
N = 20 (R = 40), dt=0.0218066 seconds, FPS = 45 (RGB FPS = 15)
namespace ConsoleApplication67
{
class Program
{
static unsafe void Main (string[] args)
{
const int H = 480;
const int W = 640;
double[] a = new double[H * W];
double[] b = new double[H * W];
System.Random r = new System.Random();
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
for (int N = 1; N < 21; N++)
{
fixed (double* pa = &a[0])
{
for (int y = 0; y < H; y++)
{
for (int x = 0; x < W; x++)
{
*(pa + H *y + x) = r.Next();
}
}
}
timer.Reset();
timer.Start();
fixed (double* pa = &a[0])
{
fixed (double* pb = &b[0])
{
for (int n = 0; n < N; n++)
{
for (int y = 1; y < H-1; y++)
{
for (int x = 1; x < W-1; x++)
{
*(pb + H * y + x) = 0.25 * (*(pa + H * (y - 1) + x)
+ *(pa + H * (y + 1) + x)
+ *(pa + H * y + x - 1)
+ *(pa + H * y + x + 1));
}
}
for (int y = 1; y < H-1; y++)
{
for (int x = 1; x < W-1; x++)
{
*(pa + H * y + x) = 0.25 * (*(pb + H * (y - 1) + x)
+ *(pb + H * (y + 1) + x)
+ *(pb + H * y + x - 1)
+ *(pb + H * y + x + 1));
}
}
}
}
}
timer.Stop();
double dt = timer.Elapsed.TotalSeconds;
System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3} (RGB FPS = {4})",
N, 2*N, dt, (int)(1.0/dt), (int)(1.0/(3*dt)));
}
System.Console.ReadLine();
}
}
}
-
Кстати если из цветового пространства RGB перейти в цветовое пространство навроде Lab, то сильно размыть достаточно будет только один канал L. Каналы a и b можно размыть немножко или не трогать вообще. Потом перейти обратно в RGB. Правда в настоящий Lab переводится дорого (там формулы нелинейные), а в "облегченный" (например тупо разностный: L = G, a = G - R, b = G - B) - конечный результат может не понравится по цветам, хотя для вебкамеры наверное сойдёт.
-
Еще точнее - у нас просто указатель на область памяти. Соответственно при каждом обращении нет никаких проверок на выход за границы массива.
Перешёл в unsafe C# и убрал проверку индексов массивов. Ускорилось почти в 3 раза. В однопоточной RGB FPS = 30 при N = 10 (R = 20).
N = 1 (R = 2), dt=0.0017206 seconds, FPS = 581 (RGB FPS = 193)
N = 2 (R = 4), dt=0.0024114 seconds, FPS = 414 (RGB FPS = 138)
N = 3 (R = 6), dt=0.0032783 seconds, FPS = 305 (RGB FPS = 101)
N = 4 (R = 8 ), dt=0.0047132 seconds, FPS = 212 (RGB FPS = 70)
N = 5 (R = 10), dt=0.0055715 seconds, FPS = 179 (RGB FPS = 59)
N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)
N = 8 (R = 16), dt=0.009428 seconds, FPS = 106 (RGB FPS = 35)
N = 9 (R = 18), dt=0.0100056 seconds, FPS = 99 (RGB FPS = 33)
N = 10 (R = 20), dt=0.0109701 seconds, FPS = 91 (RGB FPS = 30)
N = 11 (R = 22), dt=0.0120318 seconds, FPS = 83 (RGB FPS = 27)
N = 12 (R = 24), dt=0.0131353 seconds, FPS = 76 (RGB FPS = 25)
N = 13 (R = 26), dt=0.0149416 seconds, FPS = 66 (RGB FPS = 22)
N = 14 (R = 28), dt=0.0156479 seconds, FPS = 63 (RGB FPS = 21)
N = 15 (R = 30), dt=0.0164521 seconds, FPS = 60 (RGB FPS = 20)
N = 16 (R = 32), dt=0.0175388 seconds, FPS = 57 (RGB FPS = 19)
N = 17 (R = 34), dt=0.0185114 seconds, FPS = 54 (RGB FPS = 18)
N = 18 (R = 36), dt=0.0286554 seconds, FPS = 34 (RGB FPS = 11)
N = 19 (R = 38), dt=0.020801 seconds, FPS = 48 (RGB FPS = 16)
N = 20 (R = 40), dt=0.0218066 seconds, FPS = 45 (RGB FPS = 15)
Угу. Это уже похоже на ту производительность, которую мы в конце концов получили в ту субботу (ну может раза в два медленней у тебя пока, надо будет проверить).
Отключение проверок границ массивов (переход на указатели в случае C#) и переход на unsafe ускоряет приложение в разы. Похоже в debug-версии C++ в MSVS тоже проверяются и границы массивов и вообще оно все такое safe, ибо переход на релиз-версию нам тоже дало прибавку производительности в 3 раза примерно.
Еще нюанс - ты тут экономишь на конвертации из double в byte (то есть по просту не конвертируешь, изображения тут у тебя сразу в double). В некоторых случаях это довольно дорогостоящая конвертация.
-
Кстати если из цветового пространства RGB перейти в цветовое пространство навроде Lab, то сильно размыть достаточно будет только один канал L. Каналы a и b можно размыть немножко или не трогать вообще. Потом перейти обратно в RGB. Правда в настоящий Lab переводится дорого (там формулы нелинейные), а в "облегченный" (например тупо разностный: L = G, a = G - R, b = G - B) - конечный результат может не понравится по цветам, хотя для вебкамеры наверное сойдёт.
Я тогда думал о работе в YUV, но решил что на допил уйдет слишком много времени, поэтому остались на RGB.
-
Я тут немного поисследовал. В общем, во-первых я переписал последний вариант Сергея на полноценный RGB и байтовыми буферами. Также N я фиксировал (N=13), но зато тест идет не по одному кадру, а по 1000 кадрам (соответственно замеряем время для 1000 кадров - так точнее, и так реалистичнее (от длительного нагрева проц. может снизить частоту)).
Во-вторых я реализовал алгоритм Сергея на С++, чтобы можно было сравнить производительность собственно языков.
В-третьих я из нашего прототипа вытащил алгоритм размытия в отдельный проект. И замерял производительность именно этого алгоритма (а не всего pipeline'а, как раньше).
Итак, вначале результаты. Напомню, что радиус размытия (N) = 13. Обрабатываются все три канала. Число обрабатываемых кадров = 1000.
C# (алгоритм Cергея):
time: 107 seconds
fps : 9.35
С++ (алгоритм Сергея):
time: 96 seconds
fps : 10.42
C++ (наш с Надей алгоритм):
time: 22 seconds
fps : 45.45 fps
Тестировалось всё ровно на том же ультрабуке, что и демонстрировалось на хакатоне.
Далее исходники:
С#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication5
{
class Program
{
static unsafe void Main(string[] args)
{
const int H = 480;
const int W = 640;
byte[] a = new byte[H * W * 3];
byte[] b = new byte[H * W * 3];
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
const int N = 13;
timer.Reset();
timer.Start();
const int frames = 1000;
for (int nn = 0; nn<frames; nn++)
{
fixed (byte* pa = &a[0])
{
fixed (byte* pb = &b[0])
{
for (int n = 0; n < N; n++)
{
for (int y = 1; y < H - 1; y++)
{
for (int x = 1; x < W - 1; x++)
{
for (int color_shift = 0; color_shift < 3; color_shift++)
{
*(pb + (H * y + x) * 3 + color_shift) = (byte)(0.25 * (*(pa + (H * (y - 1) + x) * 3 + color_shift)
+ *(pa + (H * (y + 1) + x) * 3 + color_shift)
+ *(pa + (H * y + x - 1) * 3 + color_shift)
+ *(pa + (H * y + x + 1) * 3 + color_shift)));
}
}
}
for (int y = 1; y < H - 1; y++)
{
for (int x = 1; x < W - 1; x++)
{
for (int color_shift = 0; color_shift < 3; color_shift++)
{
*(pa + (H * y + x) * 3 + color_shift) = (byte)(0.25 * (*(pb + (H * (y - 1) + x) * 3 + color_shift)
+ *(pb + (H * (y + 1) + x) * 3 + color_shift)
+ *(pb + (H * y + x - 1) * 3 + color_shift)
+ *(pb + (H * y + x + 1) * 3 + color_shift)));
}
}
}
}
}
}
}
timer.Stop();
double dt = timer.Elapsed.TotalSeconds;
System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3}",
N, 2 * N, dt, (frames / dt));
System.Console.ReadLine();
}
}
}
С++ (алгоритм Сергея):
#include <iostream>
#include <ctime>
const int width = 640;
const int height = 480;
const size_t blurRange = 13;
enum Color {
RED = 0,
GREEN,
BLUE
};
int index(int x, int y, Color color) {
return width*y*3+x*3+color;
}
int main()
{
volatile unsigned char* volatile in = new unsigned char[width*height*3];
volatile unsigned char* volatile out = new unsigned char[width*height*3];
time_t begin;
time(&begin);
const int frames = 1000;
for (int nn=0; nn<frames; nn++) {
for (int i=0; i<blurRange; i++) {
for (int y=1; y<height-1; y++)
for (int x=1; x<width-1; x++) {
out[index(x,y,RED)]= 0.25*(
(float)in[index(x,y-1,RED)]+
in[index(x,y+1,RED)]+
in[index(x-1,y,RED)]+
in[index(x+1,y,RED)]);
out[index(x,y,GREEN)]= 0.25*(
(float)in[index(x,y-1,GREEN)]+
in[index(x,y+1,GREEN)]+
in[index(x-1,y,GREEN)]+
in[index(x+1,y,GREEN)]);
out[index(x,y,BLUE)]= 0.25*(
(float)in[index(x,y-1,BLUE)]+
in[index(x,y+1,BLUE)]+
in[index(x-1,y,BLUE)]+
in[index(x+1,y,BLUE)]);
}
for (int y=1; y<height-1; y++)
for (int x=1; x<width-1; x++) {
in[index(x,y,RED)]=0.25*(
(float)out[index(x,y-1,RED)]+
out[index(x,y+1,RED)]+
out[index(x-1,y,RED)]+
out[index(x+1,y,RED)]);
in[index(x,y,GREEN)]=0.25*(
(float)out[index(x,y-1,GREEN)]+
out[index(x,y+1,GREEN)]+
out[index(x-1,y,GREEN)]+
out[index(x+1,y,GREEN)]);
in[index(x,y,BLUE)]=0.25*(
(float)out[index(x,y-1,BLUE)]+
out[index(x,y+1,BLUE)]+
out[index(x-1,y,BLUE)]+
out[index(x+1,y,BLUE)]);
}
}
}
time_t end;
time(&end);
auto seconds = difftime(end, begin);
std::cout << float(frames)/seconds << " " << seconds << std::endl;
}
С++ (наш алгоритм):
#include <iostream>
#include <ctime>
const int width = 640;
const int height = 480;
const size_t blurRange = 13;
enum Color {
RED = 0,
GREEN,
BLUE
};
int index(int x, int y, Color color) {
return width*y*3+x*3+color;
}
template <size_t N>
struct ring_buffer {
float buf[N];
size_t head;
size_t size;
ring_buffer():head(0), size(0) {memset(buf, 0, sizeof(buf));}
void push_back(float v) {
if (++head >= N) {head=0;}
if (size<N) size++;
buf[head]=v;
}
float back() {return buf[head];}
float front() {return buf[head!=N-1?head+1:0];}
};
int main()
{
volatile unsigned char* volatile in = new unsigned char[width*height*3];
volatile unsigned char* volatile out = new unsigned char[width*height*3];
time_t begin;
time(&begin);
const int frames = 1000;
for (int nn=0; nn<frames; nn++) {
for (int y=blurRange; y<height-blurRange; y++) {
float red = 0;
float green = 0;
float blue = 0;
ring_buffer<blurRange*2> redRows ;
ring_buffer<blurRange*2> blueRows;
ring_buffer<blurRange*2> greenRows;
for (int x=blurRange; x<width-blurRange; x++) {
float vr = 0;
float vg = 0;
float vb = 0;
for (int y1 = y-blurRange; y1<y+blurRange; y1++) {
vr += in[index(x,y1,RED) ];
vg += in[index(x,y1,GREEN)];
vb += in[index(x,y1,BLUE) ];
}
vr = vr/(blurRange*blurRange*4.0);
vg = vg/(blurRange*blurRange*4.0);
vb = vb/(blurRange*blurRange*4.0);
auto front_r = redRows.front();
red += vr - redRows.front();
green += vg - greenRows.front();
blue += vb - blueRows.front();
redRows.push_back(vr);
blueRows.push_back(vb);
greenRows.push_back(vg);
out[index(x,y,RED) ] = red*(blurRange*2.0/redRows.size);
out[index(x,y,GREEN)] = green*(blurRange*2.0/greenRows.size);
out[index(x,y,BLUE) ] = blue*(blurRange*2.0/blueRows.size);
}
}
}
time_t end;
time(&end);
auto seconds = difftime(end, begin);
std::cout << float(frames)/seconds << " " << seconds << std::endl;
return 0;
}
-
В OpenBSD есть утилита APM. В линуксе подобного нет? Можно жёстко выставить минимальные частоты проца. Это должно повысить качество результата тестов.
-
for (int x = 1; x < W - 1; x++)
...
(*(pa + (H * (y - 1) + x) * 3
А вынос множителя за скобки прироста в производительности не даёт?
for (int x = 1; x < W * 3 - 3; x = x + 3)
-
В OpenBSD есть утилита APM. В линуксе подобного нет? Можно жёстко выставить минимальные частоты проца. Это должно повысить качество результата тестов.
В данном проекте целевая платформа - Windows. Соответственно компилятор/среда разработки - MSVS 2012.
Кроме того, жестко фиксировать - это слишком жестоко для ультрабука. Например как эта APM себя поведет с интеловской технологией Turbo Boost?
Ну и учти, что у нас тут первичны не тесты, а то как оно будет работать у пользователя. А у пользователя оно будет работать долго, постоянно и без фиксации частоты.
Кстати, 45 fps это конечно хорошо, но для продукта (а не прототипа) нам нужно еще повысить производительность этого эффекта как минимум в 8-10 раз. Причем эффект должен еще стать визуально красивее. И да, распараллеливать на несколько ядер CPU нельзя. Все должно пахать в одном потоке.
-
И вообще, можно же держать три указателя на три строки. Чтобы вычислять их однократно. И даже вычислять-то одну надо, остальные от неё на константу отличаются. Неужели то, что приведено в исходниках оптимизируется лучше, чем ручной вывод?
-
И вообще, можно же держать три указателя на три строки. Чтобы вычислять их однократно. И даже вычислять-то одну надо, остальные от неё на константу отличаются. Неужели то, что приведено в исходниках оптимизируется лучше, чем ручной вывод?
Ты про какой из двух алгоритмов говоришь? Ну, и вообще, show me code :-) Проверим.
-
В данном проекте целевая платформа - Windows.
На винде аналог точно есть.
Ну и учти, что у нас тут первичны не тесты, а то как оно будет работать у пользователя. А у пользователя оно будет работать долго, постоянно и без фиксации частоты.
То есть, вы будете приходить к каждому пользователю и проверять, что у них работает как надо? Как вы убедитесь, что оно работает быстро, если на частоту не обращаете внимание и не хотите знать производительности при минимальном задействовании процессора?
Если поставить минимальную частоту на проц, то, во-первых, будет известно, что при такой нагрузке он гарантированно не работает или наоборот - работает даже тогда. А во-вторых, будет известно, что полученные результаты верны, потому что частота проца не скакала.
-
я про исходник на шарпе
-
я про исходник на шарпе
Попробуй его модифицировать в соответствии со своим пониманием. Я прогоню тест.
-
Ой, а там H. Я, наверно, неправильно понял алгоритм.
*(pa + (H * (y + 1) + x) * 3 + color_shift)
Здесь должен быть H?
-
Ой, а там H. Я, наверно, неправильно понял алгоритм.
*(pa + (H * (y + 1) + x) * 3 + color_shift)
Здесь должен быть H?
Нет, видимо должен быть W. Косячок.
-
Вот как-то так. Но я не пишу на шарпе, поэтому мог сильно ошибиться. Да и вообще - фортранщики ликуют. Но всё же - как насчёт производительности?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication5
{
class Program
{
static unsafe void Main(string[] args)
{
const int H = 480;
const int W = 640;
byte[] a = new byte[H * W * 3];
byte[] b = new byte[H * W * 3];
byte* pa0, pa1, pa2f, pa2l, pa3, pb0, pb1, pb2f, pb2l, pb3;
int w = W * 3;
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
const int N = 13;
timer.Reset();
timer.Start();
const int frames = 1000;
for (int nn = 0; nn<frames; nn++)
{
fixed (byte* pa = &a[0])
{
fixed (byte* pb = &b[0])
{
for (int n = 0; n < N; n++)
{
pb0 = pb + w + 3; // другой массив
pa1 = pa + 3; // первый массив. первая строка
pa2f = pa + w; // первый массив. вторая строка
pa2l = pa1 + w + 3; // первый массив. вторая строка
pa3 = pa2 + w; // первый массив. третья строка
for (int y = 1; y < H - 1; y++)
{
for (int x = 1; x < w - 3; x = x + 3)
{
for (int color_shift = 0; color_shift < 3; color_shift++)
{
*pb0 = (byte)(0.25 * (*pa1
+ *pa3
+ *pa2f
+ *pa2l));
pb0 = pb0 + 1;
pa1 = pa1 + 1;
pa2f = pa2f + 1;
pa2l = pa2l + 1;
pa3 = pa3 + 1;
}
}
pb1 = pb1 + 6;
pa1 = pa1 + 6;
pa2f = pa2f + 6;
pa2l = pa2l + 6;
pa3 = pa3 + 6;
}
pa0 = pa + w + 3;
pb1 = pb + 3;
pb2f = pb + w;
pb2l = pb1 + w + 3;
pb3 = pb2 + w;
for (int y = 1; y < H - 1; y++)
{
for (int x = 1; x < w - 3; x++)
{
for (int color_shift = 0; color_shift < 3; color_shift++)
{
*pa0 = (byte)(0.25 * (*pb1
+ *pb3
+ *pb2f
+ *pb2l));
pa0 = pa0 + 1;
pb1 = pb1 + 1;
pb2f = pb2f + 1;
pb2l = pb2l + 1;
pb3 = pb3 + 1;
}
}
pa0 = pa0 + 6;
pb1 = pb1 + 6;
pb2f = pb2f + 6;
pb2l = pb2l + 6;
pb3 = pb3 + 6;
}
}
}
}
}
timer.Stop();
double dt = timer.Elapsed.TotalSeconds;
System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3}",
N, 2 * N, dt, (frames / dt));
System.Console.ReadLine();
}
}
}
-
Также N я фиксировал (N=13)
А ты точно фиксировал N=13, а не R=13? В моём алгоритме за один присест делается два прогона, так что моё N=13 соответствует радиусу размытия R=26.
Для R=13 у меня для double-сов будет что-то среднее между:
N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)
Твой алгоритм я чего-то не понял, наработался за день голова сейчас уже не варит...
Здесь должен быть H?
Нет, видимо должен быть W. Косячок.
Ага, у меня косяк, надо умножать на W.
-
Также N я фиксировал (N=13)
А ты точно фиксировал N=13, а не R=13? В моём алгоритме за один присест делается два прогона, так что моё N=13 соответствует радиусу размытия R=26.
Для R=13 у меня для double-сов будет что-то среднее между:
N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)
Да, вполне вероятно я ошибся. Впрочем, думаю завтра-или в пятницу я доберусь до уже визуализации, и будем сравнивать уже визуальные результаты :-) Там будет видно кто кому где эквивалентен.
-
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects
Кстати, для полноты результата не забудьте потом сделать второй плагин, который на стороне клиента в реальном времени будет восстанавливать изображение. За специальную плату...
-
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects
Кстати, для полноты результата не забудьте потом сделать второй плагин, который на стороне клиента в реальном времени будет восстанавливать изображение. За специальную плату...
После того как оно пройдет через h264, уже ничего не восстановить. Но если без кодека - то да, возможно :-)
-
Сегодня прилетело официальное оповещении о начале второй фазы большого Интеловского конкурса: https://perceptualchallenge.intel.com/
Intel wants to see your most innovative and unique games, productivity tools, user interfaces, or other innovative use of gesture, voice control, facial recognition, and augmented reality. The second phase of Intel’s Perceptual Computing Challenge is NOW OPEN FOR ENTRIES and with a grand-prize of $100,000 USD and thousands of dollars in even more prizing available in 4 different categories, this is not one to miss.
We invite you to submit your idea within the next six weeks. Idea submissions are due June 17th. The creators with the most innovative and impressive concepts will receive an interactive gesture camera in order to turn their idea into reality and will have until August to develop and deliver their demos.
Intel is also looking for developers and applications using this technology to showcase at industry events and market together with our new computing platforms.
Правила и описание: https://perceptualchallenge.intel.com/static/docs/terms_and_conditions.pdf
Победителей первой фазы этого большого конкурсе Интел можно глянуть тут:
http://software.intel.com/sites/campaigns/perceptualshowcase/
-
Мы прошли в финал.
Наше приложение (точнее идея, но у нас то уже приложение есть) стало одним из 750ти финалистов конкурса. Теперь к 26 августа нужно допилить приложение, сделать инсталлятор, написать документацию, снять видео и всё это выслать на суд Интелу. Результаты будут в середине сентября.
-
Отправили приложение на рассмотрение судей. Теперь результаты будут когда-то в октябре.
Про то как мы писали Virtualens и про конкурс: http://habrahabr.ru/post/195474/
-
Круто! Малаццы ))
-
Сравнение Virtualens с похожими технологиями сокрытия деталей фона: http://youtu.be/kBWvv802LHA
-
Перевели, дополнили и опубликовали нашу статью на IDZ: http://software.intel.com/en-us/articles/virtualens-how-we-made-our-project-for-intel-perceptual-computing-challenge