Ik heb twee USB3 machine vision camera's en heb al een stuk software geschreven om deze te besturen en frames direct in videobestanden te dumpen met ffmpeg. Nu wil ik een image processing pipeline toevoegen aan mijn software om bijvoorbeeld wat tracking uit te voeren om de imaging ROI (stuk van sensor wat uitgelezen wordt) real-time mee te bewegen met een bewegend object of interest. Ik wil dit graag zelf schrijven omdat 1) volledige flexibiliteit; 2) beter begrip van wat de code doet; 3) ter lering. Een voorbeeld processing pipeline zou zoiets kunnen zijn:
/f/image/4YMfVxpa3N5Bty5s5tyGSV9n.png?f=fotoalbum_large)
Per camera voer ik een zooi bewerkingen uit, gedeeltelijk parallelizeerbaar, en de resultaten van beide camera's neem ik samen en daar voer ik nog wat verdere berekeningen op uit. Het systeem moet real-time zijn waarmee ik bedoel dat het de camera's moet kunnen bijhouden. Als resultaten met een paar frames lag uit het einde van de pipeline komen is niet erg (dus niet real-time in die zin). Toch wil ik graag dat er parallel gedraaid wordt wat er parallel gedraaid kan worden (er zitten zat cores in het systeem waar dit op gaat draaien), zodat het resultaat zo snel mogelijk klaar staat.
Ik schrijf aardig modern C++ vind ik zelf, en heb al wat simpele threading ervaring, maar iets als bovenstaands schrijven is een flinke nieuwe stap. Nu ben ik flink aan het Googlen geweest en heb heel wat gevonden. Ik zou graag advies hebben hoe zo'n systeem te bouwen, welke keuzes te maken. Ik ben drie opties tegengekomen die denk ik interessant zijn:
1) Taskflow
2) Zelf iets rollen met cppcoro, zie e.g. dit
3) Naios continuable
Taskflow maakt het heel makkelijk om een pipeline in elkaar te schroeven, maar laat de resultaten van een task niet voeren aan de volgende task, dus zou nog een hele zooi datastructuren eromheen moeten bouwen.
De andere twee opties maken het wel mogelijk voor de verschillende taken om op een natuurlijke manier met elkaar te communiceren.
coroutines via bijvoorbeeld cppcoro lijkt me een zeer natuurlijke manier van werken (nog niet uitgeprobeerd dus kan tegenvallen) omdat ik eigenlijk bijna geheel gewone code kan schrijven en alleen wat returns hoef te vervangen naar andere statements zodat het geheel lazy wordt en op een threadpool gescheduled kan worden. Het lijkt me wel erg barebones.
Als ik het goed begrijp is Naios continuable een beetje higher level met mooie syntatic sugar om het geheel in elkaar te schroeven. Dus misschien wel de best of both worlds betreffende de andere twee opties. Lijkt niet heel populair though, wat tot zorgen leidt over hoe fully featured het is en hoe goed het gesupport zal blijven.
Nu moet ik kiezen, hoe kies ik tussen deze? Ik weet dat dit een beetje een ongefocusde post is, dat komt omdat ik niet goed weet hoe hierover na te denken. Is er nog een andere techniek/library die ik zou moeten bekijken? Ik wil (heel) goede performance, en vind het niet erg als ik mezelf eerst tien keer in de voet schiet, ik wil tenslotte flink wat leren hier ook. Bedankt voor jullie gedachten!
/f/image/4YMfVxpa3N5Bty5s5tyGSV9n.png?f=fotoalbum_large)
Per camera voer ik een zooi bewerkingen uit, gedeeltelijk parallelizeerbaar, en de resultaten van beide camera's neem ik samen en daar voer ik nog wat verdere berekeningen op uit. Het systeem moet real-time zijn waarmee ik bedoel dat het de camera's moet kunnen bijhouden. Als resultaten met een paar frames lag uit het einde van de pipeline komen is niet erg (dus niet real-time in die zin). Toch wil ik graag dat er parallel gedraaid wordt wat er parallel gedraaid kan worden (er zitten zat cores in het systeem waar dit op gaat draaien), zodat het resultaat zo snel mogelijk klaar staat.
Ik schrijf aardig modern C++ vind ik zelf, en heb al wat simpele threading ervaring, maar iets als bovenstaands schrijven is een flinke nieuwe stap. Nu ben ik flink aan het Googlen geweest en heb heel wat gevonden. Ik zou graag advies hebben hoe zo'n systeem te bouwen, welke keuzes te maken. Ik ben drie opties tegengekomen die denk ik interessant zijn:
1) Taskflow
2) Zelf iets rollen met cppcoro, zie e.g. dit
3) Naios continuable
Taskflow maakt het heel makkelijk om een pipeline in elkaar te schroeven, maar laat de resultaten van een task niet voeren aan de volgende task, dus zou nog een hele zooi datastructuren eromheen moeten bouwen.
De andere twee opties maken het wel mogelijk voor de verschillende taken om op een natuurlijke manier met elkaar te communiceren.
coroutines via bijvoorbeeld cppcoro lijkt me een zeer natuurlijke manier van werken (nog niet uitgeprobeerd dus kan tegenvallen) omdat ik eigenlijk bijna geheel gewone code kan schrijven en alleen wat returns hoef te vervangen naar andere statements zodat het geheel lazy wordt en op een threadpool gescheduled kan worden. Het lijkt me wel erg barebones.
Als ik het goed begrijp is Naios continuable een beetje higher level met mooie syntatic sugar om het geheel in elkaar te schroeven. Dus misschien wel de best of both worlds betreffende de andere twee opties. Lijkt niet heel populair though, wat tot zorgen leidt over hoe fully featured het is en hoe goed het gesupport zal blijven.
Nu moet ik kiezen, hoe kies ik tussen deze? Ik weet dat dit een beetje een ongefocusde post is, dat komt omdat ik niet goed weet hoe hierover na te denken. Is er nog een andere techniek/library die ik zou moeten bekijken? Ik wil (heel) goede performance, en vind het niet erg als ik mezelf eerst tien keer in de voet schiet, ik wil tenslotte flink wat leren hier ook. Bedankt voor jullie gedachten!