OpenCV中幾種常見讀取畫素值方法的讀取速度對比

2021-09-13 12:39:06 字數 3013 閱讀 3919

opencv經常用到讀取影象畫素點的操作,還沒有自己測試過速度,正好有空試一試。應該還有別的讀取方式,以下就只測試了自己用到的7種。有的方法原理是相同。

直接上**看結果

#include#include#includeusing namespace cv;

using namespace std;

int main()

;//儲存七個方法總時間

double time[7] = ;//儲存每次執行的時間

double i = 0;

for (i = 0; i < 2; i++)

}endtime1 = clock();//結束計時

time[0] = (double(endtime1 - starttime1) / clocks_per_sec);

cout << "time1=" << time[0] << "s" << endl;

//-----------方法二

clock_t starttime2, endtime2;//定義計時

starttime2 = clock();//開始計時

for (int i = 0; i < bgrim.rows; i++)

}endtime2 = clock();//結束計時

time[1] = (double(endtime2 - starttime2) / clocks_per_sec);

cout << "time2=" << time[1] << "s" << endl;

//-----------方法三

clock_t starttime3, endtime3;//定義計時

starttime3 = clock();//開始計時

for (int i = 0; i < bgrim.rows; i++)

}endtime3 = clock();//結束計時

time[2] = (double(endtime3 - starttime3) / clocks_per_sec);

cout << "time3=" << time[2] << "s" << endl;

//-----------方法四

clock_t starttime4, endtime4;//定義計時

starttime4 = clock();//開始計時

for (int i = 0; i < bgrim.rows; i++)

}endtime4 = clock();//結束計時

time[3] = (double(endtime4 - starttime4) / clocks_per_sec);

cout << "time4=" << time[3] << "s" << endl;

//-----------方法五

clock_t starttime5, endtime5;//定義計時

starttime5 = clock();//開始計時

for (int i = 0; i < bgrim.rows; i++)

}endtime5 = clock();//結束計時

time[4] = (double(endtime5 - starttime5) / clocks_per_sec);

cout << "time5=" << time[4] << "s" << endl;

//-----------方法六

clock_t starttime6, endtime6;//定義計時

starttime6 = clock();//開始計時

for (int i = 0; i < bgrim.rows; i++)

}endtime6 = clock();//結束計時

time[5] = (double(endtime6 - starttime6) / clocks_per_sec);

cout << "time6=" << time[5] << "s" << endl;

//-----------方法七

clock_t starttime7, endtime7;//定義計時

starttime7 = clock();//開始計時

for (int i = 0; i < bgrim.rows; i++)

}endtime7 = clock();//結束計時

time[6] = (double(endtime7 - starttime7) / clocks_per_sec);

cout << "time7=" << time[6] << "s" << endl;

} cout << "--------------" << endl;

for (int k = 0; k < 7; k++)

cout << "--------------" << endl;

for (int k = 0; k < 7; k++)

waitkey();

return 0;

}

以上**,執行2次,最終結果如圖:

以上**,執行500次,最終結果如圖:

各方法執行的時間大小:2<3<1<7<4<5<6

可以明顯看出,方法二的執行速度最快,主要因為採用了指標讀取位址。

方法2和方法3是類似,但是方法2在第乙個for迴圈中就獲取了mat每一行的首位址data,因此在第二個for迴圈中可以直接讀取位址值並賦值,避免了方法3中還需要重新通過bgrim.ptr(i)來獲取首行位址值。執行500次時,兩種方法的總時間翻了幾倍。

方法5、方法6、方法7也是類似的,但是方法7只進行了一次等式賦值操作,時間上縮短了一些。

因此,對於讀取畫素點的操作應該盡量使用指標,能大大減少時間。特別是當讀取的影象畫素很多時,能夠明顯感覺到速度的快慢。而方法2這種讀取方式,優勢明顯。

opencv 讀取畫素值

話不多說,新手在不斷學習,剛剛看見讀取每個畫素點值很是好奇。include include using namespace std int main 不過通過上訴方法在速度方面會比較慢。可以通過如下方法加快訪問,更改速度。iplimage成員有 int nsize int id 比較重要的兩個元素是...

opencv5 讀取畫素

題外話 畫素大戰,感興趣的可以去看這個電影,就能更好的理解畫素是個什麼東東。畫素 pixel 由picture 影象和element 28畫素,比如 15 15 厘公尺的,等於 420 420 畫素的長度。在 opencv 中經常出現通道,所以在單通道 多通道下的影象的畫素是這樣表示的 圖畫的不好看...

opencv中關於畫素的常見操作

一 獲取影象畫素指標 mat.ptr int i 0 獲取畫素矩陣的指標,索引i表示第幾行,從0開始計行數。獲得當前行指標const uchar current myimage.ptr row 獲取當前畫素點p row,col 的畫素值 p row,col current col 二 畫素範圍處理s...