使用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);
}
}