www.mikrocontroller.net

Forum: PC-Programmierung OpenCV Fehlermeldung bei MeanShiftAlgorithm


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Antonio C. (antonio-c)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Zusammen

Ich verwende den MeanShiftAlgorithm von OpenCV in unsere Diplomarbeit.
Das Example in QT4.6 funktiniert gut. Nur in unsere eigene GUI 
Anwendung, wo wir ein 320x3x240 RGB Stream erhalten, gibt es folgende 
Fehlermeldung:

OpenCV Error: Assertion failed (dims > 0 && hist.data) in 
calcBackProject, file 
/home/luca/OpenCvSDK/opencv-src/modules/imgproc/src/histogram.cpp, line 
1163
terminate called after throwing an instance of 'cv::Exception'
  what(): 
/home/luca/OpenCvSDK/opencv-src/modules/imgproc/src/histogram.cpp:1163: 
error: (-215) dims > 0 && hist.data in function calcBackProject

Die GUI wird unter Ubuntu mit Eclipse/QT4.6 programmiert.

hier noch ein code-schnippsel (im Anhang noch 2 *.h files):

if (m_meanShiftAlgoOn)
  {
    cv::Mat hsv;
    vector<cv::Mat> v;
    int minSat=65;
    cv::Mat result1;
    cv::Mat result2;
    ObjectFinder finder;
    int ch[1]={0};

    if (m_firstFrame)
    {
      m_firstFrame = false;
      // Define ROI
      cv::Mat imageROI= m_currentFrame(cv::Rect(m_meanShift_xPos,m_meanShift_yPos,
                            m_meanShift_width,m_meanShift_height));
      cv::rectangle(m_currentFrame,    cv::Rect(m_meanShift_xPos,m_meanShift_yPos,m_meanShift_width,
                            m_meanShift_height),cv::Scalar(0,0,255));
      // Get the Hue histogram
      ColorHistogram hc;
      cv::MatND colorhist= hc.getHueHistogram(imageROI,minSat);

      finder.setHistogram(colorhist);
      finder.setThreshold(0.2f);

      // Convert to HSV space
      cv::cvtColor(m_currentFrame, hsv, CV_BGR2HSV);

      // Split the image
      cv::split(hsv,v);

      // Eliminate pixels with low saturation
      cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
      // for debug only: shows the frame with threshold
      //m_currentFrame = v[1];

      // Get back-projection of hue histogram
      result1= finder.find(hsv,0.0f,180.0f,ch,1);
      // for debug only: shows the frame with back-projection of hue histogram
      //m_currentFrame = result1;

      cv::bitwise_and(result1,v[1],result1);
      // for debug only: shows the frame with bitwise_and of src1 and src2
      //m_currentFrame = result1;
    }
    else
    {
      // Second frame

      // Convert to HSV space
      cv::cvtColor(m_currentFrame, hsv, CV_BGR2HSV);

      // Split the frame
      cv::split(hsv,v);

      // Eliminate pixels with low saturation
      cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
      // for debug only: shows the frame with eliminated pixels with low saturation
      //m_currentFrame = v[1];

      // Get back-projection of hue histogram
      result2= finder.find(hsv,0.0f,180.0f,ch,1);         //Hier gibt es einen Absturz...
      // for debug only: shows the frame with back-projection of hue histogram
      //m_currentFrame = result2;

      // Eliminate low stauration pixels
      cv::bitwise_and(result2,v[1],result2);

      // Get back-projection of hue histogram
      finder.setThreshold(-1.0f);
      result2= finder.find(hsv,0.0f,180.0f,ch,1);
      cv::bitwise_and(result2,v[1],result2);

      cv::Rect rect(m_meanShift_xPos,m_meanShift_yPos,m_meanShift_width,m_meanShift_height);
      cv::rectangle(m_currentFrame, rect, cv::Scalar(0,0,255));

      cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER,10,0.01);
     
      cv::rectangle(m_currentFrame, rect, cv::Scalar(0,255,0));

    }
  }
  else
    m_firstFrame = true;



in ersten Durchgang wird eine Region of Interest platziert, da 
funktioniert das Programm noch ohen Absturz.
In der nächsten Runde (else), soll er Anhand des Hystogramms das Objekt 
in den folgenden RGB-Streaming erkennen und mit einem neuen Rechteck 
verfolgen.


hier noch die Funktion im file histogramm.cpp / line 1163 (wie in 
Fehlermeldung angegeben)

void cv::calcBackProject( const Mat* images, int nimages, const int* channels,
                          InputArray _hist, OutputArray _backProject,
                          const float** ranges, double scale, bool uniform )
{
    Mat hist = _hist.getMat();
    vector<uchar*> ptrs;
    vector<int> deltas;
    vector<double> uniranges;
    Size imsize;
    int dims = hist.dims == 2 && hist.size[1] == 1 ? 1 : hist.dims;
    
    CV_Assert( dims > 0 && hist.data );                                    // line 1163
    _backProject.create( images[0].size(), images[0].depth() );
    Mat backProject = _backProject.getMat();
    histPrepareImages( images, nimages, channels, backProject, dims, hist.size, ranges,
                       uniform, ptrs, deltas, imsize, uniranges );
    const double* _uniranges = uniform ? &uniranges[0] : 0;
    
    int depth = images[0].depth();
    if( depth == CV_8U )
        calcBackProj_8u(ptrs, deltas, imsize, hist, dims, ranges, _uniranges, (float)scale, uniform);
    else if( depth == CV_16U )
        calcBackProj_<ushort, ushort>(ptrs, deltas, imsize, hist, dims, ranges, _uniranges, (float)scale, uniform );
    else if( depth == CV_32F )
        calcBackProj_<float, float>(ptrs, deltas, imsize, hist, dims, ranges, _uniranges, (float)scale, uniform );
    else
        CV_Error(CV_StsUnsupportedFormat, "");
}



Danke für die schnellen Tipps im Voraus.

Gruss Antonio

Autor: Antonio C. (antonio-c)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Die Paramter für die Region of Interest sind die folgenden:

m_meanShift_xPos= 80
m_meanShift_yPos= 120
m_meanShift_width= 80
m_meanShift_height= 90


...

Autor: Narfie (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi,

nur mal auf den ersten Blick: Der finder wird bei jedem Aufruf der 
Methode neu erzeugt. Im if-Zweig, definiert du was gesucht werden soll: 
finder.setHistogram(colorhist);
finder.setThreshold(0.2f);

Allerdings enthält beim zweiten Aufruf der finder diese Informationen 
nicht mehr (else-Zweig), da er neu angelegt wird. Aber ich kenne die API 
von opencv zu wenig um zu sagen ob hier das Problem liegt....

Aber ist ja kein Problem das zu testen, kannst ja finder mal static 
machen für den Test. Wenn du den Fehler findest kannst du ja mal eine 
Rückmeldung geben woran es gelegen hat.

Viele Grüße,
Narfie

Autor: Antonio C. (antonio-c)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Narfie

Vielen Dank für den Tipp, ich versuchs mal und gib dann ne 
Rückmeldung...

Autor: Antonio C. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ich habe den finder und andere Eigenschaften im Header eingefügt. Jetzt 
habe ich aber folgende Fehlermeldung:


OpenCV Error: Assertion failed (j < nimages) in histPrepareImages, file 
/home/luca/OpenCvSDK/opencv-src/modules/imgproc/src/histogram.cpp, line 
148
terminate called after throwing an instance of 'cv::Exception' what(): 
/home/luca/OpenCvSDK/opencv-src/modules/imgproc/src/histogram.cpp:148: 
error: (-215) j < nimages in function histPrepareImages

Der Absturz ist an der gleichen Stelle im else Zweig...

Autor: Antonio C. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
hier noch den Code auf der die Fehlermeldung verweist:

static void histPrepareImages( const Mat* images, int nimages, const int* channels,
                           const Mat& mask, int dims, const int* histSize,
                           const float** ranges, bool uniform,
                           vector<uchar*>& ptrs, vector<int>& deltas,
                           Size& imsize, vector<double>& uniranges )
{
int i, j, c;
CV_Assert( channels != 0 || nimages == dims );

imsize = images[0].size();
int depth = images[0].depth(), esz1 = (int)images[0].elemSize1();
bool isContinuous = true;

ptrs.resize(dims + 1);
deltas.resize((dims + 1)*2);

for( i = 0; i < dims; i++ )
{
    if(!channels)
    {
        j = i;
        c = 0;
        CV_Assert( images[j].channels() == 1 );
    }
    else
    {
        c = channels[i];
        CV_Assert( c >= 0 );
        for( j = 0; j < nimages; c -= images[j].channels(), j++ )
            if( c < images[j].channels() )
                break;
        CV_Assert( j < nimages );               // line 148
    }

    CV_Assert( images[j].size() == imsize && images[j].depth() == depth );
    if( !images[j].isContinuous() )
        isContinuous = false;
    ptrs[i] = images[j].data + c*esz1;
    deltas[i*2] = images[j].channels();
    deltas[i*2+1] = (int)(images[j].step/esz1 - imsize.width*deltas[i*2]);
}

if( mask.data )
{
    CV_Assert( mask.size() == imsize && mask.channels() == 1 );
    isContinuous = isContinuous && mask.isContinuous();
    ptrs[dims] = mask.data;
    deltas[dims*2] = 1;
    deltas[dims*2 + 1] = (int)(mask.step/mask.elemSize1());
}

if( isContinuous )
{
    imsize.width *= imsize.height;
    imsize.height = 1;
}

if( !ranges )
{
    CV_Assert( depth == CV_8U );

    uniranges.resize( dims*2 );
    for( i = 0; i < dims; i++ )
    {
        uniranges[i*2] = histSize[i]/256.;
        uniranges[i*2+1] = 0;
    }
}
else if( uniform )
{
    uniranges.resize( dims*2 );
    for( i = 0; i < dims; i++ )
    {
        CV_Assert( ranges[i] && ranges[i][0] < ranges[i][1] );
        double low = ranges[i][0], high = ranges[i][1];
        double t = histSize[i]/(high - low);
        uniranges[i*2] = t;
        uniranges[i*2+1] = -t*low;
    }
}
else
{
    for( i = 0; i < dims; i++ )
    {
        size_t j, n = histSize[i];
        for( j = 0; j < n; j++ )
            CV_Assert( ranges[i][j] < ranges[i][j+1] );
    }
}

}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net