溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何減少OpenCV讀取高分辨率圖像的時間

發布時間:2021-06-11 14:10:34 來源:億速云 閱讀:351 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關如何減少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支持

如何減少OpenCV讀取高分辨率圖像的時間

如何減少OpenCV讀取高分辨率圖像的時間

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

如何減少OpenCV讀取高分辨率圖像的時間

感謝各位的閱讀!關于“如何減少OpenCV讀取高分辨率圖像的時間”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女