私は C++ ビデオ安定化/手ぶれ補正プログラムを実行しています。 - 参照フレーム上で関心のあるポイントを取得します (FAST、SURF、Shi-Matoshi、または SIFT を使用して、もう少し試してみてください) - Lucas-Kanade オプティカル フローを計算します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);
}
私の安定化ソリューションに代わるものがあれば、遠慮なく言ってください。しかし、それはこのスレッドのトピックではありません。
これには多くの時間がかかるため (私の i5 コンピューターではフレームあたり約 300 ミリ秒なので、30 分のビデオでは非常に長い時間になります)、CUDA を使用して高速化することを検討しています。私はそれをインストールして動作させましたが、次にどのように進めればよいかわかりません。私はいくつかのテストを行いましたが、最も時間のかかる操作は、それぞれ calcOpticalFlowPyrLK と warpPerspective を使用してオプティカル フローとフレーム補正を取得することであることがわかっています。したがって、理想的には、少なくとも最初は、これら 2 つの関数の CUDA バージョンのみを使用し、残りは変更しません。
これは可能ですか?それとも全部書き直す必要がありますか?
ありがとう