首页 > 其他分享 >OpenCV图像旋转,指定填充背景颜色边界颜色

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

时间:2022-12-27 18:31:08浏览次数:39  
标签:src 颜色 填充 dst OpenCV 图像 INTER BORDER cv


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 

​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);


标签:src,颜色,填充,dst,OpenCV,图像,INTER,BORDER,cv
From: https://blog.51cto.com/u_15764210/5973188

相关文章

  • AnswerOpenCV(1001-1007)一周佳作欣赏
    一、小白问题​​http://answers.opencv.org/question/199987/contour-single-blob-with-multiple-object/​​ContourSingleblobwithmultipleobjectHit......
  • OpenCV-Python learning-7.运算性能
    本节说明opencv-python对于性能的度量和优化。以下为代码部分:%matplotlibinlineimportcv2importmatplotlib.pyplotaspltimg=cv2.imread('e:/rotman.jpg')plt.imshow(......
  • 浅析OpenCV中的BlobDetector
    ​​​​一、blob基础所谓Blob就是图像中一组具有某些共同属性(例如,灰度值)的连接像素。在上图中,深色连接区域是斑点,斑点检测的目的是识别并标记这些区域。OpenCV提供了一......
  • OpenCV中轮廓处理简介
    一、OpenCV中的轮廓图像的上半部分是一张白色背景上的测试图像,包含了一系列标记A到E的区域。寻找到的轮廓被标记为cX或hX,其中c代表“轮廓(contour)”,h代表“孔(h......
  • Hessian矩阵以及在血管增强中的应用—OpenCV实现
    有别于广为人知的Sobel、Canny等一阶算法,基于Hessian矩阵能够得到图像二阶结果,这将帮助我们深入分析图像本质。Hessian矩阵在图像处理中有着广泛的应用:其中在图像分割......
  • AnswerOpenCV一周佳作欣赏(0615-0622)
    i'musingOpenCVforAndroid.Iwouldliketoknow,howtomakeimagecorrection(autoadjustmentsofbrightness/contrast)forimage(bitmap)inandroidviaOpenCV......
  • answerOpenCV轮廓类问题解析
    contour在opencv中是一个基础的数据结构,灵活运用的话,作用很大。以contour为关键字,在answerOpenCV中能够发现很多有趣的东西。 1、无法解决的问题​​......
  • 《学习OpenCV3》第14章课后习题
    1、在一条含有N个点的封闭轮廓中,我们可以通过比较每个点与其它点的距离,找出最外层的点。(这个翻译有问题,而且这个问题是实际问题)a、这样一个算法的复杂度是多少?b......
  • 为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍
        基于OpenCV编写图像处理项目,除了算法以外,比较重要一个问题就是界面设计问题。对于c++语系的程序员来说,一般来说有QT/MFC两种考虑。QT的确功能强大,特别是QML......
  • 记录一次关于OpenCV的CmakeLists的探索
        编写基于OpenCV的图像处理程序,其中很重要的一道门槛就是编译OpenCV,应该说如果你对其中的内容如果不是很熟悉的话,即使是最简单粗暴的“两次configure,一次gene......