如何使用OpenCV的parallel_for_并行化你的代码

2023-05-16

英文链接:How to use the OpenCV parallel_for_ to parallelize your code

文章目录

    • 目的
    • 先决条件
    • 简单的示例:绘制曼德尔布罗特集(Mandelbrot set)
    • 原理
    • 伪代码

目的

本教程的目的是向您展示如何使用OpenCV parallel_for_框架轻松地并行化代码。为了说明这个概念,我们将编写一个程序来利用几乎所有可用的CPU负载绘制曼德尔布罗特集。完整的教程代码在这里。如果你想要更多关于多线程的信息,你将不得不参考参考书或课程,因为本教程的目的是保持简单。

先决条件

第一个先决条件是用并行框架构建OpenCV。在OpenCV 3.2中,以下并行框架是按顺序提供的:

  • Intel线程构建块(应该显式启用第三方库)
  • C=并行C/ c++编程语言扩展(应显式启用第三方库)
  • OpenMP(集成到编译器中,应该显式启用)
  • 苹果GCD(系统范围,自动使用(仅限苹果))
  • Windows RT并发性(系统范围,自动使用(仅适用于Windows RT))
  • Windows并发(运行时的一部分,自动使用(仅Windows - MSVC++ >= 10))
  • Pthreads(如果可用)

如您所见,OpenCV库能使用几个并行框架。一些并行库是第三方库,必须显式地构建和启用CMake(例如TBB, C =),其他的则自动可用(例如APPLE GCD),但是,您应该能够直接访问并行框架,或者通过在CMake和rebuild库中启用选项来实现。

第二个(弱)先决条件与你想要完成的任务有关,因为并不是所有的计算都适合/可以被设置为并行运行。为了保持简单,可以拆分为多个基本操作、没有内存依赖关系(没有可能的竞争条件)的任务可以轻松地并行。计算机视觉处理通常是容易并行的,因为大多数时候一个像素的处理不依赖于其他像素的状态。

简单的示例:绘制曼德尔布罗特集(Mandelbrot set)

我们将使用绘制曼德尔布罗特集的示例来展示如何从规则的顺序代码中轻松地修改代码来并行化计算。

原理

Mandelbrot集合定义被数学家Adrien Douady命名为向数学家Benoit Mandelbrot致敬。它在数学领域之外很出名,因为图像表示是一类分形的一个例子,它是一个数学集合,在每个尺度上都显示出一个重复的模式(甚至,曼德尔布罗特集是自相似的,因为整个形状可以在不同的尺度上重复出现)。要获得更深入的介绍,可以查看相应的Wikipedia文章。这里,我们将介绍绘制Mandelbrot集的公式(来自Wikipedia文章)。

Mandelbrot集合是二次映射迭代下轨道为0的复平面上 c c c的值的集合
{ z 0 = 0 z n + 1 = z n 2 + c \begin{cases} z_0 = 0 \\ z_{n+1} = z_n^2 + c \end{cases} {z0=0zn+1=zn2+c
仍然是有界的。也就是说,当从 z 0 = 0 z_0=0 z0=0开始并重复应用迭代时,无论 n n n多大, z n z_n zn的绝对值都是有界的,则复数 c c c是曼德尔布罗特集合的一部分。这也可以表示为
lim sup ⁡ n → ∞ ∣ z n + 1 ∣ ⩽ 2 \limsup_{n\to\infty}|z_{n+1}|\leqslant2 nlimsupzn+12

伪代码

生成Mandelbrot集表示的一个简单算法称为“逃逸时间算法”。对于渲染图像中的每个像素,我们使用递归关系测试复数是否在最大迭代次数下有界。不属于Mandelbrot集合的像素将很快转义,而我们假设像素在固定的最大迭代次数之后位于集合中。较高的迭代值将生成更详细的图像,但计算时间将相应增加。我们使用“转义”所需的迭代次数来描述图像中的像素值。

For each pixel (Px, Py) on the screen, do:
{
  x0 = scaled x coordinate of pixel (scaled to lie in the Mandelbrot X scale (-2, 1))
  y0 = scaled y coordinate of pixel (scaled to lie in the Mandelbrot Y scale (-1, 1))
  x = 0.0
  y = 0.0
  iteration = 0
  max_iteration = 1000
  while (x*x + y*y < 2*2  AND  iteration < max_iteration) {
    xtemp = x*x - y*y + x0
    y = 2*x*y + y0
    x = xtemp
    iteration = iteration + 1
  }
  color = palette[iteration]
  plot(Px, Py, color)
}

为了将伪代码与理论联系起来,我们有:
z = x + i y z = x + iy z=x+iy
z 2 = x 2 + i 2 x y − y 2 z^2 = x^2 + i2xy - y^2 z2=x2+i2xyy2
c = x 0 + i y 0 c = x_0 + iy_0 c=x0+iy0
在这里插入图片描述
在这个图中,我们回想一下复数的实部在x轴上虚部在y轴上。您可以看到,如果我们在特定位置缩放,整个形状可以重复可见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用OpenCV的parallel_for_并行化你的代码 的相关文章

  • 面试题22:链表中倒数第k个结点

    题目 xff1a 输入一个链表 xff0c 输出该链表中倒数第k个结点 为了符合大多数人的习惯 xff0c 本题从1开始计数 xff0c 即链表的尾结点是倒数第1个结点 例如一个链表有6个结点 xff0c 从头结点开始它们的值依次是1 2
  • 面试题23:链表中环的入口结点

    题目 xff1a 一个链表中包含环 xff0c 如何找出环的入口结点 xff1f 例如 xff0c 在图3 8的链表中 xff0c 环的入口结点是结点3 代码 span class token macro property span cla
  • 面试题24:反转链表

    题目 xff1a 定义一个函数 xff0c 输入一个链表的头结点 xff0c 反转该链表并输出反转后链表的头结点 code span class token macro property span class token directive
  • 面试题25:合并两个排序的链表

    题目 输入两个递增排序的链表 xff0c 合并这两个链表并使新链表中的结点仍然是按照递增排序的 例如输入图3 11中的链表1和链表2 xff0c 则合并之后的升序链表如链表3所示 代码 span class token macro prop
  • 面试题26:树的子结构

    题目 xff1a 输入两棵二叉树A和B xff0c 判断B是不是A的子结构 代码 span class token macro property span class token directive keyword include span
  • 面试题27:二叉树的镜像

    题目 xff1a 请完成一个函数 xff0c 输入一个二叉树 xff0c 该函数输出它的镜像 代码 span class token macro property span class token directive keyword inc
  • 面试题28:对称的二叉树

    题目 xff1a 请实现一个函数 xff0c 用来判断一棵二叉树是不是对称的 如果一棵二叉树和它的镜像一样 xff0c 那么它是对称的 代码 span class token macro property span class token
  • 面试题29:顺时针打印矩阵

    题目 xff1a 输入一个矩阵 xff0c 按照从外向里以顺时针的顺序依次打印出每一个数字 Code span class token macro property span class token directive keyword in
  • 看中科院大牛博士如何进行文献检索和阅读

    大家可以看看 xff0c 从其他地方看到的 xff01 导读 我是学自然科学的 xff0c 平时确实需要不少外文文献 xff0c 对于自然科学来讲英文文献检索首推Elsevier xff0c Springer等 虽然这些数据库里面文献已经不
  • 面试题32:从上往下打印二叉树

    面试题32 xff08 一 xff09 xff1a 不分行 题目 xff1a 从上往下打印出二叉树的每个结点 xff0c 同一层的结点按照从左到右的顺序打印 代码 span class token macro property span c
  • 面试题33:二叉搜索树的后序遍历序列

    题目 输入一个整数数组 xff0c 判断该数组是不是某二叉搜索树的后序遍历的结果 如果是则返回true xff0c 否则返回false 假设输入的数组的任意两个数字都互不相同 代码 span class token macro proper
  • 面试题34:二叉树中和为某一值的路径

    题目 输入一棵二叉树和一个整数 xff0c 打印出二叉树中结点值的和为输入整数的所有路径 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 代码 span class token macro property span class
  • 面试题35:复杂链表的复制

    题目 请实现函数ComplexListNode Clone ComplexListNode pHead xff0c 复 制一个复杂链表 在复杂链表中 xff0c 每个结点除了有一个m pNext指针指向下一个结点外 xff0c 还有一个m
  • 面试题36:二叉搜索树与双向链表

    题目 输入一棵二叉搜索树 xff0c 将该二叉搜索树转换成一个排序的双向链表 要求不能创建任何新的结点 xff0c 只能调整树中结点指针的指向 代码 span class token macro property span class to
  • 面试题37:序列化二叉树

    题目 请实现两个函数 xff0c 分别用来序列化和反序列化二叉树 代码 span class token macro property span class token directive keyword include span span
  • 面试题38:字符串的排列

    文章目录 字符串的排列扩展 子集扩展 组合扩展 排列 字符串的排列 题目 输入一个字符串 xff0c 打印出该字符串中字符的所有排列 例如输入字符串abc xff0c 则打印出由字符a b c所能排列出来的所有字符串abc acb bac
  • 面试题39:数组中出现次数超过一半的数字

    题目 数组中有一个数字出现的次数超过数组长度的一半 xff0c 请找出这个数字 例如输入一个长度为9的数组 1 2 3 2 2 2 5 4 2 由于数字2在数组中 出现了5次 xff0c 超过数组长度的一半 xff0c 因此输出2 I O
  • 面试题40:最小的k个数

    题目 输入n个整数 xff0c 找出其中最小的k个数 例如输入4 5 1 6 2 7 3 8这8个数字 xff0c 则最小的4个数字是1 2 3 4 code 方法一 xff1a 时间复杂度为O n 的算法 xff0c 只有当我们可以修改输
  • 面试题41:数据流中的中位数

    题目 如何得到一个数据流中的中位数 xff1f 如果从数据流中读出奇数个数值 xff0c 那么中位数就是所有数值排序之后位于中间的数值 如果从数据流中读出偶数个数值 xff0c 那么中位数就是所有数值排序之后中间两个数的平均值 I O nu
  • 如何由Xubuntu桌面系统还原至Ubuntu系统?

    假定读者原来的系统为ubuntu桌面系统 xff0c 并且根据如下命令更换到xubuntu桌面系统 xff1a sudo apt get install xrdp sudo apt get install vnc4server sudo a

随机推荐

  • 神经网络拟合函数表达式,神经网络拟合函数matlab

    1 matlab中如何用神经网络求得数据拟合函数 xff1f 我是做这个方向的 xff0c 神经网络拟合出的曲线是没有相应的函数的 xff0c 他是根据许多的权重值 xff0c 阀值和偏置值的训练确定的曲线 还有什么相关问题可以问我 xff
  • 面试题42:连续子数组的最大和

    题目 输入一个整型数组 xff0c 数组里有正数也有负数 数组中一个或连续的多个整数组成一个子数组 求所有子数组的和的最大值 要求时间复杂度为O n code 解法一 xff1a 暴力法 span class token macro pro
  • 面试题43:从1到n整数中1出现的次数

    题目 输入一个整数n xff0c 求从1到n这n个整数的十进制表示中1出现的次数 例如 输入12 xff0c 从1到12这些整数中包含1 的数字有1 xff0c 10 xff0c 11和12 xff0c 1一共出现了5次 code span
  • 面试题:数组中找出两个单数

    题目 一个数组中除了两个数是单个的 xff0c 其他的数都有两个 xff0c 请找出这两个单个的数 code span class token macro property span class token directive keywor
  • 面试题44:数字序列中某一位的数字

    题目 数字以0123456789101112131415 的格式序列化到一个字符序列中 在这个序列中 xff0c 第5位 xff08 从0开始计数 xff09 是5 xff0c 第13位是1 xff0c 第19位是4 xff0c 等等 请写
  • mvIMPACT 相机 SDK C++

    Overview 这是为想要使用mvIMPACT Acquire的c 43 43 接口的开发人员编写的文档 它基于C接口 xff0c 但是提供了一种更方便的面向对象的方法来处理设备驱动程序提供的属性和函数 SDK mvIMPACT xff0
  • 面试题:两个链表结构的数据相加,保存到新链表。

    使用STL span class token macro property span class token directive keyword include span span class token string lt iostrea
  • 软件建模基础

    摘录自某PPT 文章目录 软件建模基础0 软件质量属性0 1 如何评价代码质量0 2 软件质量属性 1 面向对象1 0 面向对象知识点1 1 面向对象四大特性1 1 xff08 封装 xff09 1 1 xff08 抽象 xff09 1 1
  • 如何扫描图像,查找表 和 用OpenCV进行时间测量

    英文版原文链接 xff1a How to scan images lookup tables and time measurement with OpenCV 文章目录 目标测试用例图像矩阵如何存储在内存之中 遍历方式一 xff1a 高效的
  • DDD开发

    内容来自某PPT 文章目录 DDD开发1 领域 限定上下文 实体 值对象1 1 领域 子域1 2 核心域 通用域 支撑域1 3 通用语言1 4 限界上下文 xff1a 定义领域边界的利器1 5 实体1 6 值对象1 7 实体 VS 值对象
  • 嵌入式软件开发工程师求职要求

    文章目录 他人感悟工作职责任职要求嵌入式软件开发涉及的知识点很多 xff0c 我仅简单说一下 xff1a 他人感悟 一线工程师告诉你嵌入式真实现状与发展前景 当我们谈论嵌入式时我们究竟在谈什么 工作职责 负责硬件平台bring up xff
  • kolla-ansible openstack登录 证书不可用

    根据官方文档配置kolla ansible之后 xff0c 创建openstack实例 xff0c 登录openstack出现证书不可用 xff0c 如图 问题排查 尝试过 更新openrc sh文件增加OS TOKEN环境变量 查看日志
  • 联发科2021笔试题:字符串中找到 出现次数 最多的单个字符

    I O描述 输入 xff1a span class token string 34 aaaaabbbbbBBBBBAAAAA 34 span 输出 xff1a A span class token punctuation span span
  • 对矩阵的 掩码运算

    英文链接 xff1a Mask operations on matrices 文章目录 测试用例代码基本函数二维滤波器函数 矩阵的掩码操作非常简单 其思想是我们根据掩码矩阵 也称为内核 重新计算图像中每个像素的值 此掩码保存的值将调整相邻像
  • 对图片的操作

    英文原文链接 xff1a Operations with images 文章目录 输入 输出图像的基本操作内存管理和引用计数基本操作可视化图像 输入 输出 从文件加载一个图像 Mat img span class token operato
  • 使用OpenCV相加(混合)两个图像

    使用OpenCV相加 混合 两个图像 xff1a Adding blending two images using OpenCV 文章目录 目标理论源码解释结果 目标 什么是线性混合 xff0c 为什么它有用 如何使用addWeighted
  • 改变图像的对比度和亮度

    英文链接 xff1a Changing the contrast and brightness of an image 文章目录 目标理论图像处理像素处理亮度和对比度调整 源码解释结果实例亮度和对比度调整图像灰度校正 xff08 Gamma
  • 离散傅里叶变换

    英文链接 xff1a Discrete Fourier Transform 目标 什么是傅里叶变换 xff0c 为什么要用它 在OpenCV中怎么做 使用诸如 copyMakeBorder merge dft getOptimalDFTSi
  • 使用XML和YAML文件的 文件输入和输出

    英文链接 xff1a File Input and Output using XML and YAML files 文章目录 目标源码解释结果 目标 如何打印和读取文本条目到文件 和 OpenCV使用YAML或XML文件 如何为OpenCV
  • 如何使用OpenCV的parallel_for_并行化你的代码

    英文链接 xff1a How to use the OpenCV parallel for to parallelize your code 文章目录 目的先决条件简单的示例 绘制曼德尔布罗特集 xff08 Mandelbrot set x