c# OpenCV 图像裁剪、调整大小、旋转、透视(三)
图像裁剪、调整大小、旋转、透视图像处理基本操作。
- croppedImage 图像裁剪
- Cv2.Resize() 调整图像大小
- 图像旋转
- Cv2.Rotate()旋转
- Cv2.Flip()翻转
- Cv2.WarpAffine()任意角度旋转
- Cv2.GetAffineTransform()透视
一、图像裁剪
// 读取原始图像
Mat image = new Mat("1.png", ImreadModes.Color);
// 设置感兴趣区域的坐标和尺寸
Rect roi = new Rect(100, 100, 200, 200);//坐标 x,y 尺寸 长宽
// 裁剪图像
Mat croppedImage = new Mat(image, roi);
// 显示图片
Cv2.ImShow("image", image);
Cv2.ImShow("croppedImage", croppedImage);
二、调整图像大小
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );
参数说明
- src:输入,原图像,即待改变大小的图像;
- dst:输出,改变大小之后的图像,这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;
- dsize:输出图像的大小。如果这个参数不为0,那么就代表将原图像缩放到这个Size(width,height)指定的大小;如果这个参数为0,那么原图像缩放之后的大小就要通过下面的公式来计算:
- dsize = Size(round(fx*src.cols), round(fy*src.rows))
- 其中,fx和fy就是下面要说的两个参数,是图像width方向和height方向的缩放比例。
- fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算;
- fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算;
- interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:
- INTER_NEAREST - 最邻近插值
- INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
- INTER_AREA -区域插值 resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
- INTER_CUBIC - 4x4像素邻域内的双立方插值
- INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );Mat srcImage = new Mat("1.png", ImreadModes.Color);// 临时变量和目标图的定义Mat dstImage1 = new Mat();Mat dstImage2 = new Mat();Mat dstImage3= new Mat();Mat dstImage4 = new Mat();//进行尺寸调整操作Cv2.Resize(srcImage, dstImage1, new OpenCvSharp.Size(srcImage.Cols / 2, srcImage.Rows / 2), (double)InterpolationFlags.Linear);Cv2.Resize(srcImage, dstImage2, new OpenCvSharp.Size(srcImage.Cols / 2, srcImage.Cols / 2), (double)InterpolationFlags.Area);Cv2.Resize(srcImage, dstImage3, new OpenCvSharp.Size(srcImage.Cols * 2, srcImage.Cols * 2), (double)InterpolationFlags.Cubic);Cv2.Resize(srcImage, dstImage4, new OpenCvSharp.Size(srcImage.Cols * 2, srcImage.Cols * 2), (double)InterpolationFlags.Linear);Cv2.ImShow("dstImage1", dstImage1);Cv2.ImShow("dstImage2", dstImage2);Cv2.ImShow("dstImage3", dstImage3);Cv2.ImShow("dstImage4", dstImage4);
OpenCV图像缩放resize各种插值方式的比较
三、图片旋转
- 左旋转90° Cv2.Rotate(src, dst, RotateFlags.Rotate90CounterClockwise);
- 右旋转90° Cv2.Rotate(src, dst, RotateFlags.Rotate90Clockwise);
- 旋转180° Cv2.Rotate(src, dst, RotateFlags.Rotate180);
- 垂直翻转 Cv2.Flip(src, dst, FlipMode.Y);
- 水平翻转Cv2.Flip(src, dst, FlipMode.X);
using OpenCvSharp;
using System;class Program
{static void Main(){Mat src = new Mat("input.jpg", ImreadModes.Color);Mat dst = new Mat();Cv2.Rotate(src, dst, RotateFlags.Rotate90Clockwise);Cv2.ImShow("dst", dst);Cv2.WaitKey(0);}
}
6.任意角度旋转
Cv2.WarpAffine(
InputArray src, // 输入图像
OutputArray dst, // 输出图像
InputArray M, // 旋转矩阵
Size dsize, // 输出图像大小
int flags = INTER_LINEAR, // 像素插值方式
int borderMode = BORDER_CONSTANT, // 背景填充默认为常量
const Scalar & borderValue = Scalar() // 填充颜色默认为黑色
)
using OpenCvSharp;Mat img = new Mat("1.png", ImreadModes.Grayscale);
Point2f center = new Point2f(img.Cols / 2f, img.Rows / 2f);
//使用了Cv2.GetRotationMatrix2D()函数构建旋转矩阵,然后使用Cv2.WarpAffine()函数进行仿射变换。
Mat matrix = Cv2.GetRotationMatrix2D(center, 45, 0.6);
Cv2.WarpAffine(img, img, matrix, img.Size());
Cv2.ImShow("img", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
7.图像透视
Cv2.GetAffineTransform(srcPoints, dstPoints);
参数
src: 代表输入图像的三个点坐标, 形为:[[col_1, row_1], [col_2, row_2], [col_3, row_3]]
dst: 代表输出图像的三个点坐标, 形为:[[col_4, row_4], [col_5, row_5], [col_6, row_6]]
点1 由位置 [col_1, row_1] 移动到 [col_4, row_4]
点2 由位置 [col_2, row_2] 移动到 [col_5, row_5]
点3 由位置 [col_3, row_3] 移动到 [col_6, row_6]
由这3个点的位置变化,可以得到 变化矩阵 M
————————————————
版权声明:本文为CSDN博主「Enzo 想砸电脑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37804469/article/details/112304112
using OpenCvSharp;Mat src = new Mat("input.jpg", ImreadModes.Color);
Mat dst = new Mat();Point2f[] srcPoints = new Point2f[]
{new Point2f(0, 0),new Point2f(src.Cols, 0),new Point2f(0, src.Rows)
};Point2f[] dstPoints = new Point2f[]
{new Point2f(src.Cols * 0.0f, src.Rows * 0.33f),new Point2f(src.Cols * 0.85f, src.Rows * 0.25f),new Point2f(src.Cols * 0.15f, src.Rows * 0.7f)
};Mat affineMatrix = Cv2.GetAffineTransform(srcPoints, dstPoints);
Cv2.WarpAffine(src, dst, affineMatrix, src.Size());Cv2.ImShow("src", src);
Cv2.ImShow("dst", dst);
Cv2.WaitKey();
c# OpenCV 图像裁剪、调整大小、旋转、透视(三)
c#OpenCV 读取、显示和写入图像(二)
c# OpenCV安装(一)
相关文章:
c# OpenCV 图像裁剪、调整大小、旋转、透视(三)
图像裁剪、调整大小、旋转、透视图像处理基本操作。 croppedImage 图像裁剪Cv2.Resize() 调整图像大小图像旋转 Cv2.Rotate()旋转Cv2.Flip()翻转Cv2.WarpAffine()任意角度旋转Cv2.GetAffineTransform()透视 一、图像裁剪 // 读取原始图像 Mat image new Mat("1.png&q…...
Kafka相关知识
一、kafka架构 Kafka基础知识 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协 调的分布式日志系统(也可以当做MQ系统),常见可以用于webynginx日志、访问日志,消息服务等等&…...
gitlab 通过svn hook 触发
jenkins 起一个item 配置: 我选的自由风格的 源码管理配置 先选subversion 就是svn类型 url 设置project 的路径, 注意是工程,不是svn 顶层 添加一个账户来进行pull 等操作 选择添加的账号 构建触发器: ,重要的是要自…...
设计模式详解---单例模式
1. 设计模式详解 单例模式是一种创建对象的设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。 在单例模式中,类负责创建自己的唯一实例,并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有…...
毕设之-Hlang后端架构-双系统交互
文章目录 前言交互流程基本流程约定公钥人人中台携带公钥获取私钥私钥生成人人中台携带私钥访问私钥验证(博客系统) 调试演示总结 前言 前天我们完成了基本的整合,但是还没有整合到我们的业务系统,也就是博客系统。本来昨天要搞一…...
什么同源策略?
同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能,非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的,但是请求返回…...
破译模式:模式识别在计算机视觉中的作用
一、介绍 在当代数字领域,计算机视觉中的模式识别是关键的基石,推动着众多技术进步和应用。本文探讨了计算机视觉中模式识别的本质、方法、应用、挑战和未来趋势。通过使机器能够识别和解释视觉数据中的模式,模式识别不仅推动了计算机视觉领域…...
c语言-全局变量与局部变量
目录 1、(作用)域的概念 2、全局与局部的相对性 3、生命周期 3、静态变量static 结语: 前言: 在c语言中,全局变量的可见范围是整个工程,而局部变量的可见范围从该变量被定义到该作用域结束,…...
【Spring】00 入门指南
文章目录 1.简介2.概念1)控制反转(IoC)2)依赖注入(DI) 3.核心模块1)Spring Core2)Spring AOP3)Spring MVC4)Spring Data5)Spring Boot 4.编写 Hel…...
BIM 技术:CIM (City Information Modeling) 1-7 级
本心、输入输出、结果 文章目录 BIM 技术:CIM (City Information Modeling) 1-7 级前言城市信息模型(CIM)概述城市信息模型分级介绍CIM 1CIM 2CIM 3CIM 4CIM 5CIM 6CIM 7 花有重开日,人无再少年实践是检验真…...
c++ websocket 协议分析与实现
前言 网上有很多第三方库,nopoll,uwebsockets,libwebsockets,都喜欢回调或太复杂,个人只需要在后端用,所以手动写个; 1:环境 ubuntu18 g(支持c11即可) 第三方库:jsoncpp,openssl 2:安装 jsoncpp 读取json 配置文件 用 自动安装 网…...
kali虚拟机无网络
1.查看虚拟机的网卡模式 在虚拟机设置里,一般选择桥接模式,也可以选择NAT模式。 2、你的IP地址是否写死了(设置为静态IP) vim编辑模式下的命令: 按a或i进入编辑模式,然后按esc键退出编辑模式,s…...
Unity2023.3(Unity6)版本开始将可以发布WebGPU
翻译一段官网上的话: 利用Unity 2023.3(正式发布时应该称为Unity6)中最新的WebGPU图形API集成,尝试最大限度的提升您的网络游戏的真实感。 通过与谷歌的战略合作,Unity实时3D平台的强大的图形功能现在为图形丰富的网络游戏进行微调࿰…...
计算机网络期末考试A卷及答案
一、选择题(30分,每题1分) 世界上第一个网络系统是( C )。 A、ENIAC B、以太网 C、ARPANET D、DECNET 2.在常用的传输介质中,( C )的带宽最宽、信号传输衰减最小、抗干扰能力最强。 A.双绞线 …...
<蓝桥杯软件赛>零基础备赛20周--第10周--二分
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…...
C++友元类,工厂模式和继承的融合案例
//友元没有继承性,没有传递性,所以在animal中定义友元类是无效的class animal{public:animal(){};virtual ~animal(){};};class Cat:public animal{friend class animalFactory;private:Cat(){}private:string m_name;string m_color;public:void about(){cout<&…...
使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值
使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值 JavaScript 中的 ?? 运算符称为 nullish 合并运算符。该运算符接受任一侧的操作数,并且仅当左侧操作数为空值时才返回右侧操作数。这个运算符绝对是一个较新的运算符,它是在 ES2020 …...
Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
问题描述:Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7 最近在学习如何将YOLO部署在手机端,出现了许多错误,下面这个错误是手机和电脑连结之后,点击run之后出现的错误。 解决办法:将JDK版本将为…...
Python Django Suit:构建现代化的Django后台管理
概要 Django Suit是一款为Django后台管理提供现代、优雅界面的第三方应用,它致力于提升Django开发者的管理体验。本文将深入介绍Django Suit的安装、配置和高级功能,提供详实的示例代码,帮助大家更好地使用和定制Django后台管理界面。 安装与…...
电子学会C/C++编程等级考试2021年09月(六级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
