已解决
OpenCV4(C++)—— 图片的基本尺寸变换
来自网友在路上 150850提问 提问时间:2023-10-09 11:53:27阅读次数: 50
最佳答案 问答题库508位专家为你答疑解惑
文章目录
- 一、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); // 纵向拼接
查看全文
99%的人还看了
相似问题
- 2023-11-22 LeetCode每日一题(网格中的最小路径代价)
- 动态规划:2304. 网格中的最小路径代价
- CSS3 多媒体查询、网格布局
- JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用
- 基于OCC+OSG集成框架下的GMSH之二阶网格划分探索
- 【计算系统】5分钟了解超算,高性能计算,并行计算,分布式计算,网格计算,集群计算以及云计算的区别
- 从入门到精通:深入了解CSS中的Grid网格布局技巧和应用!
- 通过引入插件Grid Masschange实现批量修改交互网格数据
- 【Qt】盒子布局、网格布局、表单布局和堆栈布局
- 【AIGC核心技术剖析】用于高效 3D 内容创建生成(从单视图图像生成高质量的纹理网格)
猜你感兴趣
版权申明
本文"OpenCV4(C++)—— 图片的基本尺寸变换":http://eshow365.cn/6-17772-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: selenium京东商城爬取
- 下一篇: Linux: 基础IO