C++opencv图像裁剪、等比例放大缩小、复制到指定区域

描述

C++使用opencv时,对imshow图像进行的常见处理,包括图像剪裁、等比例压缩等(待继续补充)

代码

1. 剪裁

int matrix_size = 3000;
cv::Mat image(matrix_size, matrix_size, CV_8UC3, cv::Scalar(255, 255, 255)); // 原图
cv::Mat image_part = image(cv::Rect(1400,1100,1000,1800)); // 裁剪后的图
cv::imshow("part of original image", image_part);
cv::waitKey(5);

代码中
cv::Rect是opencv画的矩形,四个参数分别为矩形(左上角的column值,左上角的row值,矩形column方向上的宽,矩形row方向上的宽)

2. 等比例缩小

int matrix_size = 3000;
cv::Mat image(matrix_size, matrix_size, CV_8UC3, cv::Scalar(255, 255, 255)); // 原图
cv::Mat image_mini; // 等比例缩小图
resize(image, image_mini, cv::Size(matrix_size/3, matrix_size/3)); // 缩小操作
cv::imshow("mini of original image", image_mini);
cv::waitKey(5);

3. 等比例放大

int matrix_size = 3000;
cv::Mat image(matrix_size, matrix_size, CV_8UC3, cv::Scalar(255, 255, 255)); // 原图
cv::Mat image_max; // 等比例放大图
resize(image, image_max, Size(matrix_size * 2, matrix_size * 2)); // 放大操作
cv::imshow("max of original image", image_max);
cv::waitKey(5);

4. 提取图像的固定行和列

原始Mat格式数据:

cv::Mat A = Mat::zeros(4, 5, CV_32F);//【4行5列,高4宽5】
  • 提取行
cv::Mat B = A.rowRange(0, 3).clone() ; //提取第0~2行(包括第2行)
  • 提取列
cv::Mat C = A.colRange(2, 5).clone() ; //提取第2~4列(包括第4列)

注意,rowRange(start,end)与colRange(start,end)均包括左边界,不包括右边界。

  • copyTo()函数
cv::Mat c = Mat::zeros(3, 5, CV_32F);
cv::Mat a = Mat::ones(3, 6, CV_32F);
c.col(0).copyTo(a.col(0)); //将c的第1列赋值给a
c.copyTo(a.colRange(1, 6)); //将c的1-5列赋值给a

5. 图像复制到指定区域

// 变量请自行初始化
cv::Mat image_origin, image_new;
cv::Rect area_keep = cv::Rect(0, v, matrix_size - u, matrix_size - v);
cv::Mat image_keep = image_origin(area_keep);
cv::Rect area_new = cv::Rect(u, 0, matrix_size - u, matrix_size - v);
image_keep.copyTo(image_new(area_new));

resize()函数的参数

void cv::resize (InputArray src,
		OutputArray dst,
		Size dsize,
		double fx = 0,
		double fy = 0,
		int interpolation = INTER_LINEAR

参数含义

  • src(必填): 原图像

  • dst(必填): 变换后的图像

  • dsize(必填): 写法cv::Size(col, row),变换后的图像尺寸

  • fx 和 fy(自由选填): 缩放系数,1为不变,<1缩小,>1放大。如果 Size 被设置的话,则根据 Size 做缩放插值;如果没写Size,需要根据 fx 和 fy 做缩放插值。
    以下两种写法一致

    resize(image, image_mini, cv::Size(image.cols/2, image.rows));
    resize(image, image_mini, cv::Size(), 0.5, 1);
    
  • interpolation(自由选填): 插值算法,自行去研究,不填写就是默认为0, 也就是最近点插值INTER_NEAREST

  • 12
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值