You can try finding the orientation of both the images using moments. Using the two orientation you can find the angle by taking the difference between them .

```
cv::Point3d findOrientation(const cv::Mat& src){
cv::Moments m = cv::moments(src, true);
double cen_x=m.m10/m.m00;
double cen_y=m.m01/m.m00;
double m_11= 2*m.m11-m.m00*(cen_x*cen_x+cen_y*cen_y);// m.mu11/m.m00;
double m_02=m.m02-m.m00*cen_y*cen_y;// m.mu02/m.m00;
double m_20=m.m20-m.m00*cen_x*cen_x;//m.mu20/m.m00;
double theta = m_20==m_02?0:atan2(m_11, m_20-m_02)/2.0;
// theta = (theta / PI) * 180.0; //if you want in radians.(or vice versa, not sure)
return cv::Point3d(cen_x,cen_y,theta);
```

}

I am returning the following: (x,y)(center of mass) and theta (orientation)

http://answers.opencv.org/question/74...

In addition to the previous answers, a fast method to determine the object rotation would be to compute the histogram of gradients on the image and compute the correlation.

The angle between the images is the phase between the gradients.

Thank You, can you please explain.

Create a 360 element vector (the gradient histogram, one element per °) for each image (H1 and H2). Calculate the gradient vector (Gx and Gy) in every pixel of the first image. Then get the angle A=fastAtan2(Gy,Gx) of the gradient. Increment the corresponding element (H1[A]++). This gives the gradient histogram. Repeat for the second image. Then calculate the correlation between the histograms: C(t)=sum(H1[x] H2[x+t]). The maximal value of C(t) will give you the angle difference t between the images.