OpenCV Error: Assertion failed

Bonjour mes amis,

En fait, je suis encours de travailler sur l'extraction de caractéristique d'une base de données des images suivant ce code source:
#include "stdafx.h"
#include <sstream>
#include <time.h>
#include <fstream>
#include <iostream>
#include <highgui.h>
#include <cv.h>
#include <iomanip>
#include <opencv2/ml/ml.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core/mat.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/legacy/compat.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\nonfree\features2d.hpp>

using namespace std;
using namespace cv;

void save_descriptor_in_file(Mat desc)
{
//faire tourner ce programme la première fois avec « data_nosmile.txt » et la seconde avec « data_smile.txt »
ofstream myfile ("C:/Users/bahri/Desktop/haythem/SVM/features extraction/test_OpenCV_2.4.2/data_nosmile.txt",ios::app);
//ofstream myfile ("C:/Users/bahri/Desktop/haythem/SVM/features extraction/test_OpenCV_2.4.2/data_smile.txt",ios::app);
if (myfile.is_open())
{
//for(int i=0 ; i<desc.rows ; i++)
for(int i=0 ; i<10 ; i++) // on limite le nombre de descripteurs par image à 10
{
for(int j=0; j<desc.cols ; j++)//desc.cols est ici toujours égale à 128
{
myfile<<desc.at<float>(i,j)<<"\n";

}
}
}
else
{
cout<<"error : Unable to open file";
}
}

void display_image_descriptors(Mat image){
namedWindow("Descriptors", 1);
imshow("Descriptors", image);
}

void calculate_descriptor(Mat img_cropped){
SurfFeatureDetector detector(1500);
vector<KeyPoint> keypoints;
Mat descriptors;
SurfDescriptorExtractor extractor;
detector.detect(img_cropped, keypoints);
extractor.compute(img_cropped, keypoints, descriptors);
drawKeypoints(img_cropped, keypoints, img_cropped, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
//display_image_descriptors(img_cropped); ////optionnel////
Mat desc = Mat(descriptors).reshape(0, keypoints.size());
save_descriptor_in_file(desc);
}

void display_image(IplImage* image){
cvNamedWindow("Image", 1 );
cvShowImage( "Image", image);
}

void load_image(int i){
ostringstream ostr;
//faire tourner ce programme la première fois avec "-11.jpg" et la seconde avec "-12.jpg"
ostr << "C:/Users/bahri/Desktop/haythem/SVM/ensemble d'entrainement/les deux ensembles/"<<i<<"-11.jpg";
//ostr << "C:/Users/bahri/Desktop/haythem/SVM/ensemble d'entrainement/les deux ensembles/"<<i<< "-12.jpg";
string s = ostr.str();
char* chemin = &s[0];
Mat img_original=cvLoadImage(chemin);
Mat img_cropped = img_original(Rect(240, 140, 180, 220));
Ptr<IplImage> img = &img_cropped.operator IplImage();
if(img !=NULL){
// display_image(img);////optionnel////
calculate_descriptor(img_cropped);
}
else{
cout<<"error: can’t open image "<<i;
}
}

int main(){

//décommentez pour voir les images une à une après appui sur la touche ‘espace’
// int key=0;
// int i=1;
// do{
for(int i=1; i<=180; i++){
load_image(i);
// cout<<i<<"\n";
// key = cvWaitKey();
}
// i++;
// }while(key==32);//si appui sur la touche ‘espace’
return 0;
}

mais lorsque je débogue ce code avec une version d'OpenCV 2.4.6 il me donne cette erreur
OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[
1]*channels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) - 1))*4) & 15) == elemSize1()) in unknown function, file c
:\opencv 2.6.0\build\include\opencv2\core\mat.hpp, line 537
Qui peut m'aider svp à corriger cette erreur.
Merci
l'assertion de OPENCV est un booleen donc il verifie dans ce cas-ci dims && data && i0

il faudrait que tu mettes un espion sur ces variables (je ne sais pas si tu utilise Visual Studio ou non par contre ), mais commence par mettre en commentaire certaines lignes dans la methode load_image . Aussi voit si tu peux enlever le - du nom du jpg . Mais ce genre d'assertion c'est un byte qu'il a trouvé dans le fichier qu'il n'aime pas. Il se peut que le fichier ne soit pas compatible avec ce que OpenCV recherche . Il peut s'agir d'un different type de format. Voir DXT3 , etc. -> compressed texture formats.

For those who speaks english , I said :

It cannot load the image , because it did not like a byte it read . That could means that the compressed texture format is perhaps incompatible , see DXT1 , DXT3 , DXT5 . Note also that OpenCV is obsolete .That means that there is no more supports AFAIK but I am not sure...
Last edited on
compile with debug symbols, provide a backtrace.

1
2
3
4
5
6
		//for(int i=0 ; i<desc.rows ; i++)
		for(int i=0 ; i<10 ; i++) // on limite le nombre de descripteurs par image à 10
		{ 
			for(int j=0; j<desc.cols ; j++)//desc.cols est ici toujours égale à 128
			{ 
				myfile<<desc.at<float>(i,j)<<"\n";
¿do you have at least 10 rows?


> C:/Users/bahri/Desktop/haythem/SVM/features extraction/test_OpenCV_2.4.2/data_nosmile.txt
> C:/Users/bahri/Desktop/haythem/SVM/ensemble d'entrainement/les deux ensembles/"<<i<<"-11.jpg
¿where do I get those files?


> Note also that OpenCV is obsolete
¡¿what?!
@ne555
I was referring to the first OpenCV , sorry about that.
"OpenCV is obsolete". What libraries should i use in image processing research on C++ language.
SimpleCV , would be my answer. But we can debate on that.
Bonjour,

j'ai résolu l'erreur. En fait, il faut tout d'abord laisser la première boucle limité par desc.rows et par la suite supprimer la ligne suivante:Ptr<IplImage> img = &img_cropped.operator IplImage();
et faire ce modification:display_image(img_cropped);
Tres bien si ca fonctionne ainsi . :)
Topic archived. No new replies allowed.