当前位置: 首页 > news >正文

opencv 多线程分块处理

在OpenCV中,使用ROI(Region of Interest)来处理图像的特定区域是一个常见的做法。当需要在多线程环境下对图像的不同区域进行处理时,可以将图像分割成多个区块,并将每个区块分配给不同的线程进行处理。

以下是一个使用C++和OpenCV进行多线程图像分块处理的简单例子:

int main(int argc, char *argv[])
{cv::Mat src;cv::Mat dst1(src.size(), CV_8UC1);src = cv::imread("../../test/img/2.jpg");/****************单线程******************/cv::Mat mask(src.size(), CV_8UC1);cv::Mat roi(mask, {100,100,mask.cols - 200, mask.rows - 200});roi.setTo(cv::Scalar(255));cv::imwrite("../../test/img/mask.jpg", mask);cv::Mat gray;cvtColor(src, gray, CV_BGR2GRAY);auto t = clock();cv::threshold(gray, dst1, 0, 255, CV_THRESH_OTSU);std::cout << "sigle thread time " << clock() - t << std::endl;cv::imwrite("../../test/img/2_inp.jpg", dst1);/****************多线程******************/cv::Mat dst2(src.size(), CV_8UC1);cv::Size size = src.size();// 分成9块 (3x3)int n = 3;int widthPerBlock = size.width / n;int heightPerBlock = size.height / n;std::vector<std::thread> threads;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {int x = j * widthPerBlock;int y = i * heightPerBlock;int width = (j == n - 1) ? size.width - x : widthPerBlock;int height = (i == n - 1) ? size.height - y : heightPerBlock;cv::Rect roi(x, y, width, height);threads.push_back(std::thread([&](cv::Rect roi_){cv::Mat gray_roi(gray, roi_);cv::Mat mask_roi(mask, roi_);cv::Mat dst_roi(dst2, roi_);cv::threshold(gray_roi, dst_roi, 0, 255, CV_THRESH_OTSU);},roi));}}t = clock();for (auto& t : threads) {t.join();}std::cout << "9 thread time " << clock() - t << std::endl;cv::imwrite("../../test/img/2_thread.jpg", dst2);return 0;
}

图像大小:1760*2432

时间对比:

多线程        多线程
7ms        18ms

      

左中右依次是:原图  多线程 单线程处理结果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • FFmpeg源码:packet_alloc、av_new_packet、av_shrink_packet、av_grow_packet函数分析
  • 掌握NPM版本候选锁定:策略、实践与示例
  • 如果你懂开发,我真心劝你来试试网络安全
  • 自由职业四年,我整理了一些建议
  • 【数据结构】堆排序与TOP-K问题
  • Naive UI+vue一些组件的注意事项
  • element plus el-select修改后缀图标
  • 【双向链表】的建立、插入、删除、查找和销毁
  • 量化策略开发步骤系列(3)关键投资组合指标
  • firefly推理和微调qwen
  • Appium基础
  • 背包九讲(动态规划)
  • IO流(完善)
  • 2.4 playwright 实战-爬取某宝商品信息
  • 四款录屏大师,一键搞定!新手也能快速上手?
  • 【node学习】协程
  • ES6系统学习----从Apollo Client看解构赋值
  • Idea+maven+scala构建包并在spark on yarn 运行
  • input实现文字超出省略号功能
  • java8 Stream Pipelines 浅析
  • js操作时间(持续更新)
  • Laravel 菜鸟晋级之路
  • MySQL用户中的%到底包不包括localhost?
  • ReactNativeweexDeviceOne对比
  • 技术:超级实用的电脑小技巧
  • 为什么要用IPython/Jupyter?
  • 详解移动APP与web APP的区别
  • 一个JAVA程序员成长之路分享
  • 一起参Ember.js讨论、问答社区。
  • 移动端解决方案学习记录
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 2017年360最后一道编程题
  • ​如何在iOS手机上查看应用日志
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (02)vite环境变量配置
  • (2)STL算法之元素计数
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (7)摄像机和云台
  • (ZT)薛涌:谈贫说富
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (九)One-Wire总线-DS18B20
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (学习总结16)C++模版2
  • (一) storm的集群安装与配置
  • (一)SvelteKit教程:hello world
  • ./configure,make,make install的作用(转)
  • .describe() python_Python-Win32com-Excel
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core + vue 搭建前后端分离的框架
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .Net Web项目创建比较不错的参考文章