Hi
i rotate images with below code which i find on Stackoverflow website
int theta = 10*(counter);
counter++ ;
Mat src,frame, frameRotated;
src = img_1c;
int diagonal = (int)sqrt((double) (src.cols*src.cols+src.rows*src.rows));
int newWidth = diagonal;
int newHeight =diagonal;
int offsetX = (newWidth - src.cols) / 2;
int offsetY = (newHeight - src.rows) / 2;
Mat targetMat(newWidth, newHeight, src.type());
Point2f src_center(targetMat.cols/2.0F, targetMat.rows/2.0F);
src.copyTo(frame);
double radians = theta * M_PI / 180.0;
double sin = abs(std::sin(radians));
double cos = abs(std::cos(radians));
frame.copyTo(targetMat.rowRange(offsetY, offsetY + frame.rows).colRange(offsetX, offsetX + frame.cols));
Mat rot_mat = getRotationMatrix2D(src_center, theta, 1.0);
warpAffine(targetMat, frameRotated, rot_mat, targetMat.size());
Rect bound_Rect(frame.cols,frame.rows,0,0);
int x1 = offsetX;
int x2 = offsetX+frame.cols;
int x3 = offsetX;
int x4 = offsetX+frame.cols;
int y1 = offsetY;
int y2 = offsetY;
int y3 = offsetY+frame.rows;
int y4 = offsetY+frame.rows;
Mat co_Ordinate = (Mat_<double>(3,4) << x1, x2, x3, x4,
y1, y2, y3, y4,
1, 1, 1, 1 );
Mat RotCo_Ordinate = rot_mat * co_Ordinate;
for(int i=0;i<4;i++){
if(RotCo_Ordinate.at<double>(0,i)<bound_Rect.x)
bound_Rect.x=(int)RotCo_Ordinate.at<double>(0,i); //access smallest
if(RotCo_Ordinate.at<double>(1,i)<bound_Rect.y)
bound_Rect.y=RotCo_Ordinate.at<double>(1,i); //access smallest y
}
for(int i=0;i<4;i++){
if(RotCo_Ordinate.at<double>(0,i)>bound_Rect.width)
bound_Rect.width=(int)RotCo_Ordinate.at<double>(0,i); //access largest x
if(RotCo_Ordinate.at<double>(1,i)>bound_Rect.height)
bound_Rect.height=RotCo_Ordinate.at<double>(1,i); //access largest y
}
bound_Rect.width=bound_Rect.width-bound_Rect.x;
bound_Rect.height=bound_Rect.height-bound_Rect.y;
Mat cropedResult;
Mat ROI = frameRotated(bound_Rect);
ROI.copyTo(cropedResult);
and compute homography with below code which i have written:
int im1rows = img_1.rows;
int im1cols = img_1.cols;
cv::Size s1 = img_1.size();
im1rows = s1.height;
im1cols = s1.width;
float centerX1 ;
float centerY1 ;
int im2rows = img_2.rows;
int im2cols = img_2.cols;
cv::Size s2 = img_2.size();
im2rows = s2.height;
im2cols = s2.width ;
float centerX2;
float centerY2;
if(theta==90)
{
centerX1=0 ;
centerX2=im2rows;
centerY1=0;
centerY1=im2cols;
}
else if(theta==270)
{
centerX1=0 ;
centerY1=0;
centerX2=im2rows;
centerY2=im2cols;
}
else
{
centerX1 = im1cols/2.0f;
centerY1 = im1rows/2.0f;
centerX2 = im2cols/2.0f;
centerY2 = im2rows/2.0f;
}
h12.create(3, 3, CV_32FC1);
(h12.row(0)).col(0)= cos ;
(h12.row(0)).col(1)=-sin ;
(h12.row(0)).col(2)=centerX2-centerX1 ;
(h12.row(1)).col(0)=sin ;
(h12.row(1)).col(1)=cos ;
(h12.row(1)).col(2)=centerY2-centerY1;
(h12.row(2)).col(0)=0;
(h12.row(2)).col(1)=0;
(h12.row(2)).col(2)=1;
you can see that i made condition for 90 and 270 degrees since correspondence point was 0 when i evaluated rotated images with reference image with :
cv::evaluateFeatureDetector(img_1c, img_2c, h12, &key_points_1, &key_points_2, repeatability, corrCounter);
it's also happennig for 80 110 280 and 260 degrees .
i don't know if i compute homographies incorrectly or the rotation procedure have some errors.
is there a way that i can compute homographies accurate ? (have test findhomography method but some times when there is not any good match it trow exception)
is there better way to rotate images without crop in opencv?
some of my results:(second column is Repeatability value)
degree10 0.1104114
degree20 0.09968708
degree30 0.1020521
degree40 0.07826748
degree50 0.08456376
degree60 0.05833333
degree70 0.08666667
degree80 -1
degree90 -1 // before i make 90 degree condition
degree100 -1
degree110 0.08450704
degree120 0.04072398
degree130 0.09033614
degree140 0.06682868
Regards