Forum: PC-Programmierung OpenCV Fehlermeldung bei MeanShiftAlgorithm


von Antonio C. (antonio-c)


Angehängte Dateien:

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):

1
if (m_meanShiftAlgoOn)
2
  {
3
    cv::Mat hsv;
4
    vector<cv::Mat> v;
5
    int minSat=65;
6
    cv::Mat result1;
7
    cv::Mat result2;
8
    ObjectFinder finder;
9
    int ch[1]={0};
10
11
    if (m_firstFrame)
12
    {
13
      m_firstFrame = false;
14
      // Define ROI
15
      cv::Mat imageROI= m_currentFrame(cv::Rect(m_meanShift_xPos,m_meanShift_yPos,
16
                            m_meanShift_width,m_meanShift_height));
17
      cv::rectangle(m_currentFrame,    cv::Rect(m_meanShift_xPos,m_meanShift_yPos,m_meanShift_width,
18
                            m_meanShift_height),cv::Scalar(0,0,255));
19
      // Get the Hue histogram
20
      ColorHistogram hc;
21
      cv::MatND colorhist= hc.getHueHistogram(imageROI,minSat);
22
23
      finder.setHistogram(colorhist);
24
      finder.setThreshold(0.2f);
25
26
      // Convert to HSV space
27
      cv::cvtColor(m_currentFrame, hsv, CV_BGR2HSV);
28
29
      // Split the image
30
      cv::split(hsv,v);
31
32
      // Eliminate pixels with low saturation
33
      cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
34
      // for debug only: shows the frame with threshold
35
      //m_currentFrame = v[1];
36
37
      // Get back-projection of hue histogram
38
      result1= finder.find(hsv,0.0f,180.0f,ch,1);
39
      // for debug only: shows the frame with back-projection of hue histogram
40
      //m_currentFrame = result1;
41
42
      cv::bitwise_and(result1,v[1],result1);
43
      // for debug only: shows the frame with bitwise_and of src1 and src2
44
      //m_currentFrame = result1;
45
    }
46
    else
47
    {
48
      // Second frame
49
50
      // Convert to HSV space
51
      cv::cvtColor(m_currentFrame, hsv, CV_BGR2HSV);
52
53
      // Split the frame
54
      cv::split(hsv,v);
55
56
      // Eliminate pixels with low saturation
57
      cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
58
      // for debug only: shows the frame with eliminated pixels with low saturation
59
      //m_currentFrame = v[1];
60
61
      // Get back-projection of hue histogram
62
      result2= finder.find(hsv,0.0f,180.0f,ch,1);         //Hier gibt es einen Absturz...
63
      // for debug only: shows the frame with back-projection of hue histogram
64
      //m_currentFrame = result2;
65
66
      // Eliminate low stauration pixels
67
      cv::bitwise_and(result2,v[1],result2);
68
69
      // Get back-projection of hue histogram
70
      finder.setThreshold(-1.0f);
71
      result2= finder.find(hsv,0.0f,180.0f,ch,1);
72
      cv::bitwise_and(result2,v[1],result2);
73
74
      cv::Rect rect(m_meanShift_xPos,m_meanShift_yPos,m_meanShift_width,m_meanShift_height);
75
      cv::rectangle(m_currentFrame, rect, cv::Scalar(0,0,255));
76
77
      cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER,10,0.01);
78
     
79
      cv::rectangle(m_currentFrame, rect, cv::Scalar(0,255,0));
80
81
    }
82
  }
83
  else
84
    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)

1
void cv::calcBackProject( const Mat* images, int nimages, const int* channels,
2
                          InputArray _hist, OutputArray _backProject,
3
                          const float** ranges, double scale, bool uniform )
4
{
5
    Mat hist = _hist.getMat();
6
    vector<uchar*> ptrs;
7
    vector<int> deltas;
8
    vector<double> uniranges;
9
    Size imsize;
10
    int dims = hist.dims == 2 && hist.size[1] == 1 ? 1 : hist.dims;
11
    
12
    CV_Assert( dims > 0 && hist.data );                                    // line 1163
13
    _backProject.create( images[0].size(), images[0].depth() );
14
    Mat backProject = _backProject.getMat();
15
    histPrepareImages( images, nimages, channels, backProject, dims, hist.size, ranges,
16
                       uniform, ptrs, deltas, imsize, uniranges );
17
    const double* _uniranges = uniform ? &uniranges[0] : 0;
18
    
19
    int depth = images[0].depth();
20
    if( depth == CV_8U )
21
        calcBackProj_8u(ptrs, deltas, imsize, hist, dims, ranges, _uniranges, (float)scale, uniform);
22
    else if( depth == CV_16U )
23
        calcBackProj_<ushort, ushort>(ptrs, deltas, imsize, hist, dims, ranges, _uniranges, (float)scale, uniform );
24
    else if( depth == CV_32F )
25
        calcBackProj_<float, float>(ptrs, deltas, imsize, hist, dims, ranges, _uniranges, (float)scale, uniform );
26
    else
27
        CV_Error(CV_StsUnsupportedFormat, "");
28
}



Danke für die schnellen Tipps im Voraus.

Gruss Antonio

von Antonio C. (antonio-c)


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


...

von Narfie (Gast)


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

von Antonio C. (antonio-c)


Lesenswert?

Hallo Narfie

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

von Antonio C. (Gast)


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...

von Antonio C. (Gast)


Lesenswert?

hier noch den Code auf der die Fehlermeldung verweist:

1
static void histPrepareImages( const Mat* images, int nimages, const int* channels,
2
                           const Mat& mask, int dims, const int* histSize,
3
                           const float** ranges, bool uniform,
4
                           vector<uchar*>& ptrs, vector<int>& deltas,
5
                           Size& imsize, vector<double>& uniranges )
6
{
7
int i, j, c;
8
CV_Assert( channels != 0 || nimages == dims );
9
10
imsize = images[0].size();
11
int depth = images[0].depth(), esz1 = (int)images[0].elemSize1();
12
bool isContinuous = true;
13
14
ptrs.resize(dims + 1);
15
deltas.resize((dims + 1)*2);
16
17
for( i = 0; i < dims; i++ )
18
{
19
    if(!channels)
20
    {
21
        j = i;
22
        c = 0;
23
        CV_Assert( images[j].channels() == 1 );
24
    }
25
    else
26
    {
27
        c = channels[i];
28
        CV_Assert( c >= 0 );
29
        for( j = 0; j < nimages; c -= images[j].channels(), j++ )
30
            if( c < images[j].channels() )
31
                break;
32
        CV_Assert( j < nimages );               // line 148
33
    }
34
35
    CV_Assert( images[j].size() == imsize && images[j].depth() == depth );
36
    if( !images[j].isContinuous() )
37
        isContinuous = false;
38
    ptrs[i] = images[j].data + c*esz1;
39
    deltas[i*2] = images[j].channels();
40
    deltas[i*2+1] = (int)(images[j].step/esz1 - imsize.width*deltas[i*2]);
41
}
42
43
if( mask.data )
44
{
45
    CV_Assert( mask.size() == imsize && mask.channels() == 1 );
46
    isContinuous = isContinuous && mask.isContinuous();
47
    ptrs[dims] = mask.data;
48
    deltas[dims*2] = 1;
49
    deltas[dims*2 + 1] = (int)(mask.step/mask.elemSize1());
50
}
51
52
if( isContinuous )
53
{
54
    imsize.width *= imsize.height;
55
    imsize.height = 1;
56
}
57
58
if( !ranges )
59
{
60
    CV_Assert( depth == CV_8U );
61
62
    uniranges.resize( dims*2 );
63
    for( i = 0; i < dims; i++ )
64
    {
65
        uniranges[i*2] = histSize[i]/256.;
66
        uniranges[i*2+1] = 0;
67
    }
68
}
69
else if( uniform )
70
{
71
    uniranges.resize( dims*2 );
72
    for( i = 0; i < dims; i++ )
73
    {
74
        CV_Assert( ranges[i] && ranges[i][0] < ranges[i][1] );
75
        double low = ranges[i][0], high = ranges[i][1];
76
        double t = histSize[i]/(high - low);
77
        uniranges[i*2] = t;
78
        uniranges[i*2+1] = -t*low;
79
    }
80
}
81
else
82
{
83
    for( i = 0; i < dims; i++ )
84
    {
85
        size_t j, n = histSize[i];
86
        for( j = 0; j < n; j++ )
87
            CV_Assert( ranges[i][j] < ranges[i][j+1] );
88
    }
89
}
90
91
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.