這篇文章給大家分享的是有關如何減少OpenCV讀取高分辨率圖像的時間的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
原理-分塊并行加載
大家都知道OpenCV有cvLoadImage或者imread都能夠讀取外存上的圖片到內存里面來,不過如果碰到大規模的圖片和高分辨率圖片進行加載的時候,比如一張4K或者8K圖片,受畫家畫大圖是分塊畫的想法,我們可以先把圖片給分割開來,比如4K的我們把它分割成4*4的小塊,然后利用OMP進行并行處理,這樣就能把讀一張4K利用OMP降低到讀一個更小的圖像塊的時間上,或者你也可以CMAKE出來OpenCV的源碼自己在內部進行并行加載,不過個人不太推薦動源碼再編譯。下面給出讀取一張全景圖用本身讀取和分塊異步讀取的時間比較代碼。
代碼
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <time.h>
#include <omp.h>
using namespace cv;
IplImage *showImage = cvCreateImage(cvSize(4096, 2048), IPL_DEPTH_8U, 3);
time_t t_start, t_end;
int main()
{
t_start = clock();
IplImage *image = cvLoadImage("0.jpg");
t_end = clock();
printf("直接讀取一張4K圖片花費時間為:%d\n", t_end - t_start);
t_start = t_end;
char imgName[4][4][40];
IplImage *splitImg[4][4];
#pragma omp parallel for
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
sprintf_s(imgName[i][j], "%d%d%s", i, j, ".jpg");
splitImg[i-1][j-1] = cvLoadImage(imgName[i][j]);
cvSetImageROI(showImage, cvRect((j - 1) * 4096 / 4, (i - 1) * 2048 / 4, 4096 / 4, 2048 / 4));
cvCopy(splitImg[i - 1][j - 1], showImage);
cvResetImageROI(showImage);
}
}
t_end = clock();
printf("分步讀取一張4K圖片花費時間為:%d", t_end - t_start);
cvShowImage("test.jpg", showImage);
cvWaitKey(1);
getchar();
return 1;
}在Visual Studio里面配置一下OpenMP支持


然后讀取這張4K圖片的時間打印出來如下:

感謝各位的閱讀!關于“如何減少OpenCV讀取高分辨率圖像的時間”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。