C#使用opencv截取旋转矩形区域图像的实现示例

 更新时间:2021-03-08 12:46:15   作者:佚名   我要评论(0)

前言:最近在工程中需要用到截取RotatedRect中的图形,保存为Mat做后续处理。发现opencv文档中没有这个api,最开始想到的方案是将整张图片进

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

实现方法

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

在这里插入图片描述

通过

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,有

在这里插入图片描述

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

///<Summary>
///利用向量运算截取一个RotatedRect区域
///</Summary>
///<param name="img">类型为CV_U8C3的Mat</param>
///<param name="rotatedRect">RotatedRect</param>
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<topLeftR){
   topLeftIndex=i;
   topLeftR=r;
  }
 }
 double x1=points[(topLeftIndex+1)%4].X-points[topLeftIndex].X,y1=points[(topLeftIndex+1)%4].Y-points[topLeftIndex].Y;
 double x2=points[(topLeftIndex+3)%4].X-points[topLeftIndex].X,y2=points[(topLeftIndex+3)%4].Y-points[topLeftIndex].Y;
 double vX1=x1,vY1=y1,vX2=x2,vY2=y2;
 int width=(int)Math.Sqrt(vX1*vX1+vY1*vY1),height=(int)Math.Sqrt(vX2*vX2+vY2*vY2);
 Mat ret=new Mat(new Size(width,height),MatType.CV_8UC3);
 // Console.WriteLine($"width={width},height={height}");
 var indexer1=img.GetGenericIndexer<Vec3b>();
 var indexer2=ret.GetGenericIndexer<Vec3b>();
 for(int j=0;j<ret.Height;j++){
  for(int i=0;i<ret.Width;i++){
   double kx=(double)i/width,ky=(double)j/height;
   int x=(int)(points[topLeftIndex].X+kx*vX1+ky*vX2),y=(int)(points[topLeftIndex].Y+kx*vY1+ky*vY2);
   indexer2[j,i]=indexer1[y,x];
  }
 }
 return ret;
}

到此这篇关于C#使用opencv截取旋转矩形区域图像的文章就介绍到这了,更多相关C# opencv截取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • C#使用OpenCV剪切图像中的圆形和矩形的示例代码
  • C#使用OpenCV剪切图片中的人物头像的实现方法
  • 如何在C#中使用OpenCV(GOCW使用教程)
  • c# 使用OpenCV识别硬币
  • C#中OpenCVSharp实现轮廓检测
  • 在C#中使用OpenCV(使用OpenCVSharp)的实现
  • C#使用OpenCv图像批处理并改变图片大小并且重命名
  • C#调用OpenCV开发简易版美图工具【推荐】
  • C#中OpenCvSharp 通过特征点匹配图片的方法
  • 利用C#版OpenCV实现圆心求取实例代码
  • c#基于opencv,开发摄像头播放程序

相关文章

  • C#使用opencv截取旋转矩形区域图像的实现示例

    C#使用opencv截取旋转矩形区域图像的实现示例

    前言:最近在工程中需要用到截取RotatedRect中的图形,保存为Mat做后续处理。发现opencv文档中没有这个api,最开始想到的方案是将整张图片进
    2021-03-08
  • Spring Boot thymeleaf模板引擎的使用详解

    Spring Boot thymeleaf模板引擎的使用详解

    在早期开发的时候,我们完成的都是静态页面也就是html页面,随着时间轴的发展,慢慢的引入了jsp页面,当在后端服务查询到数据之后可以转发到
    2021-03-08
  • MySQL处理JSON常见函数的使用

    MySQL处理JSON常见函数的使用

    官方文档:JSON Functions Name Description JSON_APPEND() Append data to JSON docum
    2021-03-08
  • python xml模块的简单使用

    python xml模块的简单使用

    一、xml简介 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗
    2021-03-08
  • 解决python3 整数数组转bytes的效率问题

    解决python3 整数数组转bytes的效率问题

    昨天在做一道CTF题的时候碰到了一个图片异或的问题,操作大概如下: 将一个图片读入,然后每字节进行异或操作,核心代码可简化为以下: #c
    2021-03-08
  • JS异步的执行原理和回调详解

    JS异步的执行原理和回调详解

    一、JS异步的执行原理 &#8195;&#8195;我们知道JavaScript是单线程的,而浏览器是多线程的。单线程执行任务需要一个个排队进行,假如一个任
    2021-03-08
  • 在 ASP.Net Core 中使用 MiniProfiler的方法

    在 ASP.Net Core 中使用 MiniProfiler的方法

    web应用程序的性能相信是大家普遍关心的一个问题,也相信大家有很多工具可用来分析应用程序的性能并能够找到其中的瓶颈,MiniProfiler 就是这
    2021-03-08
  • python re模块和正则表达式

    python re模块和正则表达式

    一、re模块和正则表达式 先来看一个例子:https://reg.jd.com/reg/person&#63;ReturnUrl=https%3A//www.jd.com/ 这是京东的注册页面,打开页
    2021-03-08
  • 如何在ASP.Net Core使用分布式缓存的实现

    如何在ASP.Net Core使用分布式缓存的实现

    ASP.Net Core 提供了多种类型的缓存,除了内存缓存和响应缓存之外,还提供了对 分布式缓存 的支持。在之前的一篇文章中,我讨论了 ASP.Net C
    2021-03-08
  • .net core Api 部署到Linux的方法步骤

    .net core Api 部署到Linux的方法步骤

    一.环境介绍 1..net开发环境:asp.net core 3.1 2.Linux环境:CentOS Linux release 7.9.2009 (Core) 3.Swagger: Swashbuckle.AspNetCo
    2021-03-08

最新评论