Я работаю с OpenCV для вычисления дескрипторов ORB, проблема у меня заключается в том, что в случайные моменты выполнения я получаю такую ошибку
LightFieldRecovery (3468,0x7fff73a9a310) malloc: * ошибка для объекта 0x100911608: неверная контрольная сумма для освобожденного объекта — объект, вероятно, был изменен после освобождения.
* установить точку останова в malloc_error_break для отладки
Я не работаю с указателем (явно) Я использую std :: vectors в качестве контейнеров данных.
Код слишком длинный, чтобы разместить его здесь, но вы могли видеть его https://github.com/BRabbit27/LigthField/blob/master/LightFieldRecovery/main.cpp
Кто-нибудь может определить, где может быть эта ошибка? Я искал это целый день.
Я работаю под OS X Mavericks, Xcode 5 и C ++ (в настройках сборки в Xcode Диалект C ++ установлен в -станд = гну ++ 11 в противном случае я не могу скомпилировать код OpenCV)
РЕДАКТИРОВАТЬ
С помощью Valgrind мне удалось сузить проблему до следующих фрагментов кода, но я не вижу, в чем ошибка, я не понимаю, чего мне не хватает при копировании данных из cv::Mat
в uchar*
указатель.
Ошибка А
//GET THE RIGHT AND DOWN NEIGHBORS TO COMPUTE THE DIFFERENCES
uint offset = 0;
for (Pixel p : patchPos)
{
uint r = p.getY();
uint c = p.getX();
uchar pixelV = ((uchar*)camRef->getData())[r*imageW+c];
uint cRightNeighbor = c+patchStep;
uchar pixelVrightP = 0;
if (cRightNeighbor < imageW)
{
pixelVrightP = abs(pixelV - ((uchar*)camRef->getData())[r*imageW+cRightNeighbor]);
}
uint rDownNeighbor = r+patchStep;
uchar pixelVbelowP = 0;
if (rDownNeighbor < imageH)
{
pixelVbelowP = abs(pixelV - ((uchar*)camRef->getData())[rDownNeighbor*imageW+c]);
}
//THIS IS PART OF THE ERROR
Cdiff[iPatch*(patchSize*patchSize)*2 + offset] = pixelVrightP;
Cdiff[iPatch*(patchSize*patchSize)*2 + offset+(patchSize*patchSize)] = pixelVbelowP;
offset++;
}
Ошибка Б
Видимо, как я притворяюсь использовать memset
не очень хороший
for (uint dRow = 0; dRow < camPatchKeyPoints.size(); dRow++)
{
if (camPatchKeyPoints[dRow].pt.x < 0 || camPatchKeyPoints[dRow].pt.y < 0 ||
camPatchKeyPoints[dRow].pt.x > imageW || camPatchKeyPoints[dRow].pt.y > imageH)
{
memset(&(d.data[dRow*d.cols]), 0, sizeof(uchar)*d.cols);
}
}
Ошибка C
Аналогично с memcpy
Я передаю неправильные параметры или копирую в область за пределами
dst = Q;
for (uint dl = 0; dl < disparityLevels; dl++)
{
for (uint c = 0; c < (nTotalCams-1); c++)
{
memcpy(dst, &(((uchar*)(camsDescriptors[c].data))[dl*DESCRIPTOR_SIZE]), sizeof(uchar)*DESCRIPTOR_SIZE);
dst += DESCRIPTOR_SIZE;
}
}
Ошибка D
dst = Y;
for (cv::Mat refD : refsDescriptors)
{
memcpy(dst, refD.data, sizeof(uchar)*DESCRIPTOR_SIZE);
dst += DESCRIPTOR_SIZE;
}
Задача ещё не решена.
Других решений пока нет …