OpenM

转载自:http://blog.youkuaiyun.com/netnote/article/details/3137563   

1        简介

www.openmp.org

GNU的gomp项目;

Include <omp.h>;编译参数-fopenmp打开openmp,如果使用-lgomp则编译成单线程版本;

条件编译 #ifdef _OPENMP

声明并行区,由编译器和运行时库确定线程的创建、终止、调度和数量,并行区结束后线程挂起等待进入下一并行区;

Intel编译器的OMP开关,关上时将编译成非并行代码,-Qopenmp

2        将for并行化

#pragma omp parallel for

1,  比较操作不能为!=和==;

2,  步长必须为循环不变量;

3,  单入口单出口,不能有break和goto

循环多线程化需要避免“迭代相关”,要求循环执行的次序可以被任意打乱和组织,而不必安装常规的循环变量依次变化的方式执行;

循环并行化的一种方式是:把循环均分成n段,每段由一个线程并行执行;

消除迭代相关的一种方法:手动对循环分段,再使用section指令,每段一个section:

#pragma omp section

3        Private子句

将被多线程共享,而逻辑上独立的变量使用private;private变量会在每个线程中保存一个副本,并使用默认值初始化;

int x;

#pragma omp parallel for private(x)

for(…){

       x = …

}

上面也可以通过将x声明到循环体内解决

4        Schedule子句控制调度

schedule(kind[,chunksize])

l         static调度策略,循环被近乎均分的方式分配给各线程,一般不指定块大小;

l         dynamic,使用内部任务队列,线程执行完被分配的块后再从队列中取新的任务执行;

l         guided,与dynamic类似,但先取较大块后逐渐减小,以减少访问内部队列的次数;

l         runtime,运行时通过环境变量确定具体调度策略,如:

export OMP_SCHEDULE=dynamic,16

5        reduction子句

sum = 0

#pragma omp parallel for reduction(+:sum)

for(…)

       sum = sum + fun(k);

这样编译器生成每个线程的sum副本,并按一定规则附相应初始值,循环完成时再将它们合并到原始的sum变量;类似“+”的操作还可以有-/*/&/等;

6        Barrier栅障——线程同步

For循环与section结构中隐含使用了栅障,nowait子句去除它

#pragma omp for nowait

#pragma omp barrier            显示使用栅障

 

7        并行区中的串行区

只由一个线程执行一次

#pragma omp master            只由主线程执行

#pragma omp single              只由一个线程执行一次

8        临界区与原子操作

#pragma omp critical

#pragma omp critical(name)         命名临界区,这样该临界区就可以在多处被引用了

#pragma omp atomic                   只能是简单操作

9        函数

需要#include <omp.h>,不建议使用;

omp_set_num_threads(n)

omp_get_thread_num()                              线程编号

omp_get_num_procs()                               CPU数量

10  If子句

#pragma omp parallel for if(n>100)             n>100时才执行并行化

11  环境变量

OMP_SCHEDULE

OMP_NUM_THREADS                      默认线程数


转载自:http://hi.baidu.com/piaoshi111/item/4cea2940b1d8d493823ae135

_OPENMP宏可以用来判断OpenMP是否被支持,通过它可以写出任何C语言编译器(即使不支持OpenMP)都可以编译的代码。代码如下所示:

#ifdef _OPENMP #include <omp.h>#else #define omp_get_thread_num() 0#endif

Visual C++® 2008对OpenMP的支持

       VC++2008根据项目属性配置的指示进行 /openmp编译器切换,当配置了OpenMP支持后,编译器会提供_OPENMP定义,可以使用#ifdef _OPENMP来决定程序使用或者不使用OpenMP。

配置VC++2008项目,在project的property页面上的C/C++ -> Language 选项卡中将OpenMP Support这项设置为Yes,在需要使用OpenMP函数的cpp文件中引用#include <omp.h>,这样设置就完成了。


 

OpenMV Cam 提供了强大的图像处理功能,其中包括模板匹配(Template Matching)。模板匹配是一种在图像中寻找与预定义模板最相似区域的技术。它广泛应用于对象识别、定位等领域。 ### 使用方法 在 OpenMV 中实现模板匹配,需要首先加载一个模板图像,并将其作为参考用于后续的匹配操作。以下是一个基本的模板匹配程序示例: ```python import sensor, image, time # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.GRAYSCALE) # 模板匹配通常使用灰度图像 sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time=2000) # 加载模板图像 template = image.Image("/template.pgm") # 确保模板图像已存储在 OpenMV Cam 上 clock = time.clock() while(True): clock.tick() img = sensor.snapshot() # 执行模板匹配 r = img.find_template(template, threshold=0.7, step=4, search=image.SEARCH_EX) if r: img.draw_rectangle(r) # 在匹配区域绘制矩形框 print("模板匹配成功!") print(clock.fps()) ``` ### 实现方式 1. **准备模板**: - 模板图像是你希望在实时图像中查找的目标。 - 模板图像应为 `.pgm` 格式,并且存储在 OpenMV Cam 的文件系统中。 - 模板图像的大小应尽量小以提高匹配速度,同时保证清晰度[^1]。 2. **设置传感器参数**: - 推荐使用灰度图像进行模板匹配,因为颜色信息对模板匹配的帮助有限,而灰度图像可以减少计算量。 - 设置合适的帧大小(如 `QVGA`),以平衡精度和性能。 3. **调用 `find_template()` 函数**: - `threshold`:匹配阈值,范围从 0 到 1,值越高表示要求匹配越精确。 - `step`:搜索步长,值越大搜索越快,但可能降低精度。 - `search`:搜索模式,`SEARCH_EX` 表示扩展搜索,适用于整个图像范围。 4. **结果处理**: - 如果找到匹配区域,`find_template()` 返回匹配区域的矩形坐标 `(x, y, w, h)`。 - 可以通过 `draw_rectangle()` 在图像上标记出匹配区域。 ### 注意事项 - 模板匹配对尺度和旋转变化敏感。如果目标对象可能发生缩放或旋转,建议预先生成多个不同尺度/角度的模板。 - 匹配速度受模板大小和图像分辨率影响较大,适当缩小模板和降低图像分辨率可以显著提升性能。 - 在复杂背景下,可以通过调整 `threshold` 来减少误匹配的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值