想做一个关于emgucv自动倾斜校正的时候出现了一个问题程序

gsq_gsq_gsq 2018-04-16 03:07:30
参考了这位大神的博客:
http://www.cnblogs.com/skyfsm/p/6902524.html#3945065
这是他的思路:

1图片灰度化
2阈值二值化
3检测轮廓
4寻找轮廓的包围矩阵,并且获取角度
5根据角度进行旋转矫正
6对旋转后的图像进行轮廓提取
7对轮廓内的图像区域抠出来,成为一张独立图像

PointF center=new PointF();

center = rect.center;//矩形中心点

Matrix<double> mymat = new Matrix<double>(2, 3);//2X3矩阵

IntPtr M2 = CvInvoke.cv2DRotationMatrix(center, angle,1,mymat);//计算旋转加缩放的变换矩阵
//这之后应该就有问题了
IntPtr inputimg = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(imagesource), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F, 3);
MIplImage inputimg1 = (MIplImage)Marshal.PtrToStructure(inputimg, typeof(MIplImage));
Image<Bgr, Byte> inputimage = new Image<Bgr, Byte>(inputimg1.width, inputimg1.height, inputimg1.widthStep, inputimg1.imageData);
IntPtr dstimg = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(threshold_ptr), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F, 3);
MIplImage dstimage1 = (MIplImage)Marshal.PtrToStructure(dstimg, typeof(MIplImage));
Image<Bgr, Byte> dstimage = new Image<Bgr, Byte>(dstimage1.width, dstimage1.height, dstimage1.widthStep, dstimage1.imageData);
//Image<Bgr, byte> dst = imagesource.CopyBlank();

CvInvoke.cvWarpPerspective(inputimage,dstimage, mymat,1, new MCvScalar(0));//这一步报了错

(M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 3 && M0.cols == 3
我在里面看的错误信息是上面这个
...全文
731 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-04-17
  • 打赏
  • 举报
回复
M0.rows == 3 && M0.cols == 3 显然是在判定矩阵行列是否相等,你是 2x3的矩阵,自然过不了关的
gsq_gsq_gsq 2018-04-16
  • 打赏
  • 举报
回复
(M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 3 && M0.cols == 3 这是我在跟踪时看到的错误 我在这一步的时候是2x3的矩阵 IntPtr M2 = CvInvoke.cv2DRotationMatrix(center, angle,1,mymat);//计算旋转加缩放的变换矩阵 但是之前用仿射变换的时候是3x3的矩阵就没问题。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧