当前位置: 首页 > news >正文

c# OpenCV 图像裁剪、调整大小、旋转、透视(三)

图像裁剪、调整大小、旋转、透视图像处理基本操作。

  1. croppedImage 图像裁剪
  2. Cv2.Resize() 调整图像大小
  3. 图像旋转
  • 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各种插值方式的比较

三、图片旋转

  1. 左旋转90° Cv2.Rotate(src, dst, RotateFlags.Rotate90CounterClockwise);
  2. 右旋转90° Cv2.Rotate(src, dst, RotateFlags.Rotate90Clockwise);
  3. 旋转180° Cv2.Rotate(src, dst, RotateFlags.Rotate180);
  4. 垂直翻转 Cv2.Flip(src, dst, FlipMode.Y);
  5. 水平翻转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语言中,全局变量的可见范围是整个工程,而局部变量的可见范围从该变量被定义到该作用域结束&#xff0c…...

【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平台的强大的图形功能现在为图形丰富的网络游戏进行微调&#xff0…...

计算机网络期末考试A卷及答案

一、选择题(30分,每题1分) 世界上第一个网络系统是( C )。 A、ENIAC B、以太网 C、ARPANET D、DECNET 2.在常用的传输介质中,( C )的带宽最宽、信号传输衰减最小、抗干扰能力最强。 A.双绞线 …...

<蓝桥杯软件赛>零基础备赛20周--第10周--二分

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…...

C++友元类,工厂模式和继承的融合案例

//友元没有继承性&#xff0c;没有传递性,所以在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 合并运算符。该运算符接受任一侧的操作数&#xff0c;并且仅当左侧操作数为空值时才返回右侧操作数。这个运算符绝对是一个较新的运算符&#xff0c;它是在 ES2020 …...

Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7

问题描述&#xff1a;Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7 最近在学习如何将YOLO部署在手机端&#xff0c;出现了许多错误&#xff0c;下面这个错误是手机和电脑连结之后&#xff0c;点击run之后出现的错误。 解决办法&#xff1a;将JDK版本将为…...

Python Django Suit:构建现代化的Django后台管理

概要 Django Suit是一款为Django后台管理提供现代、优雅界面的第三方应用&#xff0c;它致力于提升Django开发者的管理体验。本文将深入介绍Django Suit的安装、配置和高级功能&#xff0c;提供详实的示例代码&#xff0c;帮助大家更好地使用和定制Django后台管理界面。 安装与…...

电子学会C/C++编程等级考试2021年09月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...