簡體   English   中英

C ++ / CLI中視頻穩定項目的平均絕對差方法

[英]mean absolute difference method for video stabilisation project in C++/CLI

我嘗試在C ++ / cli中實現視頻穩定項目。首先,我擁有bmp圖像序列,並且找到了運動矢量,這些運動矢量顯示了每個圖像幀之間移動了多少特定像素區域。 例如我有256 * 256的圖像,我在第一個圖像幀和第二個圖像幀中選擇了200 * 200個區域,然后發現第一區域和第二個區域之間移動了多少像素。當算法轉到最后一個圖像序列時,程序完成了最終,我獲得了運動矢量。我使用均值絕對方法進行了此操作。 它起作用了,但是太慢了。我的示例代碼塊在這里,我發現只有一個運動矢量的第一個索引(x方向和y方向):

//M:image height =256

//N.image width =256

//BS:block size=218


//selecting and reading first and second image frame



frame = 1;

s1 = "C:\\bike\\" + frame + ".bmp";
image = gcnew System::Drawing::Bitmap(s1, true);

s2 = "C:\\bike\\" + (frame + 1) + ".bmp";
image2 = gcnew System::Drawing::Bitmap(s2, true);

for (b = 0; b < M; b++){
    for (a = 0; a < N; a++)
{
    System::Drawing::Color BitmapColor = image->GetPixel(a, b);
I1[b][a] = (double)((BitmapColor . R * 0.3) + (BitmapColor . G * 0.59) + (BitmapColor . B * 0.11));
}
}

for (b = 0; b < M; b++){
    for (a = 0; a < N; a++)
{
    System::Drawing::Color BitmapColor = image2->GetPixel(a, b);
I2[b][a] = (double)((BitmapColor . R * 0.3) + (BitmapColor . G * 0.59) + (BitmapColor . B * 0.11));
}
}



//finding blocks

a = 0;
for (i = 19; i < 237; i++){
    b = 0;
    for (j = 19; j < 237; j++){

        Blocks[a][b] = I2[i][j];
        b++;
    }
    a++;
}


//finding motion vectors according to the mean absolute differences


//MAD  method

for (m = 0; m < (M - BS); m++){
    for (n = 0; n < (N - BS); n++){

        toplam = 0;
        for (i = 0; i < BS; i++){

            for (j = 0; j < BS; j++){

                toplam += fabs(I1[m + i][n + j] - Blocks[i][j]);


            }
        }


// finding vectors

        if (difference < mindifference) {
            mindifference = difference;
            MV_x = m;
            MV_y = n;
        }


    }
}

這個代碼示例工作正常,但是速度非常慢,我需要實現代碼優化。 如何不使用循環就可以做到這一點,例如我在C ++ / cli中像MATLAB代碼一樣進行索引(例如I1(1:20)= 100)。

請問你能幫幫我嗎?

最好的祝福...

您應注意以下幾點:

首先,與內置函數相比,C ++中的循環並不慢。 在MatLab中,操作越少越好,因此最好調用內置函數,這些函數是使用優化代碼完成的單個操作。 在C ++中,您的代碼通過內置函數得到了同樣的優化。

接下來, GetPixel非常慢。 請嘗試使用Bitmap.LockBits 具有諷刺意味的是,這似乎與我之前的聲明相矛盾,但這並不是因為LockBits內部的循環比您執行循環要快,而是因為GetPixel使用了另一種慢得多的方法。

切換到LockBits ,如果編譯器尚未這樣做,則可以通過稍微展開循環來再次將速度提高一倍或兩倍。

最后,請確保您充分利用了緩存的局部性。 嘗試兩個循環順序(例如for (a...) for (b...)for (b...) for (a...) ),並測量每個循環的時間以找出哪個更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM