OpenCV使用ParallelLoopBody進行平行計算
環境:Windows 10 x64, VS2017 x64, OpenCV 4.3.0 x64
步驟:
1,宣告一個 ParallelLoopBody 的子類(取名為FillParallel),並實現其純虛擬函式 virtual void operator() (const Range& range) const的功能;
2,例項化子類(FillParallel)的物件(取名為 fill) ;
3,呼叫 cv::parallel_for_()方式進行平行計算。
詳細與程式碼:
step 1:
// Step 1: 宣告 ParallelLoopBody 的一個子類,取名為 FillParallel (並行填充顏色)
class FillParallel : public cv::ParallelLoopBody {
public:
// 通過建構函式進行填充引數(填充影像,填充區域,顏色等)的設定
FillParallel(cv::Mat& image, const std::vector<cv::Rect>& rects, const std::vector<cv::Scalar>& colors) {
_image = image;
_rects = rects;
_colors = colors;
}
// OpenCV 平行計算的內部呼叫介面約定
// 【重點】實現此介面的功能
virtual void operator() (const cv::Range& range) const {
for (int i = range.start; i < range.end; ++i) {
_image(_rects[i]).setTo(_colors[i]);
printf("curr thread: %d, all %d.\r\n", cv::getThreadNum(), cv::getNumThreads());
}
}
// 填充引數
private:
mutable cv::Mat _image; // 此處關注 mutable 關鍵字
std::vector<cv::Rect> _rects;
std::vector<cv::Scalar> _colors;
};
step 2:
// Step 2: 例項化子類(FillParallel)的物件(取名為 fill) ;
FillParallel fill(image, vec_rects, vec_colors);
step 3:
// Step 3: 呼叫 cv::parallel_for_()方式進行平行計算。
cv::parallel_for_(cv::Range(0, vec_rects.size()), fill);
完整程式碼;
// Mylaf
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#define TICK2TIME(tick) ((tick)*1000/cv::getTickFrequency())
bool SubRectangle(std::vector<cv::Rect> & rects,
int width, int height, // 大區域的尺寸
int subwidth, int subheight, // 子區域的尺寸
int stepx, int stepy, // 子區域間的步進
int offx = 0, int offy = 0) { // 子區域左上點偏移
//
for (int y = 0; y < height; y += stepy) {
for (int x = 0; x < width; x += stepx) {
rects.emplace_back(x + offx, y + offy, subwidth, subheight);
if (x + subwidth >= width) break;
}
if (y + subheight >= height) break;
}
return true;
}
// Step 1: 宣告 ParallelLoopBody 的一個子類,取名為 FillParallel (並行填充顏色)
class FillParallel : public cv::ParallelLoopBody {
public:
// 通過建構函式進行填充引數(填充影像,填充區域,顏色等)的設定
FillParallel(cv::Mat& image, const std::vector<cv::Rect>& rects, const std::vector<cv::Scalar>& colors) {
_image = image;
_rects = rects;
_colors = colors;
}
// OpenCV 平行計算的內部呼叫介面約定
// 【重點】實現此介面的功能
// 本填充的range=填充區域(顏色)的個數, 見Step 3中的range
virtual void operator() (const cv::Range& range) const {
for (int i = range.start; i < range.end; ++i) {
_image(_rects[i]).setTo(_colors[i]);
printf("curr thread: %d, all %d.\r\n", cv::getThreadNum(), cv::getNumThreads());
}
}
// 填充引數
private:
mutable cv::Mat _image; // 此處關注 mutable 關鍵字
std::vector<cv::Rect> _rects;
std::vector<cv::Scalar> _colors;
};
void Test0001() {
cv::Mat image = cv::Mat::zeros(8000, 12000, CV_8UC3);
// 劃分不同的填充區域和顏色
std::vector<cv::Rect> vec_rects;
ocv_geom::SubRectangle(vec_rects,
image.cols, image.rows,
100, 100, 100, 100);
std::cout << "subrect size=" << vec_rects.size() << std::endl;
std::vector<cv::Scalar> vec_colors(vec_rects.size());
for (int i = 0; i < vec_colors.size(); ++i) {
vec_colors[i][0] = (32 * i) & 0xFF;
vec_colors[i][1] = (48 * (i + 1)) & 0xFF;
vec_colors[i][2] = 255 - MIN(vec_colors[i][0], vec_colors[i][1]);
}
// Step 2: 例項化子類(FillParallel)的物件(取名為 fill) ;
FillParallel fill(image, vec_rects, vec_colors);
double tick = cv::getTickCount();
for (int i = 0; i < vec_colors.size(); ++i) {
image(vec_rects[i]).setTo(vec_colors[i]);
}
tick = cv::getTickCount() - tick;
std::cout << "0 time: " << TICK2TIME(tick) << " ms." << std::endl;
tick = cv::getTickCount();
// Step 3: 呼叫 cv::parallel_for_()方式進行平行計算。
cv::parallel_for_(cv::Range(0, vec_rects.size()), fill);
tick = cv::getTickCount() - tick;
std::cout << "1 time: " << TICK2TIME(tick) << " ms." << std::endl;
cv::imwrite("image.png", image);
}
// mylaf unit test entry-point
int main(int argc, const char* argv[]) {
Test0001();
//
return 0;
}
圖片:
Mylaf
廈門 2020-12-09 0020
相關文章
- 使用 QuTrunk+Amazon ParallelCluster3 進行平行計算Parallel
- java8平行計算Java
- 平行計算π值
- [python] Python平行計算庫Joblib使用指北Python
- springboot~CompletableFuture平行計算Spring Boot
- 平行計算與Neon簡介
- iOS下使用OpenCV進行影象識別iOSOpenCV
- 大文字平行計算實現方式
- [原始碼解析] PyTorch 流水線並行實現 (6)--平行計算原始碼PyTorch並行
- 使用 Rust 和 OpenCV 進行物體檢測RustOpenCV
- 談談如何使用 opencv 進行影像識別OpenCV
- 【1】Embarrassingly Parallel(易平行計算問題)Parallel
- 瞭解Flow -- elixir的平行計算庫
- [930]python平行計算框架pathos模組Python框架
- 後端請求中的非同步計算與平行計算後端非同步
- 使用OpenCV進行ROS 2的循線跟蹤OpenCVROS
- 使用位運算進行加法運算
- HPC高效能運算知識: 異構平行計算
- 矩陣:如何使用矩陣操作進行 PageRank 計算?矩陣
- 使用 Go 語言與 OpenCV 進行物體檢測GoOpenCV
- opencv計算曲線長度OpenCV
- PostgreSQL11preview-平行計算增強彙總SQLView
- 使用Python,OpenCV進行銀行支票數字和符號的OCRPythonOpenCV符號
- cuda程式設計與gpu平行計算(四):cuda程式設計模型程式設計GPU模型
- Python OpenCV 3 使用背景減除進行目標檢測PythonOpenCV
- 使用 OpenCV 進行文件矯正OpenCV
- Concurrent iHawk — 實時平行計算機模擬系統計算機
- 物體檢測實戰:使用 OpenCV 進行 YOLO 物件檢測OpenCVYOLO物件
- 平行計算與並行程式設計課程內容介紹並行行程程式設計
- 用Spark進行實時流計算Spark
- 探秘資料庫中的平行計算技術應用資料庫
- 使用pytz模組進行時區轉換及時間計算
- Scanner的進階使用——基礎計算
- 【TVM 教程】使用元組輸入(Tuple Inputs)進行計算和歸約
- Java併發基礎-Fork、Join方式的平行計算研究分析Java
- 為什麼計算機採用補碼進行運算?計算機
- opencv 開運算、閉運算OpenCV
- 兩行程式碼輕鬆讓 Java 實現大文字平行計算行程Java