Изменение программы C / ++ OpenCV на CUDA из программы стабилизации видео

Я делаю C ++ видео стабилизации / анти-шейкер программа, которая:
— Получает точки интереса в системе отсчета (используя FAST, SURF, Shi-Matoshi или SIFT, может попробовать еще несколько)
— Рассчитать оптический поток Лукаса-Канаде с помощью calcOpticalFlowPyrLK
— Получает матрицу гомографии
— Исправляет дрожание изображения с помощью warPerspective (см. Код ниже)

//Calculate the Lucas Kanade optical flow
calcOpticalFlowPyrLK(original, distorted, refFeatures, currFeatures, featuresFound, err);

//Find the homography between the current frame's features and the reference ones's
if(homographyRansac){
homography = findHomography(currFeatures, refFeatures, CV_RANSAC); /*CV_RANSAC: Random sample consensus (RANSAC) is an iterative method to
estimate parameters of a mathematical model from a set of observed data which contains outliers */
}else{
homography = findHomography(currFeatures, refFeatures, 0);
}//We use warpPerspective once on the distorted image to get the resulting fixed image
if(multiChannel){
//Spliting into channels
vector <Mat> rgbChannels(channels), fixedChannels;
split(distortedCopy, rgbChannels);
recovered = Mat(reSized, CV_8UC3);
//We apply the transformation to each channel
for(int i = 0; i < channels; i ++){
Mat tmp;
warpPerspective(rgbChannels[i], tmp, homography, reSized);
fixedChannels.push_back(tmp);
}
//Merge the result to obtain a 3 channel corrected image
merge(fixedChannels, recovered);
}else{
warpPerspective(distorted, recovered, homography, reSized);
}

Если у вас есть альтернатива моему решению по стабилизации, не стесняйтесь говорить об этом, но это не тема этой темы.

Так как все это занимает много времени (около 300 мс на кадр на моем компьютере i5, так что ОЧЕНЬ много времени для 30-минутного видео), я рассматриваю возможность использования CUDA для ускорения работы. Я установил его и работаю, но я не уверен, что делать дальше. Я провел несколько тестов и знаю, что наиболее трудоемкими операциями являются получение оптического потока и коррекция кадра с использованием соответственно calcOpticalFlowPyrLK и warpPerspective. Поэтому в идеале, по крайней мере, на первый взгляд, я бы использовал только версии CUDA этих двух функций, оставляя остальные без изменений.

Это возможно? Или мне нужно все переписать?

Спасибо

2

Решение

Начиная с OpenCV 3.0, доступна реализация стабилизации видео в CUDA. Рекомендуется использовать уже имеющуюся реализацию вместо написания собственной, если вы не уверены, что ваша версия будет лучше или быстрее.

Вот минимальный код, демонстрирующий, как использовать модуль стабилизации видео OpenCV для стабилизации видео.

#include <opencv2/highgui.hpp>
#include <opencv2/videostab.hpp>

using namespace cv::videostab;

int main()
{
std::string videoFile = "shaky_video.mp4";

MotionModel model = cv::videostab::MM_TRANSLATION; //Type of motion to compensate
bool use_gpu = true; //Select CUDA version or "regular" version

cv::Ptr<VideoFileSource> video = cv::makePtr<VideoFileSource>(videoFile,true);
cv::Ptr<OnePassStabilizer> stabilizer = cv::makePtr<OnePassStabilizer>();

cv::Ptr<MotionEstimatorBase> MotionEstimator = cv::makePtr<MotionEstimatorRansacL2>(model);

cv::Ptr<ImageMotionEstimatorBase> ImageMotionEstimator;

if (use_gpu)
ImageMotionEstimator = cv::makePtr<KeypointBasedMotionEstimatorGpu>(MotionEstimator);
else
ImageMotionEstimator = cv::makePtr<KeypointBasedMotionEstimator>(MotionEstimator);

stabilizer->setFrameSource(video);
stabilizer->setMotionEstimator(ImageMotionEstimator);
stabilizer->setLog(cv::makePtr<cv::videostab::NullLog>()); //Disable internal prints

std::string windowTitle = "Stabilized Video";

cv::namedWindow(windowTitle, cv::WINDOW_AUTOSIZE);

while(true)
{
cv::Mat frame = stabilizer->nextFrame();

if(frame.empty())   break;

cv::imshow(windowTitle,frame);
cv::waitKey(10);
}

return 0;
}
4

Другие решения


По вопросам рекламы [email protected]