Оптический поток есть в OpenCV, в версии 3.2.0 завезли очень быстрый алгоритм Dense Inverse Search Optical Flow, в с++ создается он так:
Ptr< cv::optflow::DISOpticalFlow > dis_op = cv::optflow::createOptFlow_DIS(
cv::optflow::DISOpticalFlow::PRESET_ULTRAFAST);
dis_op->calc(next_frame_gray, prev_frame_gray, opt_flow);
Но для кодирования видео оптисеский поток - это как с пушки по воробьям, так как он очень ресурсоемок для вычисления, даже этот DISOpticalFlow. Есть и другие методы, например Farneback, Simpleflow, но последний ужасно медленный (но очень точный), а фарнбэк не видит быстрого движения и он медленнее, чем DISOpticalFlow.