Я пытаюсь разработать программу на c ++ с библиотекой opencv на Xcode 9.3, macOS 10.14, используя clang.В течение нескольких недель я пытался решить или понять, почему я получаю неопределенную ошибку поведения , которая иногда приводит к сбою моей программы, а иногда нет.
Я читаю набор изображений с разных камер и сохраняю их в многомерном массиве: silC [камера] [изображение].(изображения хорошо хранятся)
Я получаю эту ошибку THREAD 1: EXC_BAD_ACCESS (код = 1, адрес = 0x1177c1530), когда я делаю это: currentImage.at (x, y) даже значения currentImage не являются ни проблемой, ни изображением.
Я выкладываю приведенный ниже код, если есть шанс, что кто-то может мне помочь ..
vector< vector<Mat> > silC(8,vector<Mat>()); // Store the pbm images separating from different cameras
* Я читаю изображения и сохраняю их в silC.*
for (int z=0; z < nz; z++) {
for (int y=0; y < ny; y++) {
for (int x=0; x < nx; x++) {
// Current voxel coordinates in the 3D space
float xcoord = x*voxelsize + Ox + voxelsize/2;
float ycoord = y*voxelsize + Oy + voxelsize/2;
float zcoord = z*voxelsize + Oz + voxelsize/2;
for (int camId=0; camId < matricesP.size(); camId++) {
imgId = 0;
currentImage = silC[camId][imgId];
int w = silC[camId][imgId].cols;
int h = silC[camId][imgId].rows;
// Project the voxel from the 3D space to the images
Mat P = matricesP[camId];
Mat projection = P*(Mat_<float>(4,1) << xcoord,ycoord,zcoord,1.0);
//We get the point in homog coord.
float xp = projection.at<float>(0);
float yp = projection.at<float>(1);
float zp = projection.at<float>(2);
// Get the cartesian coord
int xp2d = cvRound(xp/zp);
int yp2d = cvRound(yp/zp);
if(xp2d >= 0 && xp2d < w && yp2d >= 0 && yp2d < h){
// all values are correct! :/
// int value = silC[camId][imgId].at<float>(xp2d, yp2d); // undefined behaviour: crashes sometimes..
int value = currentImage.at<float>(xp2d, yp2d); // undefined behaviour also crashes sometimes..
if(value == 255){
cout << "Voxel okey \n";
}
}
}
}
}
}
РЕДАКТИРОВАТЬ : решение, опубликованное в комментариях ниже, заключается в том, что вместо currentImage.at (xp2d, yp2d) -> currentImage.at (yp2d, xp2d), как cv :: Mat требует доступа.
НО , я несколько раз пытался распараллелить с openMP ( # pragma omp parallel for ), но он продолжал падать.Если кто-то знаком с параллелизацией, я буду признателен за любую помощь.