OpenCV图像旋转,指定填充背景颜色边界颜色

标签: OpenCV图像旋转 指定填充背景颜色边界颜色 背景颜色 边界颜色
2721人阅读 评论(0) 收藏 举报
分类:

OpenCV图像旋转,指定填充背景颜色边界颜色

OpenCV与图像旋转有关的函数:
(1)warpAffine函数
void cv::warpAffine(InputArray src,
  OutputArray dst,
  InputArray M,
  Size dsize,
  int flags = INTER_LINEAR,
  int borderMode = BORDER_CONSTANT,
  const Scalar & borderValue = Scalar() 
 )  

Applies an affine transformation to an image.

The function warpAffine transforms the source image using the specified matrix:

dst(x,y)=src(M11x+M12y+M13,M21x+M22y+M23)

when the flag WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted with cv::invertAffineTransform and then put in the formula above instead of M. The function cannot operate in-place.

Parameters
srcinput image.
dstoutput image that has the size dsize and the same type as src .
M2×3 transformation matrix.
dsizesize of the output image.
flagscombination of interpolation methods (see cv::InterpolationFlags) and the optional flag WARP_INVERSE_MAP that means that M is the inverse transformation ( dstsrc ).
borderModepixel extrapolation method (see cv::BorderTypes); when borderMode=BORDER_TRANSPARENT, it means that the pixels in the destination image corresponding to the "outliers" in the source image are not modified by the function.
borderValuevalue used in case of a constant border; by default, it is 0.
中文解释:
    C++: void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
  InputArray src:输入的图像C++: void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
  第1个参数:OutputArray dst:输出的图像 
  第2个参数:InputArray M:透视变换的矩阵
  第3个参数:Size dsize:输出图像的大小
  第4个参数:int flags=INTER_LINEAR:输出图像的插值方法,可以为
            INTER_LINEAR 线性插值;
            INTER_NEAREST 最近邻插值;
            INTER_AREA 区域插值
            INTER_CUBIC 三次条样插值
            CV_WARP_INVERSE_MAP:指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素插值。否则, 函数从 map_matrix 得到反变换。
            CV_WARP_FILL_OUTLIERS:填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval(fillval
用来填充边界外面的值).

  第5个参数:int borderMode:图像边界的处理方式,默认是BORDER_CONSTANT(即指定常数值填充) ,实质上,边界处理类型,该枚举型还有:

Enumerator
BORDER_CONSTANT 

iiiiii|abcdefgh|iiiiiii with some specified i(指定常数填充)

BORDER_REPLICATE 

aaaaaa|abcdefgh|hhhhhhh(复制边缘像素填充)

BORDER_REFLECT 

fedcba|abcdefgh|hgfedcb(反射复制边界像素)

BORDER_WRAP 

cdefgh|abcdefgh|abcdefg

BORDER_REFLECT_101 

gfedcb|abcdefgh|gfedcba(对称填充,也就是以最边缘像素为轴)

BORDER_TRANSPARENT 

uvwxyz|absdefgh|ijklmno

BORDER_REFLECT101 

same as BORDER_REFLECT_101

BORDER_DEFAULT 

same as BORDER_REFLECT_101

BORDER_ISOLATED 

do not look outside of ROI

  第6个参数:const Scalar& borderValue=Scalar():边界的颜色设置,一般默认是0。
(2)getRotationMatrix2D函数
    Mat getRotationMatrix2D(Point2f center, double angle, double scale)
参数详解:
  Point2f center:表示旋转的中心点
  double angle:表示旋转的角度
  double scale:图像缩放因子
例子:
int main() {
	Mat src = imread("D:\\OpencvTest\\test1.jpg");
	cv::Mat dst;
	//float scale = 200.0/ src.rows;//缩放因子  
	//cv::resize(src, src, cv::Size(), scale, scale, cv::INTER_LINEAR);  
	//旋转角度-20度    
	double angle = -20;
	//输出图像的尺寸与原图一样  
	cv::Size dst_sz(src.cols, src.rows);

	//指定旋转中心    
	cv::Point2f center(src.cols / 2., src.rows / 2.);

	//获取旋转矩阵(2x3矩阵)    
	cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
	//设置选择背景边界颜色:绿色  
	cv::Scalar borderColor = Scalar(0, 238, 0);
	cv::warpAffine(src, dst, rot_mat, src.size(), INTER_LINEAR, BORDER_CONSTANT, borderColor);  
	//cv::warpAffine(src, dst, rot_mat, dst_sz, INTER_LINEAR, BORDER_REPLICATE);

	//显示旋转效果    
	cv::imshow("src image ", src);
	cv::imshow("Rotation Image", dst);
	waitKey(0);
	return 0;
	return 0;
}
运行效果:

改为BORDER_REPLICATE:复制边缘填充,其效果如下:
cv::warpAffine(src, dst, rot_mat, dst_sz, INTER_LINEAR, BORDER_REPLICATE);


尊重原创,转载请注明出处】 http://blog.csdn.net/guyuealian/article/details/77993410
查看评论

镜头畸变现象及其校正方法

畸变纠正后,以圆为例,测试效果。 http://www.ixueshu.com/document/ffb29c8956cd54b3.html http://blog.csdn.net/waeceo...
  • piaoxuezhong
  • piaoxuezhong
  • 2017-07-30 16:48:46
  • 7428

Unity.VR.05之3D凝视进度条的实现

VR Smaples中的凝视环可以加强玩家的交互体验并防止玩家的误操作,通过UGUI中的Image和Slider的组件就可以轻松实现。但在VR游戏之中,我们有时候会需要一些3D网格对象制作的滑动进度条...
  • Constant23
  • Constant23
  • 2017-04-25 13:34:05
  • 1037

用指定颜色填充一个连接域

在图像处理里,如果我们需要填充一个区域,使该区域为相同的颜色,则比较常用的是洪水填充法。洪水填充法可以用DFS也可以用BFS实现。   opencv下有函数实现该功能:    F...
  • yansmile1
  • yansmile1
  • 2015-07-05 09:07:37
  • 695

opencv图像边界的填充

填充图像边界的两种方法: BORDER_CONSTANT: 使用常数填充边界 (i.e. 黑色或者 )BORDER_REPLICATE: 复制原图中最临近的行或者列。 源码部分给出更加详细的解...
  • qq_18343569
  • qq_18343569
  • 2015-07-31 19:50:09
  • 2005

深度学习之四:卷积神经网络基础

计算机视觉在深度学习的帮助下取得了令人惊叹的进展,其中发挥重要作用的是卷积神经网络。本节总结了卷积神经的原理与实现方法。 1 卷积神经网络 1.1 计算机视觉与深度学习 计算机视觉要解决...
  • zzulp
  • zzulp
  • 2018-02-19 19:24:58
  • 857

给图像添加边界

给图像添加边界 填充图像边界的两种方法: BORDER_CONSTANT: 使用常数填充边界 (i.e. 黑色或者 0)BORDER_REPLICATE: 复制原图中最临近的行或者列。...
  • liyuqian199695
  • liyuqian199695
  • 2016-12-23 23:00:54
  • 179

【OpenCV】图像旋转详解,边缘用黑色填充

项目要用到图像旋转,OpenCV里面居然没有专门封装好的函数,只好自己写了。根据《learnning OpenCV》发现效果不是很理想,旋转后图像大小不变,可是图像却被裁减了。 例子如下: int m...
  • u010418035
  • u010418035
  • 2015-04-17 20:55:36
  • 3668

【opencv练习19 - 图像添加边界】

/***************************************************** 测试程序 【图像添加边界】 时间:2016年8月26日 *********...
  • u011171235
  • u011171235
  • 2016-09-04 16:44:05
  • 489

tensorflow conv2d padding,tf图像卷积边缘扩展问题

初学tensorflow的conv2d的时候,一般书上会说conv2d的扩展可以选择两种,SAME和VALID。这两种要么导致图像变小(valid),要么导致边缘变黑(same),因为边缘只补0。曾一...
  • wkk15903468980
  • wkk15903468980
  • 2017-07-12 16:27:07
  • 1179

keras学习笔记

具体请查看官方文档keras官方文档 1.基本概述 neural layers(神经层), cost functions(损失函数), optimizers(优化器), initializat...
  • u012897374
  • u012897374
  • 2017-10-06 21:42:11
  • 2992
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 67万+
    积分: 6849
    排名: 4272
    博客专栏
    最新评论