2017-02-20 7 views
1

Ich versuche, OpenCV SVM Classifier in Cocos2D-X-Spiel zu verwenden. Hier ist eine einfache Testfunktion:OpenCV Fehler: Assertion fehlgeschlagen (samples.cols == var_count && samples.type() == CV_32F) in Vorhersage

void HelloWorld::testOpenCV(){ 
    // Load SVM classifier 
    auto classifierPath = FileUtils::getInstance()->fullPathForFilename("classifier.yml"); 
    cv::Ptr<cv::ml::SVM> svm = cv::ml::StatModel::load<cv::ml::SVM>(classifierPath); 

    string filename = "test.jpg"; 

    auto img = new Image(); 
    img->initWithImageFile(filename); 

    int imageSize = (int)img->getDataLen(); 
    int imageXW = img->getWidth(); 
    int imageYW = img->getHeight(); 
    unsigned char * srcData = img->getData(); 

    CCLOG("imageXW=%d, imageYW=%d", imageXW, imageYW); 
    int ch = imageSize/(imageXW*imageYW); 
    CCLOG("image=%dch raw data...", ch); 

    cv::Mat testMat = createCvMatFromRaw(srcData, imageXW, imageYW, ch); 
    testMat.convertTo(testMat, CV_32F); 

    // try to predict which number has been drawn 
    try{ 
     int predicted = svm->predict(testMat); 

     CCLOG("Recognizing following number -> %d", predicted); 

    }catch(cv::Exception ex){ 

    } 
} 

Und es gibt einen Ausgang:

imageXW=28, imageYW=28 
image=3ch raw data... 
OpenCV Error: Assertion failed (samples.cols == var_count && samples.type() == CV_32F) in predict, file /Volumes/build-storage/build/master_iOS-mac/opencv/modules/ml/src/svm.cpp, line 1930 

Es basiert auf diesem Tutorial:

https://www.simplicity.be/article/recognizing-handwritten-digits/

Besonders an dieser Methode:

// Standard library 
#include <iostream> 
#include <vector> 
#include <string> 

// OpenCV 
#include <opencv2/core.hpp> 
#include <opencv2/imgproc.hpp> 
#include <opencv2/highgui.hpp> 
#include <opencv2/ml.hpp> 

// POSIX 
#include <unistd.h> 

/** 
* main 
**/ 
int main(int argc, char** argv) 
{ 

    // 
    // Load SVM classifier 
    cv::Ptr<cv::ml::SVM> svm = cv::ml::StatModel::load<cv::ml::SVM>("classifier.yml"); 


    // read image file (grayscale) 
    cv::Mat imgMat = cv::imread("test.jpg", 0); 

    // convert 2d to 1d 
    cv::Mat testMat = imgMat.clone().reshape(1,1); 
    testMat.convertTo(testMat, CV_32F); 

    // try to predict which number has been drawn 
    try{ 
     int predicted = svm->predict(testMat); 

     std::cout << std::endl << "Recognizing following number -> " << predicted << std::endl << std::endl; 

     std::string notifyCmd = "notify-send -t 1000 Recognized: " + std::to_string(predicted); 
     system(notifyCmd.c_str()); 

    }catch(cv::Exception ex){ 

    } 

} 

Ich habe es im Terminal ausgeführt und es hat funktioniert.

Hier ist eine Implementierung von createCvMatFromRaw:

cv::Mat HelloWorld::createCvMatFromRaw(unsigned char *rawData, int rawXW, int rawYW, int ch) 
{ 
    cv::Mat cvMat(rawYW, rawXW, CV_8UC4); // 8 bits per component, 4 channels 

    for (int py=0; py<rawYW; py++) { 
     for (int px=0; px<rawXW; px++) { 
      int nBasePos = ((rawXW * py)+px) * ch; 
      cvMat.at<cv::Vec4b>(py, px) = cv::Vec4b(rawData[nBasePos + 0], 
                rawData[nBasePos + 1], 
                rawData[nBasePos + 2], 
                0xFF); 

     } 
    } 

    return cvMat; 
} 

ich hier gefunden habe:

http://blog.szmake.net/archives/845

Was bedeutet diese assert bedeuten? Kann mir das jemand erklären? Wie kann ich das beheben?

Antwort

2

Die Behauptung sagt

OpenCV Error: Assertion failed (samples.cols == var_count && samples.type() == CV_32F)

was bedeutet, dass die Probe entweder nicht die richtige Anzahl von Spalten enthält oder keinen Typ CV_32F.

Es sieht so aus, als hätten Sie die reshape Funktion vergessen, so dass Ihre Daten die erste Bedingung verletzen. Ich denke, um die svm anwenden zu können, müssen die Daten ein Vektor sein, d. H. 1 x n Matrix.

+0

cv :: Matte testMat2 = testMat.Clone() .umformen (1, 1); - Ich habe es versucht und das Ergebnis ist das gleiche. – Makalele

+0

Versuchen Sie, das Bild als graues Bild zu laden: 'imread (" test.jpg ", 0)' –

+0

Ich habe sogar versucht: cv :: cvtColor (testMat, greyMat, cv :: COLOR_BGR2GRAY); – Makalele

Verwandte Themen