OpenCV4(C++)—— 图片的基本尺寸变换

news2024/11/14 21:13:50

文章目录

  • 一、resize(缩放)
  • 二、filp(翻转)
  • 三、裁剪
  • 四、拼接


一、resize(缩放)

void cv::resize(
    cv::InputArray src,          // 输入图像
    cv::OutputArray dst,         // 输出图像
    cv::Size dsize,              // 目标图像尺寸
    double fx = 0,               // 沿水平轴的缩放因子
    double fy = 0,               // 沿垂直轴的缩放因子
    int interpolation = INTER_LINEAR  // 插值方法
);

interpolation:插值方法,用于确定如何处理图像的像素值。常见的插值方法有:
cv::INTER_NEAREST:最近邻插值,使用离目标位置最近的像素值。
cv::INTER_LINEAR:双线性插值(默认),使用目标位置附近的四个像素值进行加权平均。
cv::INTER_CUBIC:双三次插值,在 INTER_LINEAR 基础上更加平滑,但计算成本更高。
cv::INTER_LANCZOS4:Lanczos 插值,通过 sinc 函数进行插值,可获得更好的质量和抗锯齿效果。

注:调整 dsize 参数或缩放因子 fx 和 fy 都可以控制图片大小变化,选择一个即可,另一个设定为0,如:

    cv::Mat out0, out1;
    cv::resize(img, out0, cv::Size(520, 520), 0, 0);  // 调整为520*520大小
    cv::resize(img, out1, cv::Size(0, 0), 0.5, 0.5);  // 调整为原图的0.5倍
    cv::resize(img, out1, cv::Size(0, 0), 0.5, 0.5);  // 调整为原图的2倍

二、filp(翻转)

void cv::flip(
    cv::InputArray src,          // 输入图像
    cv::OutputArray dst,         // 输出图像
    int flipCode                 // 翻转模式
);
常见的翻转模式有:
0:沿 x 轴翻转(水平翻转)。
1:沿 y 轴翻转(垂直翻转)。
-1:同时沿 x 和 y 轴翻转(水平和垂直翻转)。

//cv::Mat img_x, img_y, img_xy;
//cv::flip(img, img_x, 0); // 沿x轴
//cv::flip(img, img_y, 1); // 沿y轴
//cv::flip(img, img_xy, -1); // 中心对称

三、裁剪

在 OpenCV 中,裁剪的常用方式有两种:cv::Rect 或 数组索引。但两者的原理都是定义裁剪区域的左上角坐标 (x, y) 和区域的宽度和高度。

cv::Mat image = cv::imread("input.jpg");

int x = 100;  // 裁剪区域左上角的 x 坐标
int y = 100;  // 裁剪区域左上角的 y 坐标
int width = 200;  // 裁剪区域的宽度
int height = 150;  // 裁剪区域的高度

//1、使用cv::Rect
cv::Rect roi(x, y, width, height);
cv::Mat croppedImage = image(roi);
//2、使用数组索引
cv::Mat croppedImage = image(cv::Range(y, y + height), cv::Range(x, x + width));

通常,对一张图片进行裁剪时,采用的是网格裁剪的方法来固定每一小张裁剪图片的大小。下面是一个简单示例:

	cv::Mat img = cv::imread("C:/Users/Opencv/temp/lena.png", 0);
	
    int rows = 2;  // 网格行数
    int cols = 2;  // 网格列数
    int grid_w = img.cols / cols;  // 每个网格的宽度
    int grid_h = img.rows / rows;  // 每个网格的高度

    int n = 0;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            // 计算当前网格的左上角坐标
            int src_x = j * grid_w;
            int src_y = i * grid_h;

            // 裁剪当前网格
            cv::Rect roi(src_x, src_y, grid_w, grid_h);
            cv::Mat gridImg = img(roi);

            // 保存
            string filename = "grid_" + to_string(n) + ".png";
            cv::imwrite(filename, gridImg);
            ++n;
        }
    }

在这里插入图片描述

四、拼接

    cv::Mat img1 = cv::imread("C:/Users/Opencv/temp/grid_0.png",0);
    cv::Mat img2 = cv::imread("C:/Users/Opencv/temp/grid_1.png",0);
    cv::Mat img3 = cv::imread("C:/Users/Opencv/temp/grid_2.png",0);
    cv::Mat img4 = cv::imread("C:/Users/Opencv/temp/grid_3.png",0);
    cv::Mat out1, out2, out;

    cv::hconcat(img1, img2, out1);  // 横向拼接
    cv::hconcat(img3, img4, out2);
    cv::vconcat(out1, out2, out);  // 纵向拼接

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

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

相关文章

C++对象模型(6)-- 数据语义学:继承的对象布局(含虚函数)

1、单个类带虚函数的对象布局 当类含有虚函数时&#xff0c;在实例化对象时会产生一个虚函数表指针&#xff0c;这个虚函数表指针通常在对象的开头位置。 class Base { public:int x;int y;virtual void virFunc() { } }; 对象布局如下&#xff1a; 2、单一继承父类带虚函数…

ZYNQ的程序固化

03-ZYNQ学习&#xff08;启动篇&#xff09;之程序的固化_zynq ps网口-CSDN博客 ZYNQ启动之后&#xff0c; PS_POR_B 复位引脚置低后&#xff0c;硬件立即对引导带引脚进行采样&#xff0c;并可选择启用 PS 时钟 PLL。然后&#xff0c;PS开始执行片上ROM中的BootROM代码来引导…

UniApp项目实践HelloUni继续快速小步快跑中,前面是大上海吗

效果镇楼 本来想着稍微刷点课程就完活的&#xff0c;结果还是到这个点了。宝贵的时间啊 直接代码干就是了&#xff0c;参考如下链接&#xff1b; UniApp实践业务项目

使用Resource Hacker编辑DLL文件

Resource Hacker下载 链接&#xff1a;https://pan.quark.cn/s/8e18988d49aa 操作 打开resource hacker软件 打开文件 修改 编译&#xff0c;点击绿色按钮 提示成功 将编译后的文件另存为即可

C语言纳秒级计时

C语言纳秒级计时 文章目录 C语言纳秒级计时函数介绍示例代码参考 函数介绍 C语言中常用的clock()函数只能精确到毫秒级&#xff0c;对应的数据类型是clock_t。 C11标准中提供了纳秒级别定时器&#xff1a;timespec_get()函数与timespec()类型。 struct timespec{time_t tv_s…

找不到msvcp140.dll导致代码无法继续执行 ,8个方法搞定msvcp140.dll文件缺失问题

首先&#xff0c;让我们了解一下 msvcp140.dll 文件。msvcp140.dll 是 Microsoft Visual Studio 2010 编译的程序所使用的动态链接库之一&#xff0c;它包含了一些 C标准库函数的实现&#xff0c;例如 std::vector、std::string 等。这个文件主要被用于支持 C程序的运行&#x…

计算机是如何启动的

一直好奇计算机启动的原理是怎么样的&#xff1f;最近刚好想搞一下操作系统&#xff0c;故此总结一下。 打开电源 对于现代计算机来说&#xff0c;打开电源是开机的第一步&#xff0c;这一点无用质疑&#xff0c;离开了电&#xff0c;现代社会估计就会垮台。 计算机启动 加电…

ctfshow-web9(奇妙的ffifdyop绕过)

尝试万能密码登录&#xff0c;没有任何回显 尝试扫描目录&#xff0c;这里不知道为啥御剑什么都扫不到&#xff0c;使用dirsearch可以扫到robots.txt 查看robots协议 访问下载index.phps 查看index.phps 简单审计一下php代码&#xff1a; $password$_POST[password]; if(strl…

Linux——多线程1

目录 一.理解线程的概念 Linux线程概念 二.线程的优点 三.线程的缺点 四.线程用途 五. Linux进程VS线程 一.理解线程的概念 教材观点&#xff1a; 线程是一种执行分支&#xff0c;执行粒度比进程更细&#xff0c;调度成本更低。线程是进程内部的一个执行流。 内核观点: …

【Python查找算法】二分查找、线性查找、哈希查找

目录 1 二分查找算法 2 线性查找算法 3 哈希查找算法 1 二分查找算法 二分查找&#xff08;Binary Search&#xff09;是一种用于在有序数据集合中查找特定元素的高效算法。它的工作原理基于将数据集合分成两半&#xff0c;然后逐步缩小搜索范围&#xff0c;直到找到目标元素…

python的一些知识点

之前自学过python&#xff0c;学了一些基本语法&#xff0c;但忘得厉害。最近&#xff0c;在努力地写代码&#xff0c;在学代码&#xff0c;写代码中学习python&#xff0c;为此记录一些关于python的知识点。

四、综合——通信系统

文章目录 一、通信系统概述1.1 通信的基本概念1.2 通信系统的组成二、信道的定义和分类三、信源编码四、调制一、通信系统概述 1.1 通信的基本概念 通信是发送者(人或机器)和接收者之间通过某种媒体进行的信息传递。广义来讲。光通信也属于电通信,因为光也是一种电磁波。 …

2023.10.09

#include <iostream>using namespace std;//定义一个类&#xff08;人&#xff09; class Per { private:string name;//姓名int age;//年龄//体重和身高另存堆空间double* height;//身高double* weight;//体重 public://定义构造函数&#xff0c;并且初始化//运用初始化…

【致敬未来的攻城狮计划】第2期 作业汇总贴 + 获奖公布

一、写在前面 时间过得真快&#xff0c;距离 【致敬未来的攻城狮计划】第2期 的发起&#xff0c;已经过去一个多月了&#xff0c;而第2期的真正学习考核期也将在5/13的18点整正式结束。 关于第2期的活动计划&#xff0c;感兴趣的可以参见这里&#xff1a;【重磅推出】《致敬未…

springboot项目中添加大屏页面

在非前后端分离的项目中根据项目需求需要添加一个大屏页面 解决方案&#xff1a; 参考&#xff1a;纯静态引入.vue文件之http-vue-loader.js - 知乎 我是把httpVueLoader.js 下载到本地引入 引入http-vue-loader.js 在vue代码中 components: { // 注意component 下name的命…

【C++】:日期类实现

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

Kafka和RabbitMQ的对比

Rabbitmq比kafka可靠&#xff0c;kafka更适合IO高吞吐的处理&#xff0c;比如ELK日志收集 Kafka和RabbitMq一样是通用意图消息代理&#xff0c;他们都是以分布式部署为目的。但是他们对消息语义模型的定义的假设是非常不同的。 a) 以下场景比较适合使用Kafka。如果有大量的事…

C#操作PPT动画窗格并插入音频文件的一些思路

目录 系统环境 基础配置 设计想法 关键代码 组件库引入 基础代码 核心代码 总结 系统环境 在 Windows Server 2019 操作系统上安装Office PowerPoint 2016或以上 安装 .netFramework4.7.1以上 开发工具 VS2019 语言 C# 基础配置 打开控制面板、管理工具、组件服务…

LabVIEW使用VI Package Manager(VIPM)下载和管理附加组件

LabVIEW使用VI Package Manager&#xff08;VIPM&#xff09;下载和管理附加组件 LabVIEW Tools Network和VI Package Manager&#xff08;VIPM&#xff09;使浏览&#xff0c;下载和管理LabVIEW附加组件变得容易。它具有软件包存储库&#xff0c;可以从桌面连接到软件包&…

基于差分进化优化的BP神经网络(分类应用) - 附代码

基于差分进化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于差分进化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.差分进化优化BP神经网络3.1 BP神经网络参数设置3.2 差分进化算法应用 4.测试结果…