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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!