opencv示例1:图像的几何变化

参考此文

1、图像镜像

remap函数

CV_EXPORTS_W void remap( 
InputArray src, 
OutputArray dst,
InputArray map1, 
InputArray map2,
int interpolation, 
int borderMode=BORDER_CONSTANT,
const Scalar& borderValue=Scalar());

其功能为根据map1和map2两个矩阵,对输入图像src做出重映射,并将映射结果以dst输出。所以参数就很直观了:
第一个参数:输入图像
第二个参数:输出图像
第三个参数:输入图像中各像素点的坐标映射到目标图像的哪个x(列)
第四个参数:输入图像中各像素点的坐标映射到目标图像的哪个x(行)
第五个参数:图像插值方式,可以参考:常用插值方法
第六个参数:边界模式,有默认值BORDER_CONSTANT。
第七个参数:const Scalar&类型的borderValue,当有常数边界时使用的值,其有默认值Scalar( ),即默认值为0。

用例实现

Mat SrcImage = imread("F:/projects/opencv/zhuzi.png",0);
    imshow("原图",SrcImage);
    Mat dst;
    dst.create( SrcImage.size(), SrcImage.type());
    Mat map_x;
    Mat map_y;
    map_x.create( SrcImage.size(), CV_32FC1);
    map_y.create( SrcImage.size(), CV_32FC1);
    for( int i = 0; i < SrcImage.rows; i++)
    {
        for( int j = 0; j < SrcImage.cols; j++)
        {
            //map_x.at<float>(i, j) = (float) (SrcImage.cols - j-1) ;
            //map_y.at<float>(i, j) = (float) i ;  //水平
            map_x.at<float>(i, j) = (float) j ;
            map_y.at<float>(i, j) = (float) (SrcImage.rows - i-1) ;  //垂直
        }
    }
    //图像的重映射
    remap(SrcImage, dst, map_x, map_y, INTER_LINEAR);
    imshow("dst", dst);

2、图像缩放

多种缩放模式:最近领域差值、双线性差值、像素关系重采样、立方插值
插值算法详解

resize函数

void cv::resize(InputArray    src,
                OutputArray   dst,
                Size          dsize,
                double        fx = 0,
                double        fy = 0,
                int           interpolation = INTER_LINEAR //缩放模式(插值算法)
               )

3、图像仿射变化(warpAffine)

仿射变换是二维坐标空间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括“平直性”以及“平行性”,常用于图像翻转(Flip)、旋转(Rotation)、平移(Translation)、缩放(Scale opertions)等,然而其实现的函数就是cv::warpAffine()

cv::warpAffine

void cv::warpAffine ( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar()
)

参数解释
. src: 输入图像
. dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致
. M: 2X3的仿射变换矩阵
. dsize: 指定图像输出尺寸
. flags: 插值算法标识符,有默认值INTER_LINEAR,如果插值算法为WARP_INVERSE_MAP, warpAffine函数使用如下矩阵进行图像转换

常用的插值算法如下:
在这里插入图片描述
. borderMode: 边界像素模式,有默认值BORDER_CONSTANT
. borderValue: 边界取值,有默认值Scalar()即0

cv::getRotationMatrix2D(矩阵旋转与缩放)

Mat cv::getRotationMatrix2D(Point2f center,
double angle,
double scale
)
参数
center 旋转图像所要围绕的中心点
angle 旋转的角度. 在OpenCV中正角度是逆时针的
scale 缩放因子,可选的

示例:

cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;
 
//旋转角度
double angle = 45;
 
cv::Size src_sz = src.size();
cv::Size dst_sz(src_sz.height, src_sz.width);
int len = std::max(src.cols, src.rows);
 
//指定旋转中心
cv::Point2f center(len / 2., len / 2.);
 
//获取旋转矩阵(2x3矩阵)
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
 
//根据旋转矩阵进行仿射变换
cv::warpAffine(src, dst, rot_mat, dst_sz);
 
//显示旋转效果
cv::imshow("image", src);
cv::imshow("result", dst);
 
cv::waitKey(0);
 
return 0;

cv::getAffineTransform(仿射变化)

	//创建仿射变换目标图像与原图像尺寸类型相同
    warp_dstImage = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());

    //设置(原图与目标图相映射)的三个点来计算仿射变换
    srcTri[0] = Point2f(0, 0);
    srcTri[1] = Point2f(srcImage.cols - 1, 0);
    srcTri[2] = Point2f(0, srcImage.rows - 1);

    dstTri[0] = Point2f(srcImage.cols*0.0, srcImage.rows*0.33);
    dstTri[1] = Point2f(srcImage.cols*0.85, srcImage.rows*0.25);
    dstTri[2] = Point2f(srcImage.cols*0.15, srcImage.rows*0.7);

    //计算仿射变换矩阵
    warp_mat = getAffineTransform(srcTri, dstTri);

    //对加载图形进行仿射变换操作
    warpAffine(srcImage, warp_dstImage, warp_mat, warp_dstImage.size());

4、透视投影变换(warpPerspective)

通俗解释:将同一物体在某一视角所成的像,变换到另一个视角所成的像。
示例:
摘录此处

#include <opencv2/opencv.hpp>
#include <iostream>
 
using namespace cv;
using namespace std;
 
float w = 250, h = 350;
Mat matrix, imgWarp;
// 透视变换
void main() {
 
	string path = "card.jpg";
	Mat img = imread(path);
 
	Point2f src[4] = { {529,142},{771,190},{405,395},{674,457} };
	Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };
 
	matrix = getPerspectiveTransform(src, dst);//获取透视变换矩阵
    //src为源图像四边形顶点坐标,dst为目标图像对应的四边形顶点坐标
	warpPerspective(img, imgWarp, matrix, Point(w, h));
    //参数分别为 输入图像,输出图像,透视变换矩阵,图像大小
 
	for (int i = 0; i < 4; i++)
	{
		circle(img, src[i], 10, Scalar(0, 0, 255), FILLED);
	}//在原图像中标记目标顶点
 
	imshow("Image", img);
	imshow("Image Warp", imgWarp);
 
	waitKey(0);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值