C#如何实现opencv截取旋转矩形区域图像-创新互联

本篇内容主要讲解“C#如何实现opencv截取旋转矩形区域图像”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现opencv截取旋转矩形区域图像”吧!

创新互联公司秉承实现全网价值营销的理念,以专业定制企业官网,做网站、成都网站制作小程序设计,网页设计制作,手机网站制作全网营销推广帮助传统企业实现“互联网+”转型升级专业定制企业官网,公司注重人才、技术和管理,汇聚了一批优秀的互联网技术人才,对客户都以感恩的心态奉献自己的专业和所长。

前言:最近在工程中需要用到截取RotatedRect中的图形,保存为Mat做后续处理。发现opencv文档中没有这个api,最开始想到的方案是将整张图片进行相应的旋转,然后再从中截取正矩形,但是我们要获取的是部分区域,将整张图片进行旋转会造成很多的资源浪费。所以需要自行实现一个旋转矩形的方案。

实现方法

原理是利用向量空间变换,如图


C#如何实现opencv截取旋转矩形区域图像


通过

Point2f[] points=rotatedRect.Points();

可获取RotatedRect四个端点的坐标。先选定一个点为输出Mat左上端点,这里采取的是离原图左上角最近的端点(即x2+y2最小)。然后再选取相邻的2个端点,作向量Vx及Vy。这里可以根据需求来选定Vx和Vy的方向,比如要求输出Mat的Width大于Height,那就选定长的一边为Vx。这里直接选定左上端点到顺时针方向的端点的向量为Vx,即如图所示。


在选定好Vx和Vy后,进行向量空间的变换。设在输出的Mat中任一一个坐标点(i,j),对应在输出Mat中的任一坐标点(x,y)。设左上端点坐标(x0,y0) (即图中点2),


满足:


设目标RotatedRect长宽为width height,有


C#如何实现opencv截取旋转矩形区域图像

然后做一个二重循环,将j从0循环到height,i从0循环到width,就可以得到输出Mat所有像素的信息。
下面为一个截取BGR类型的Mat的RotatedRect的代码

///
///利用向量运算截取一个RotatedRect区域
///
///类型为CV_U8C3的Mat
///RotatedRect
public static Mat sliceRotetedImg8UC3(Mat img,RotatedRect rotatedRect){
 // Rect bounding=rotatedRect.BoundingRect();
 Point2f[] points=rotatedRect.Points();
 int topLeftIndex=0;
 double topLeftR=points[0].X*points[0].X+points[0].Y*points[0].Y;
 for(int i=1;i<4;i++){
  double r=points[i].X*points[i].X+points[i].Y*points[i].Y;
  if(r();
 var indexer2=ret.GetGenericIndexer();
 for(int j=0;j

到此,相信大家对“C#如何实现opencv截取旋转矩形区域图像”有了更深的了解,不妨来实际操作一番吧!这里是创新互联建站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


网站栏目:C#如何实现opencv截取旋转矩形区域图像-创新互联
分享链接:http://ybzwz.com/article/dpopog.html