想要利用Emgu CV 实现图片任意角度的旋转,在网上搜了一下,找到了 一段代码(来自博客园):
public static Image<Bgr, Byte> RotateImage(Image<Bgr, Byte> image_old, double angle, bool clockwise)
{
IntPtr image_temp;
double anglerad = Math.PI * (angle / 180);
int newwidth = (int)Math.Abs(image_old.Bitmap.Height * Math.Sin(anglerad)) +
(int)Math.Abs(image_old.Bitmap.Width * Math.Cos(anglerad)) + 1;
int newheight = (int)Math.Abs(image_old.Bitmap.Height * Math.Cos(anglerad)) +
(int)Math.Abs(image_old.Bitmap.Width * Math.Sin(anglerad)) + 1;
image_temp = CvInvoke.cvCreateImage(new Size(newwidth, newheight), IPL_DEPTH.IPL_DEPTH_8U, 3);
CvInvoke.cvZero(image_temp);
int flag = -1;
if (clockwise)
{
flag = 1;
}
float[] m = new float[6];
int w = image_old.Bitmap.Width;
int h = image_old.Bitmap.Height;
m[0] = (float)Math.Cos(flag * angle * Math.PI / 180);
m[1] = (float)Math.Sin(flag * angle * Math.PI / 180);
m[3] = -m[1];
m[4] = m[0];
m[2] = w * 0.5f;
m[5] = h * 0.5f;
unsafe
{
void* p;
IntPtr ptr;
fixed (float* pc = m)
{
p = (void*)pc;
ptr = new IntPtr(p);
}
IntPtr M = CvInvoke.cvMat(2, 3, MAT_DEPTH.CV_32F, ptr);
CvInvoke.cvGetQuadrangleSubPix(image_old.Ptr,image_temp,M);
}
return OpenCVEmguCVDotNet.IplImagePointerToEmgucvImage<Bgr, Byte>(image_temp);
}
为什么我在 CvInvoke中没有找到cvMat方法?
OpenCVEmguCVDotNet又是个什么类啊?求解答。
------解决思路----------------------
你看的那篇博客文章后面就有OpenCVEmguCVDotNet自己的定义
http://www.haodaima.net/art/2441777
CvInvoke.cvMat确实没有定义,怀疑作者写错了,或者旧版本有这个定义。在最新版本中cvMat是个structure
怀疑是这个:
CvMat M = cvMat(2, 3, CV_32F, m);
cvGetQuadrangleSubPix(temp, img_rotate, &M);
见
http://blog.sina.com.cn/s/blog_7155fb1a0102uwpr.html