2 wc 3344 wc_3344 于 2014.05.14 10:46 提问

使用openMP加速遇到的问题

使用openMP对嵌套for循环加速来遍历图像中的每个像素但是调试的时候出现问题错误提示:test.exe已出发一个断点。test.exe 中的 0x011e1297 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。有时候会出现Windows 已在 test.exe 中触发一个断点。其原因可能是堆被损坏,这说明 test.exe 中或它所加载的任何 DLL 中有 Bug。原因也可能是用户在 test.exe 具有焦点时按下了 F12。输出窗口可能提供了更多诊断信息。然后中断跳转到xstring的1070行 return(*this) this的值为d:\opencv2.4.5\opencv\build\include\opencv2\core\mat.hpp" std::basic_string,std::allocator > * const
我尝试跑空循环是没有错的,不知道为什么,求教

static void initGMMs( const Mat& img, const Mat& mask, GMM& bgdGMM, GMM& fgdGMM )

{

const int kMeansItCount = 10; //迭代次数

const int kMeansType = KMEANS_PP_CENTERS; //Use kmeans++ center initialization by Arthur and Vassilvitskii

Mat bgdLabels, fgdLabels; //记录背景和前景的像素样本集中每个像素对应GMM的哪个高斯模型,论文中的kn  
vector<Vec3f> bgdSamples, fgdSamples; //背景和前景的像素样本集  
int x,y;
#pragma omp parallel for
for (y = 0; y < img.rows; y++)
//for( p.y = 0; p.y < img.rows; p.y++ )  
{  
    for (x = 0; x < img.cols; x++)
    //for( p.x = 0; p.x < img.cols; p.x++ )  
    {  
        #pragma omp critical
        {
        Point p;
        p.y = y;
        p.x = x;
        //mask中标记为GC_BGD和GC_PR_BGD的像素都作为背景的样本像素  
        if( mask.at<uchar>(p) == GC_BGD || mask.at<uchar>(p) == GC_PR_BGD )  
            bgdSamples.push_back( (Vec3f)img.at<Vec3b>(p) );  
        else  
            fgdSamples.push_back( (Vec3f)img.at<Vec3b>(p) );
        }
    } 
 }  


CV_Assert( !bgdSamples.empty() && !fgdSamples.empty() );  

Mat _bgdSamples( (int)bgdSamples.size(), 3, CV_32FC1, &bgdSamples[0][0] );  
kmeans( _bgdSamples, GMM::componentsCount, bgdLabels,  
        TermCriteria( CV_TERMCRIT_ITER, kMeansItCount, 0.0), 0, kMeansType );  
Mat _fgdSamples( (int)fgdSamples.size(), 3, CV_32FC1, &fgdSamples[0][0] );  
kmeans( _fgdSamples, GMM::componentsCount, fgdLabels,  
        TermCriteria( CV_TERMCRIT_ITER, kMeansItCount, 0.0), 0, kMeansType );  

bgdGMM.initLearning();  
try
{
#pragma omp parallel for
for( int i = 0; i < (int)bgdSamples.size(); i++ )  
    bgdGMM.addSample( bgdLabels.at<int>(i,0), bgdSamples[i] );  
bgdGMM.endLearning();  
}
catch( cv::Exception& e )
{
    const char* err_msg = e.what();
    printf ("%s\n", err_msg);
}
fgdGMM.initLearning(); 
int t = (int)fgdSamples.size();
try
{
#pragma omp parallel for
for( int i = 0; i < (int)fgdSamples.size(); i++ )  
    fgdGMM.addSample( fgdLabels.at<int>(i,0), fgdSamples[i] );  
fgdGMM.endLearning();  
}
catch(cv::Exception& e)
{
    const char* err_msg = e.what();
    printf ("%s\n", err_msg);
}

}

1个回答

yzf060109
yzf060109   2015.10.28 08:54

push_back的问题

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
使用openmp加速法线估计
在PCL中使用pcl::NormalEstimation来对法线进行估计。但在对数量较大的点云进行法线计算时会耗时很长,实时性很差。PCL库提供了利用OpenMP来进行多核/多线程开发,以加快计算速度。但在使用时有可能出现以下问题:num_threads 子句的参数必须是正值。 这种结果通常出现在32位程序中。虽然不会影响结果,却看着让人很不爽。解决的办法如下:只需在此前加入compute的线程
用openMP进行并行加速
最近在看多核编程。简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核CPU的强大功能,于是多核编程应运而生。按照我的理解,多核编程可以认为是对多线程编程做了一定程度的抽象,提供一些简单的API,使得用户不必花费太多精力来了解多线程的底层知识,从而提高编程效率。这两天关注的多核编程的工具包括openMP和TBB。按照目前网上的讨论,
使用OpenMP给程序加速
最近面试总是谈到效率问题,这个问题以前一直没考虑过,就是稀里糊涂的写。之前有看到过OpenMP,也不曾深究,看到这篇博客关于OpenMP写的非常详细,就转来慢慢学习吧。 OpenMP语法简介:  你想让你的程序运行的更快吗? 你想让你的程序在改动很少代码的基础上免费的飞奔起来吗?  如果答案是肯定的,向您推荐Inter免费的OpenMP。 OpenMP是基于多核处
【opencv+OpenMP】OpenMP并行编程应用—加速OpenCV图像拼接算法
OpenMP是一种应用于多处理器程序设计的并行编程处理方案,它提供了对于并行编程的高层抽象,只需要在程序中添加简单的指令,就可以编写高效的并行程序,而不用关心具体的并行实现细节,降低了并行编程的难度和复杂度。也正因为OpenMP的简单易用性,它并不适合于需要复杂的线程间同步和互斥的场合。 OpenCV中使用Sift或者Surf特征进行图像拼接的算法,需要分别对两幅或多幅图像进行特
Qt使用openmp并行化加速程序
最近一个客户需要处理大量股票数据,并跑到数据库里,原来的程序导入数据到数据库需要两天,所以并行化数据很重要。 废话少说,上代码测试。工具Qt,编译器VC2010或Vc2013 第一步:使用QtCreator创建控制台程序,并在.pro文件里添加 QMAKE_CXXFLAGS += /openmp 第二步:编写测试代码 #include #include int main(int
如何利用VS的代码优化和openmp并行计算提高程序运行速度
以前利用多线程为拥有较大量计算的程序提速过,但也深知多线程的同步和程序的调试是一大坑,最近为实验室的项目学习了一点VS下优化代码的设置以及利用openmp加速运算,都是些很基本的提升程序速度的方法,只要稍微修改下代码和设置,就可使程序加速。配合多线程,经过clock()函数验证,我的程序运行可提高60%的速度
Qt下使用OpenMP并行for循环
1. 在source文件中包含 omp.h 头文件#include "omp.h"2. 在项目的 .pro文件中添加两行配置若使用msvc2010编译器:#openmp QMAKE_CXXFLAGS += -openmp QMAKE_LFLAGS += -openmp若使用gcc编译器:#openmp QMAKE_CXXFLAGS += -fopenmp QMAKE_LFLAGS += -fo
Eigen优化实录
Eigen优化实录
python--用 OpenMP 并行多核加速 Python!
转自:http://blog.csdn.net/gzlaiyonghao/article/details/6670128/ 赖勇浩(http://laiyonghao.com) 注: 0、读懂这篇文章需要了解 OpenMP 基本用法。 1、读懂这篇文章需要了解 GIL 基本概念。 2、基本上是这篇的翻译:http://docs.cython.org/src/userguide/paral
OpenMP并行编程应用—加速OpenCV图像拼接算法
OpenMP是一种应用于多处理器程序设计的并行编程处理方案,它提供了对于并行编程的高层抽象,只需要在程序中添加简单的指令,就可以编写搞笑的并行程序,而不用关心具体的并行实现细节,降低了并行编程的难度和复杂度。也正因为OpenMP的简单易用性,它并不适合于需要复杂的线程间同步和互斥的场合。 OpenCV中使用Sift或者Surf特征进行图像拼接的算法,需要分别对两幅或多幅图像进行特征提取和特征描述