Допустим, у меня есть классы, реализующие захват видео с камер и матрицы изображений, конвертацию из RGB в ч/б, визуализацию результатов, причем все процедуры работают поточно и покадрово (получили новый кадр, вызвали свой метод run, положили результат). Есть ли на плюсах такая либа или фреймворк, чтобы можно было писать что-то типа:
RGBImage img1;
RGBImage img2;
BWImage bw1;
BWImage bw2;
Camera cam1(1, img1); //вход - камера#1, выход картинка1
Camera cam2(2, img2); //вход - камера#2, выход картинка2
RGB2BW rgb2bw1(img1, bw1); //вход - картинка#1, выход ч/б#1
RGB2BW rgb2bw2(img2, bw2); // ...
OutType1 out1;
OutType2 out2;
Processor proc(bw1, bw2, out1, out2, [] (BWImage& bw1, BWImage& bw2, OutType1& o1, OutType2& o2) {
// здесь происходит некая обработка bw1 и bw2, с записью результата в о1 и о2
});
Viewer view(out1, out2);
run(cam1, cam2, rgb2bw1, rgb2bw2, proc, view);
И чтобы оно автоматически понимало зависимости выходных данных от входных и пускало соответствующие процедуры обработки на параллельных процессах? В моем примере это простой fork-join, но в общем случае граф может быть более сложным, например, результаты out1 могут подаваться в качестве обратной связи в cam1, чтобы соответствующая камера адаптировала свои внутренние параметры. При этом должен быть минимальный оверхед, т.е. никаких лишних копирований данных.
Или каждый раз писать велосипед?