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