wc_3344 2014-05-14 02:46 采纳率: 0%
浏览 4675

使用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条回答 默认 最新

  • Faris_yzf 2015-10-28 00:54
    关注

    push_back的问题

    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示