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

  • Post author:
  • Post category:其他




描述

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



版权声明:本文为weixin_42156097原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。