2012-03-14 3 views
0

Я использую OpenCV 2.3.1 на Xcode4 OS X 10.7OpenCV, вызывая contourArea приводит к сбою утверждения в getMat

Я получил (демо) код, который находит контуры после некоторого основного вычитания фона и отображает его в различные цвета. Эта часть работает.

Я хотел бы, чтобы отфильтровать контуры меньше, чем определенный размер, но когда я называю contourArea(), я получаю следующее утверждение не в состоянии:

OpenCV Error: Assertion failed (0 <= i && i < (int)vv.size()) in getMat, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_graphics_opencv/opencv/work/OpenCV-2.3.1/modules/core/src/matrix.cpp, line 912 
terminate called throwing an exception 

Соответствующий код:

for(; idx >= 0; idx = hierarchy[idx][0]) { 
      //double area = contourArea(contours); 
      //cout << area << endl; 
      Scalar color(rand()&255, rand() &255, rand()&255); 
      drawContours(dst, contours, idx, color); 
     } 

который является последним для цикла из:

#include "opencv/cv.h" 
#include "opencv/highgui.h" 
#include <iostream> 
#include <vector> 
#include "opencv2/video/background_segm.hpp" 


using namespace std; 
using namespace cv; 

void refineSegments(const Mat& img, Mat& mask, Mat& dst) 
{ 
int niters = 3; 

vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 

Mat temp; 

dilate(mask, temp, Mat(), Point(-1,-1), niters); 
erode(temp, temp, Mat(), Point(-1,-1), niters*2); 
dilate(temp, temp, Mat(), Point(-1,-1), niters); 

findContours(temp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); 

dst = Mat::zeros(img.size(), CV_8UC3); 

if(contours.size() == 0) 
    return; 

// iterate through all the top-level contours, 
// draw each connected component with its own random color 
int idx = 0; 

for(; idx >= 0; idx = hierarchy[idx][0]) { 
    double area = contourArea(contours); 
    cout << area << endl; 
    Scalar color(rand()&255, rand() &255, rand()&255); 
    drawContours(dst, contours, idx, color); 
} 
} 

жалуется кусок кода в источнике:

if(k == STD_VECTOR_VECTOR) 
{ 
    int t = type(i); 
    const vector<vector<uchar> >& vv = *(const vector<vector<uchar> >*)obj; 
    CV_Assert(0 <= i && i < (int)vv.size()); 
    const vector<uchar>& v = vv[i]; 

    return !v.empty() ? Mat(size(i), t, (void*)&v[0]) : Mat(); 
} 

Но я не могу сделать головы или хвосты этого ... я это ИНТ, который передается getMat, но что это на самом деле, и почему она должна быть меньше, чем 0 за меня> __ <. Кажется очень странным, что эта стандартная функция делает это, может ли кто-нибудь пролить свет на это?

+0

Пожалуйста, вы можете сказать, что вы прошли по этим параметрам; -Mat и маска, Mat & dst.Please – Gypsa

ответ

0

Это простая опечатка. Вы даете все контуры функции contourArea:

double area = contourArea(contours); 

Вы, вероятно, хотели

double area = contourArea(contours[idx]); 
+0

Спасибо, это было именно то, что я хотел. > __ <извините за глупый вопрос, еще не полностью знакомый с openCV ... –