I'm developping an application on Qt with OpenCV and I have the following error that I did not have previously and I have the following message:
OpenCV Error: Bad argument (Input samples must be floating-point matrix (x)) in find_nearest, file C:\Users\Pierre\Downloads\opencv\sources\modules\ml\src\knearest.cpp, line 370 terminate called after throwing an instance of 'cv::Exception' what(): C:\Users\Pierre\Downloads\opencv\sources\modules\ml\src\knearest.cpp:370: error: (-5) Input samples must be floating-point matrix (x) in function find_nearest
and also a runtime error such as in Runtime error for QT application? Could you please help me because I'm quite new at Qt? Thanks!
Here is a piece of code:
void MainWindow::on_pushButton_6_clicked()
{
QList<QLabel*> resLab;
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "C:/Users/Pierre/Downloads/test1/image.orig", tr("ImageFiles (*.png *.jpeg *.jpg *.bmp)"));
QPixmap image(fileName);
ui->label->setPixmap(image.scaled(130, 130, Qt::IgnoreAspectRatio, Qt::FastTransformation));
Mat image1=QPixmapToCvMat(image,false);
// un vecteur avec des qlabels pour afficher les images similaires
/*
resLab << new QLabel(ui->scrollAreaWidgetContents); pour ajouter un qlabel au vecteur
resLab.at(i)->setGeometry(330 + (i - round(i / 5) * 5)*(20 + 250), 10 + round(i / 5)*(250 + 10), 250,
250); pour indiquer la position et les dimensions
resLab.at(i)->setVisible(true); pour le rendre visible
resLab.at(i)->setStyleSheet("QLabel { background-color : rgba(85, 85, 127, 100); }"); pour modifier
le style
*/
const int nbrDeVoisins = 20;
cv::KNearest *knnSurf, *knnSift, *knnHist, *knnHu;
// nos objets kNN qui seront utilisés pour la recherche (Dans OpenCV, la classe cv::KNearest offre une implémentation d’une recherche par similitude basé sur la méthode KNN : les k plus proches voisins)
Mat featuresSift, featuresSurf, featuresHist, featuresHu;// les caractéristiques
QStringList listSift, listSurf, listHu, listHist;// les listes avec les noms des images
const QString dirBdd = "C:/Users/Pierre/Downloads/test1/image.orig";
cv::FileStorage fs1("surf.yml", FileStorage::READ);// chargement des caractéristiques à partir du yml
fs1["Features"] >> featuresSurf;
QStringList list;// chargement d’un fichier text
QFile fichierTxt("surf.txt");
fichierTxt.open(QIODevice::ReadOnly);
while (!fichierTxt.atEnd()) {
QString uneLigne = fichierTxt.readLine();
if (uneLigne.endsWith("\n")) uneLigne.truncate(uneLigne.length() - 1);
list.append(uneLigne);
}
cv::Mat trainingClasses(featuresSurf.rows, 1, CV_32FC1); // les voisins retournés par kNN
for (int i = 0; i<featuresSurf.rows; i++) {// correspondent aux id donnés par cette matrice
trainingClasses.at<float>(i, 0) = i;
}
// initialisation de notre objet kNN
knnSurf = new cv::KNearest(featuresSurf, trainingClasses, cv::Mat(), false, nbrDeVoisins);
Mat features = surf(image1); //.reshape(1, 30 * 128).t();
cv::Mat distances, voisins, resultats;
// distances: la matrice donne la distance entre chaque voisin et la requête
// voisins: la matrice avec les IDs des voisins
// resultats: cette matrice ne sera pas utilisée dans ce TP, elle est utilisée pour faire de la classification ou de la régression
knnSurf->find_nearest(features, nbrDeVoisins, resultats, voisins, distances);
cout<<"here";
// trouver les voisins les plus proches
for (int k=0; k<nbrDeVoisins; k++) {
cout << voisins.at<float>(0, k) << endl;
}
}
It doesn't print "here" (but prints it if I put it just above)