1

我正在使用 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 的 Build Settings 下,C++ Language Dialect设置为-std=gnu++11否则我无法编译 OpenCV 代码)

编辑

在 Valgrind 的帮助下,我能够将问题缩小到以下代码段,但我看不出错误是什么,我不明白将数据从 a 复制cv::Matuchar*指针时我错过了什么。

错误 A

        //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++;
        }

错误 B

显然我假装使用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;
    }
4

0 回答 0