私のコード
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 を使用しています。