描述
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 版权协议,转载请附上原文出处链接和本声明。