Почему я получаю неопределенное поведение (EXC_BAD_ACCESS (code = 1, address = 0x1177c1530)), когда я получаю доступ к позиции матрицы (opencv mat) в Xcode - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь разработать программу на 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 ), но он продолжал падать.Если кто-то знаком с параллелизацией, я буду признателен за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...