2017-04-25 2 views
0

J'essaye d'écrire une rotation d'image, mais j'ai un problème en ce moment. Ceci est mon code:L'assertion OpenCv a échoué à propos de ROI rectale

Mat rotateMagnify (Mat& img, int degree){ 
double angle = degree * CV_PI/180.; 
double a = sin(angle), b = cos(angle); 

int width = img.cols, height = img.rows; 

int width_rotate = int(height * fabs(b) - width * fabs(a) + width); 
int height_rotate = int(width * fabs(a) + height * fabs(b) + height); 

Mat img_rotate; 
img_rotate.create((width_rotate, height_rotate), img.depth(), img.channels()); 


int tempLength = sqrt((double)width * width + (double)height *height) + 10; 
int tempX = (tempLength + 1)/2 - width/2; 
int tempY = (tempLength + 1)/2 - height/2; 


Mat temp; 
temp.create((tempLength, tempLength), img.depth(), img.channels()); 
//cvZero(&img_rotate); 

Mat roiImage = temp(Rect(Point(tempX, tempY), Point(width, height))); 

//roiImage.ResetImageROI(roiImage); 

img.copyTo(roiImage); 

float m[6]; 
int w = roiImage.cols; 
int h = roiImage.rows; 
m[0] = b; 
m[1] = a; 
m[3] = -m[1]; 
m[4] = m[0]; 

m[2] = w * 0.5f; 
m[5] = h * 0.5f; 
CvMat M = cvMat(2, 3, CV_32F, m); 

cvGetQuadrangleSubPix(&roiImage, &img_rotate, &M); 
roiImage.release(); 

return img_rotate;} 

Malheureusement, ce code ne fonctionne pas. Je reçois erreur comme ceci:

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 cv::Mat::Mat, file C:\builds\master_PackSlave-win32-vc12- 
shared\opencv\modules\core\src\matrix.cpp, line 495 

Comment puis-je corriger cette erreur. Merci à tous pour votre aide!

+0

Essayez d'interchanger les paramètres 'width' et' height' .... et faites-en l'essai –

+0

Désolé Toujours le même problème –

+0

Quelle ligne lance l'erreur exactement? –

Répondre

1

Cette erreur est généralement renvoyée lorsque vous essayez de copier (recadrer) une partie d'une image mais que la valeur x, y que vous spécifiez est soit -ve soit sa taille supérieure à la taille de l'image réelle. Ajoutez le point d'arrêt et vérifiez les valeurs de int tempX = (tempLength + 1)/2 - width/2; int tempY = (tempLength + 1)/2 - height/2; essayez de gérer les conditions mentionnées ci-dessus avant d'essayer

Mat roiImage = temp (Rect (Point (tempX, tempY), Point (largeur, hauteur)));

//roiImage.ResetImageROI(roiImage);

img.copyTo (roiImage);