2013-07-15 124 views
0

我想用OpenCV繪製圍繞輪廓的邊界框。這是所有的圖像從攝像機實時搶下了實時應用,而以下是代碼向量超出範圍

的重要組成部分RTMotionDetector.h

vector<vector<Point>> *contours; 
    vector<vector<Point>> *contoursPoly; 

RTMotionDetector.cpp

RTMotionDetector::RTMotionDetector(void) 
{ 
    current = new Mat(); 
    currentGrey = new Mat(); 
    canny = new Mat(); 
    next = new Mat(); 
    absolute = new Mat(); 

    cam1 = new VideoCapture(); 
    cam2 = new VideoCapture(); 

    contours = new vector<vector<Point>>(); 
    contoursPoly = new vector<vector<Point>>(); 
    boundRect = new vector<Rect>(); 

} 

double RTMotionDetector::getMSE(Mat I1, Mat I2) 
{ 
    Mat s1; 

    //Find difference 
    cv::absdiff(I1, I2, s1);  // |I1 - I2| 
    imshow("Difference",s1); 

    //Do canny to get edges 
    cv::Canny(s1,*canny,30,30,3); 
    imshow("Canny",*canny); 

    //Find contours 
    findContours(*canny,*contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); 
    //System::Windows::Forms::MessageBox::Show(""+contours->size()); 

    //Draw contours 
    drawContours(*current,*contours,-1,Scalar(0,0,255),2); 
    for(int i=0;i<contours->size();i++) 
    { 
     cv::approxPolyDP(Mat((*contours)[i]),(*contoursPoly)[i],3,true); 
     //boundRect[i] = boundingRect(contoursPoly[i]); 
    } 
} 

一旦下面的部分得到執行,我得到一個錯誤

cv::approxPolyDP(Mat((*contours)[i]),(*contoursPoly)[i],3,true); 

這是我收到的錯誤。

enter image description here

如果我註釋掉的代碼,則沒有問題。我知道這是ArrayIndexOutOfBounds問題,但我真的找不到修復程序。可能是因爲我是Windows編程新手。

contours作爲一個指針而不是本地變量保留是非常重要的,因爲局部變量以一種令人難以置信的方式減慢了程序的速度。

請幫我解決這個問題。謝謝。

+3

我從來沒有在一個地方見過這麼多'新'。如果你絕對必須有指針**,請使用智能指針**。 – chris

+2

按重試,調試應用程序。有機會你沒有用任何東西來填充你的矢量。 –

+0

@TheForest和TheTrees:我做到了。沒有什麼變化:( –

回答

3

您需要找到哪個向量超出了其界限。

你循環直到輪廓的大小,

for(int i=0;i<contours->size();i++) 

但隨後訪問(*contoursPoly)[i]

我會大膽地猜測,該contoursPoly已經超越它的界限,你可以打破進入調試器檢查如建議。

改變環路

for(int i=0;i<contours->size() && i<contoursPoly->size();i++) 

可能解決眼前的問題。

+0

是的,正確。我用你的技術,直到我找到完整的修復。謝謝 :) –

1

這裏

(*contoursPoly)[i] 

您嘗試訪問的東西不存在。

更重要的是,該文件說:

C++:無效approxPolyDP(InputArray曲線,OutputArray approxCurve,雙ε,布爾關閉) ... approxCurve - (...)的類型應與輸入曲線(...)

這裏有輸入的類型 - 墊和輸出 - 矢量<點>。也許這也是可行的,IDK。