Question

J'utilise OpenCV 2.3.1 sur XCode4 OS X 10.7

J'ai un code (démo) qui trouve des contours après une soustraction de base de base et l'affiche dans différentes couleurs.Cette partie fonctionne.

Je voudrais filtrer les contours plus petits qu'une taille spécifique, mais lorsque j'appelle Contourarea (), je reçois l'affirmation suivante échoue:

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

Le code correspondant est:

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);
       }

Quelle est la dernière boucle de:

#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);
}
}

Je me plaint de la pièce de code dans la source est la suivante:

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();
}

Mais je ne peux pas faire la tête ou la queue de ceci ... Je suis un INT qui est transmis à GetMat, mais ce que c'est vraiment, et pourquoi il devrait être inférieur à 0 est au-delà de moi> __ <. Cela me semble très étrange que cette fonction standard le fait, peut-on perdre une petite lumière sur cela?

Était-ce utile?

La solution

C'est une typo simple.Vous donnez à tous les contours à la fonction CONTOURREAA:

double area = contourArea(contours);

vous vouliez probablement

double area = contourArea(contours[idx]);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top