2012-11-19 3 views
1

j'ai une classe de Student et une classe d'imagehandler (qui, comme le gestionnaire d'image opencv)ROI assertion a échoué (C++ et opencv)

objet de l'élève a un champ:

imagehandler img; 

et dans la classe imagehandler il y a une fonction pour copier l'image d'une image à l'autre dans un certain endroit.

void imagehandler::copy_paste_image(imagehandler& dst, int xLoc, int yLoc){ 
cv::Rect roi(xLoc, yLoc, m_image.size().width, m_image.size().height); 
cv::Mat imageROI (dst.m_image, roi); 
m_image.copyTo(imageROI); 
} 

et la classe imagehandler a un objet Mat m_image:

private: 
cv::Mat m_image; 

Maintenant, dans l'ensemble, j'ai déclaré une nouvelle image par le constructeur spécifié imagehandler.

le constructeur que j'utilise pour rendre l'image:

imagehandler::imagehandler(int width, int height) 
: m_image(width, height, CV_8UC3){ 


} 

dans la principale, je déclare l'image comme ceci:

imagehandler CSImg((4*300), (320 * ceil((float)(numOfCSStudents/4)))); 

Faites-moi confiance sur celui-ci: CSImg est beaucoup plus grand que tous les des images que je veux y entrer.

Maintenant, je veux copier l'image d'un certain étudiant et l'entrer dans CS Img. C'est ce que je fais:

studentsVector.at(i)->getImg().copy_paste_image(CSImg, CSWidthCount*300, CSHeightCount*320); 

Et je reçois cette erreur:

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in Mat, file /build/buildd/opencv-2.3.1/modules/core/src/matrix.cpp, line 303 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /build/buildd/opencv-2.3.1/modules/core/src/matrix.cpp:303: error: (-215) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function Mat 

J'ai remarqué que cela se produit dans roi, je n'ai aucune idée pourquoi. Je suis un débutant total à openCV et je le fais pour les devoirs.

Merci. Si vous avez besoin de plus d'informations s'il vous plaît demander.

+0

Ceci est indicatif d'une erreur math/nombre où vous dépassez les limites de tableau de quelque chose. vérifiez que votre retour sur investissement est plus petit que votre image, que votre copie reste dans toutes les limites de l'image, etc –

+0

ils le font ... toutes les tailles sont correctes. – TheNotMe

+0

quelle est la valeur de numOfCSStudents au moment de l'erreur? NumOfCSStudents est un nombre entier? –

Répondre

0

Je ne suis pas sûr de l'API C++ mais c'est ce que j'ai fait dans l'API C;

CvRect ROI = cvRect(x, y, width, height); 
cvSetImageROI(srcImg, ROI); 
IplImage* cropImg = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_8U, 1);//this part very important 
cvCopy(srcImg, cropImg); 
cvResetImageROI(srcImg); 
Questions connexes