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

如果我们查看从底部开始的第五行,看起来在解除分配向量对象时出现了一些错误。

我在 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