当前位置: 代码迷 >> C# >> 关于Emgu CV 图像旋转的有关问题
  详细解决方案

关于Emgu CV 图像旋转的有关问题

热度:63   发布时间:2016-05-05 04:39:38.0
关于Emgu CV 图像旋转的问题
想要利用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