[英]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.