0

私のコード

function(Mat m , ...){
//some code here
vector<Mat> chnls;

split(LA, chnls);

// code to take each channel and find the max in each r and channel

    for(unsigned int z  = 0 ;z<5;z++){

        //Mat m1 = chnls[z].clone();

        //find number of elements in m that are not 0 

        //the layer and max comparison
        Mat dest1; 

        compare(LAMax,chnls[z],dest1,CMP_EQ);
        //make it binary
        threshold(dest1,dest1,0,1,THRESH_BINARY);

        //the layer and thresh comparison
        Mat dest2;

        compare(chnls[z],Scalar(thresh),dest2,CMP_EQ);
        //make it binary
        threshold(dest2,dest2,0,1,THRESH_BINARY);

        //get the nonzero indexes
        bitwise_and(dest1,dest2,dest1);         

        vector<Point> reslts = cvFind(dest1,0,1);

        cout<<"z"<<z;

        for(int i=0;i<reslts.size();i++){
            lx.push_back(reslts[i].x);
            ly.push_back(reslts[i].y);

        }

        lr.push_back(rvals[z]);
    }

/*  for(int i=0;i<chnls.size();i++){
        chnls[i].release();

    }*/


result.push_back(lx);
result.push_back(ly);
result.push_back(lr);

return result;}

コードを実行すると、実行時に次のエラーが表示されます。

HEAP[tester.exe]: Invalid Address specified to RtlFreeHeap( 01270000, 01694E80 )

エラーは、関数が実行された後、次の命令に到達する前に表示されます。

検索したところ、これはワイルドポインター(どこにも指していないポインター)エラーが原因であることがわかりました。コール スタックを見ると、次の詳細が表示されます

tester.exe!std::allocator<cv::Mat>::deallocate(cv::Mat * _Ptr=0x01694e80, unsigned int __formal=5)  Line 140 + 0x9 bytes    C++
tester.exe!std::vector<cv::Mat,std::allocator<cv::Mat> >::_Tidy()  Line 1139    C++
tester.exe!std::vector<cv::Mat,std::allocator<cv::Mat> >::~vector<cv::Mat,std::allocator<cv::Mat> >()  Line 560 C++
tester.exe!lower_eyelid_icb(cv::Mat m={...}, cv::Point_<int> center={...}, float iRadius=150.00000)  Line 413 + 0x2a bytes  C++
tester.exe!getEyelid(cv::Mat src={...}, cv::Mat * dst=0x0013f75c, cv::Point_<int> pupil={...}, int pRadius=31, int iRadius=150)  Line 858 + 0x48 bytes  C++
tester.exe!main(int argc=2, char * * argv=0x01275b20)  Line 248 + 0x55 bytes    C++
tester.exe!__tmainCRTStartup()  Line 582 + 0x17 bytes   C

一番下から 5 行目を見ると、ベクトル オブジェクトの割り当て解除にエラーがあるように見えます。

forループ内で使用しているコードにベクターオブジェクトがあります。宣言と使用方法は次のとおりです。

vector<Mat> chnls; 
split(myMat,chnls) ; //myMat is a 2 Dimensional 5 channel object. 

これが私がchlnsを使用する方法です

compare(LAMax,chnls[z],dest1,CMP_EQ);

次に、各チャネルが for ループ内の行列と比較されます。

何が問題なのですか?

VS2008 と OpenCv 2.3 を使用しています。

4

0 に答える 0