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安装(一) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql间隙锁,next-key lock,row锁加锁范围分析

介绍 mysql可重复读隔离级别的实现主要依赖mvcc(多版本并发控制)和间隙锁,行锁,多种锁的组合使用来解决可重复读和幻读的问题。 mvcc:主要是给保存每行数据的多个版本,每个版本多了2个字段,一个为最后更新事务的id,一个是删除事务…

maui sqlite开发一个商城加购物车的演示(3)

购物车界面及代码 <?xml version"1.0" encoding"utf-8" ?> <ContentPage xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/xaml"xmlns:syncfusion"clr-namesp…

数据修复:.BlackBit勒索病毒来袭,安全应对方法解析

导言&#xff1a; 黑色数字罪犯的新玩具——.BlackBit勒索病毒&#xff0c;近来成为网络安全领域的头号威胁。这种恶意软件以其高度隐秘性和毁灭性而引起广泛关注。下面是关于.BlackBit勒索病毒的详细介绍&#xff0c;如不幸感染这个勒索病毒&#xff0c;您可添加我们的技术服…

ArcMap自定义脚本工具箱迁移至ArcGIS pro

本文记录了将ArcMap10.7创建的自定义脚本工具箱&#xff08;.tbx&#xff09;迁移至ArcGIS pro的过程 ArcGIS Pro使用的是python版本与ArcMap不同&#xff0c;前者为python3&#xff0c;后者为python2。由于python3 和 python2 的部分语法不兼容&#xff0c;以及一些地理处理工…

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好&#xff0c;我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了&#xff0c;火爆程度压过Google的Gemini。 缘起是MistralAI二话不说&#xff0c;直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…

剑指offer 背包问题求具体方案

剑指offer 背包问题求具体方案 题目 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出 字典序最小的方…

vue3的大致使用

<template><div class"login_wrap"><div class"form_wrap"> <!-- 账号输入--> <el-form ref"formRef" :model"user" class"demo-dynamic" > <!--prop要跟属性名称对应-->…

华为技面三轮面试题

1. 最长回文子串 -- 中心扩散法 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&…

磁力计LIS2MDL开发(3)----九轴姿态解算

磁力计LIS2MDL开发.3--九轴姿态解算 概述视频教学样品申请完整代码下载使用硬件欧拉角万向节死锁四元数法姿态解算双环PI控制器偏航角陀螺仪解析代码 概述 LIS2MDL 包含三轴磁力计。 lsm6ds3trc包含三轴陀螺仪与三轴加速度计。 姿态有多种数学表示方式&#xff0c;常见的是四元…

服务器RAID配置及功能介绍

服务器RAID配置及功能介绍 一、RAID磁盘阵列详解1.RAID磁盘阵列介绍2.RAID 03.RAID14.RAID35.RAID56.RAID67.RAID 10总结阵列卡介绍 一、RAID磁盘阵列详解 1.RAID磁盘阵列介绍 ①是Redundant Array of lndependent Disks的缩写中文简称为独立冗余磁盘阵列。 ②把多块独立的物…

聊聊AsyncHttpClient的ListenableFuture

序 本文主要研究一下AsyncHttpClient的ListenableFuture ListenableFuture org/asynchttpclient/ListenableFuture.java public interface ListenableFuture<V> extends Future<V> {/*** Terminate and if there is no exception, mark this Future as done an…

NBA得分数据可视化

简介 这是上学期的一些课外活动内容&#xff0c;将 NBA 得分数据进行可视化&#xff0c;并进行后续的探索性分析和建模&#xff08;本文未介绍&#xff09;。主要研究动机来源于这篇论文&#xff1a; 该论文使用二元的伽马过程来刻画 NBA 主客场得分数据&#xff0c;并且考虑了…

@RabbitHandler和@RabbitListener的区别

RabbitHandler 和 RabbitListener 是Spring AMQP&#xff08;特别是针对RabbitMQ&#xff09;中常用的两个注解&#xff0c;它们在消息处理中扮演着不同的角色。 RabbitListener 定义&#xff1a;RabbitListener 注解用于标记一个方法&#xff0c;使其成为消息队列的监听器&am…

5.5 Linux Apache服务

1、概念介绍 a. Web 服务简介 WEB服务器也称为WWW(WORLD WIDE WEB&#xff0c;万维网)服务器&#xff0c;主要功能是提供网上信息浏览服务。 常用web服务器&#xff1a;httpd&#xff08;apache&#xff09;、nginx、tomcat、IIS 客户端&#xff1a;IE、firefox、chrome b…

高通平台开发系列讲解(AI篇)SNPE工作流程介绍

文章目录 一、转换网络模型二、量化2.1、选择量化或非量化模型2.2、使用离线TensorFlow或Caffe模型2.3、使用非量化DLC初始化SNPE2.4、使用量化DLC初始化SNPE三、准备输入数据四、运行加载网络沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍SNPE模型工作…

Android终端模拟器Termux上使用Ubuntu

Termux 上安装各种 Linux 系统是通过 proot-distro 工具来实现的&#xff0c;所以先安装一下 proot-distro 工具。 ~ $ pkg install proot-distro 查看Termux支持安装那些Linux ~ $ proot-distro listSupported distributions:* Alpine LinuxAlias: alpineInstalled: noComme…

学习Java第70天,过滤器Filter简介

过滤器概述 Filter,即过滤器,是JAVAEE技术规范之一,作用目标资源的请求进行过滤的一套技术规范,是Java Web项目中最为实用的技术之一 Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口 Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和…

Cmake基础(6)

这篇文章阐述如何添加第三方库 文章目录 包含目录和依赖库注意事项target_link_libraries 基本用法&#xff1a;修饰词&#xff1a;PUBLIC、PRIVATE、INTERFACE 其他注意事项&#xff1a;optimized 和 debug 配置标识&#xff1a;示例&#xff1a; 包含目录和依赖库 把上一篇…

【C++】POCO学习总结(十八):XML

【C】郭老二博文之&#xff1a;C目录 1、XML文件格式简介 1&#xff09;XML文件的开头一般都有个声明&#xff0c;声明是可选 <&#xff1f;xml version"1.0" encoding"UTF-8"?>2&#xff09;根元素&#xff1a;XML文件最外层的元素 3&#xff…

java内置的数据结构

Java语言提供了许多内置的数据结构&#xff0c;包括&#xff1a; 1. 数组&#xff08;Array&#xff09;&#xff1a;数组是最基本的数据结构之一&#xff0c;它是一个有序的元素集合&#xff0c;每个元素都有一个对应的索引。在Java中&#xff0c;数组可以通过声明和初始化来创…