2

私は 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 バージョンのみを使用し、残りは変更しません。

これは可能ですか?それとも全部書き直す必要がありますか?

ありがとう

4

1 に答える 1