Pull to refresh
69
0
Андрей@AndrewSu

Разработчик интересных штук

Send message
Нехитрая с++ магия
template<class T>
struct v2
{
	T& x;
	T& y;
	v2(T& _x, T& _y) : x(_x), y(_y) {}
	template<class X>
	v2(const X& other) : x(other.x), y(other.y) {}

	template<class X>
	v2<T>& operator = (const X& other)
	{
		T   temp_x(other.x);
		T   temp_y(other.y);
		x = temp_x;
		y = temp_y;
		return *this;
	}
	v2<T>& operator = (const v2<T>& other)
	{
		T   temp_x(other.x);
		T   temp_y(other.y);
		x = temp_x;
		y = temp_y;
		return *this;
	}
};

template<class T>
struct vec2
{
	T       x;
	T       y;
	v2<T>   xx;
	v2<T>   yy;
	v2<T>   xy;
	v2<T>   yx;

	vec2(T _x, T _y) : x(_x), y(_y), xx(x, x), yy(y, y), xy(x, y), yx(y, x) {}

	template<class X>
	vec2(const X& other) : x(other.x), y(other.y) {}

	template<class X>
	vec2<T>& operator = (const X& other)
	{
		x = other.x;
		y = other.y;
		return *this;
	}
};


Позволяет творить невообразимые вещи
void test_swap()
{
	{
		vec2<float> point1(0, 0);
		vec2<float> point2(1, 2);

		point1.xy = point2;
		std::cerr << "point = " << point1.x << " " << point1.y << std::endl;

		point1.yx = point2;
		std::cerr << "point = " << point1.x << " " << point1.y << std::endl;
	}
	{
		vec2<float> point1(0, 0);
		vec2<float> point2(1, 2);

		point1 = point2.xy;
		std::cerr << "point = " << point1.x << " " << point1.y << std::endl;

		point1 = point2.yx;
		std::cerr << "point = " << point1.x << " " << point1.y << std::endl;
	}
	{
		vec2<float> point1(0, 0);
		vec2<float> point2(1, 2);

		point1.yx = point2.xx;
		std::cerr << "point = " << point1.x << " " << point1.y << std::endl;

		point1.xy = point2.yy;
		std::cerr << "point = " << point1.x << " " << point1.y << std::endl;
	}
	{
		vec2<float> point1(3, 4);
		point1.xy = point1.yx;
		std::cerr << "point = " << point1.x << " " << point1.y << std::endl;
	}
}

Например, для шейдера из статьи
uniform float value; //-> [0,1];
void main() {
    float val2 = value - 1.;
    gl_FragColor = vec4(value - val2);
}


Можно сделать так.
#include <iostream>

#define uniform
typedef float vec4;

struct shader_test
{
	vec4   gl_FragColor;
	shader_test():
		gl_FragColor(0) {}
#include "shader.glsl"
};

int main(int, char**)
{
	shader_test tst;
	tst.value = 0.5;
	tst.main();
	std::cerr << "gl_FragColor = " << tst.gl_FragColor << std::endl;
	return 0;
}

Однако это явный false alarm, а для статического анализатора нет ничего хуже ложных срабатываний — если его не отключат после первого крика «волки», то после десятого точно.

Порой это лучше, чем ничего, особенно если есть возможность поставить исключения после первого просмотра.

При этом на других языках можно хотя бы юнит-тесты писать, а тут — никак.

В своём небольшом проекте мы директивой #include включали код шейдеров в код на c++, и с помощью нескольких дефайнов и обёрток превращали шейдеры в обычные функции, которые возможно вызвать.
Если пользователям интерфейса пришлось узнавать о реализации, то что-то пошло не так…
А константность, на мой взгляд, нужна для облегчения использования интерфейса, а не наоборот. Она только подчёркивает свойства метода, позволяет избежать ошибок ещё во время компиляции.
Злоупотреблять, расставляя const где попало, конечно не стоит.

Отличная подборка материала про интерфейсы, и подводные камни в реализации и использовании.


Следует с осторожностью объявлять функции-члены интерфейсных классов как const.

Вы могли бы раскрыть здесь подробнее, какие сложности нас могут ожидать на этом пути.

В картинках поясню.
Мы по изображению считали индекс похожести на дорогу, а затем искали путь минимальной стоимости между двумя точками.
Исходное изображение


Индекс похожести на дорогу (чем чернее, тем лучше)


Увеличенный фрагмент дороги


Делаем небольшой шаг в направлении сосуда и попадаем в новый воксель

Если пользователь отмечает две точки сосуда, то вы можете методом поиска кратчайшего пути найти весь сосуд между ними. Это ещё решит проблему с "разрывами" сосудов. Мы подобное делали на сходных объёмах данных, правда в 2D изображениях.
Может быть будет возможно отказаться от сглаживания гауссианами, я так понимаю, что сосудистость резко возрастает к центру, а алгоритму поиска пути только и нужно, чтобы сосуд резко выделялся на фоне. Тогда линия пойдёт ровно по центру.

На эту тему есть отличный рассказ А.Азимова "Все грехи мира". И про доступ к информации о человеке и про предсказание преступлений, и про то, чем это может обернуться.

Может, вообще другое лицо дорисовать, смотря, как обучение проводить.

Дело скорее в отсутствии качественного исходника.
Здесь источником информации является обучающая выборка. Для улучшения фильмов этого вполне достаточно. А для «уникальных» данных сеть додумает «как в кино». Для некоторых областей результат будет неприменим.
В коде ничего необычного нет. Он не сильно отличается от того, что содержится в примерах по OpenCV. Непосредственно по вычитанию фона можно посмотреть здесь, а по фильтрации здесь и здесь.
Ярко, потому что съёмка проведена камерой с очень высокой чувствительностью. Авторы статьи про Персеиды немного рассказывали про неё habr.com/post/374163.
Совпадение треков метеоров по длине скорее обусловлено длиной выдержки при съёмке. Ещё нужно учитывать, что съёмка произведена с объективом «рыбий глаз», и треки метеоров идут к своему центру вдоль некоторых кривых, особенно на краях изображения. Также мной выбран самый тривиальный алгоритм выделения треков, и он выделил ложный объекты. Особенно в правом верхнем и нижнем углах. Там, судя по видео, линия горизонта.
У меня вчера такая-же мысль пришла, и я на ночь обработку поставил.
И вот результат.
"

Очень похоже, что летят из правой нижней четверти кадра.
Привязал ваши кадры по звездам к «опорному небу», шарпиками помечены опорные звёзды.
Опора

Выделил метеоры и наложил подсветку на видео.
Их оказалось не так мало.

Метеоры пролетают на видео очень быстро. След в виде черты остаётся буквально на двух-трёх кадрах. Видеопоток пришлось ужать в два раза для борьбы с артефактами сжатия исходных файлов (самый простой способ, который пришёл в голову). Интересно попробовать обработать неускоренный и несжатый видеопоток.
Видео без фона


Так выглядит метеор:
Метеор
Я смотрел видео после вычитания фона. Движущиеся объекты видны намного лучше. Видны даже метеоры, скорость которых намного выше. Просто они очень быстро мелькают т.к. видео ускоренно. И без вычитания фона глаз за них не цепляется.
Очень интересная подборка данных.
Удивило, что в ведущих IT компаниях такая низкая продолжительность работы сотрудников.
Уходят по завершению проекта, не справляются или не приживаются?
То, что разреженные матрицы не очень хорошо ложатся на современные архитектуры, никоим образом не умаляет их достоинств. Некоторые задачи и вовсе нельзя решить за разумное время, используя плотные матрицы, и задачи, аналогичные вашей, хорошее этому подтверждение.
Для ленточных матриц, безусловно доступ к памяти более оптимален, чем для разреженных матриц в более общих форматах CSR и COO.
Ленточные матрицы для себя я всегда выделял в некий отдельный класс в силу высокой плотности хранения.

Information

Rating
5,168-th
Registered
Activity