OpenCV图像旋转,指定填充背景颜色边界颜色
OpenCV与图像旋转有关的函数:
(1)warpAffine函数
INTER_LINEAR
BORDER_CONSTANT
Scalar()
中文解释:
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 | |
BORDER_REPLICATE | |
BORDER_REFLECT | |
BORDER_WRAP | |
BORDER_REFLECT_101 | |
BORDER_TRANSPARENT | |
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);