Datum:
Angehängte Dateien: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
Datum:
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 ...
Datum:
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
Datum:
Hallo Narfie Vielen Dank für den Tipp, ich versuchs mal und gib dann ne Rückmeldung...
Datum:
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...
Datum:
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] ); } } } |