OpenCV图像几何变换之透视变换

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下

1. 基本原理

透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为:

(u,v)为原始图像像素坐标,(x=x'/w',y=y'/w')为变换之后的图像像素坐标。透视变换矩阵图解如下:

仿射变换(Affine Transformation)可以理解为透视变换的特殊形式。透视变换的数学表达式为:

所以,给定透视变换对应的四对像素点坐标,即可求得透视变换矩阵;反之,给定透视变换矩阵,即可对图像或像素点坐标完成透视变换,如下图所示:

2. OpenCV透视变换函数

Mat getPerspectiveTransform(const Point2f* src, const Point2f* dst)
// Calculate a perspective transform from four pairs of the corresponding points.
// src – Coordinates of quadrangle vertices in the source image.
// dst – Coordinates of the corresponding quadrangle vertices in the destination image.

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
// Apply a perspective transform to an image.
// src – Source image.
// dst – Destination image that has the size dsize and the same type as src.
// M – 3*3 transformation matrix.
// dsize – Size of the destination image.
// flags – Combination of interpolation methods and the optional flag WARP_INVERSE_MAP that means that M is the inverse transformation (dstsrc).
// borderMode – Pixel extrapolation method. When borderMode=BORDER_TRANSPARENT, it means that the pixels in the destination image that corresponds to the “outliers” in the source image are not modified by the function.
// borderValue – Value used in case of a constant border. By default, it is 0.

3. 程序

#include <iostream>

#include "highgui.h"
#include "opencv2/imgproc/imgproc.hpp"

int main()
{
  // get original image.
  cv::Mat originalImage = cv::imread("road.png");

  // perspective image.
  cv::Mat perspectiveImage;

  // perspective transform
  cv::Point2f objectivePoints[4], imagePoints[4];

  // original image points.
  imagePoints[0].x = 10.0; imagePoints[0].y = 457.0;
  imagePoints[1].x = 395.0; imagePoints[1].y = 291.0;
  imagePoints[2].x = 624.0; imagePoints[2].y = 291.0;
  imagePoints[3].x = 1000.0; imagePoints[3].y = 457.0;

  // objective points of perspective image.
  // move up the perspective image : objectivePoints.y - value .
  // move left the perspective image : objectivePoints.x - value.
  double moveValueX = 0.0;
  double moveValueY = 0.0;

  objectivePoints[0].x = 46.0 + moveValueX; objectivePoints[0].y = 920.0 + moveValueY;
  objectivePoints[1].x = 46.0 + moveValueX; objectivePoints[1].y = 100.0 + moveValueY;
  objectivePoints[2].x = 600.0 + moveValueX; objectivePoints[2].y = 100.0 + moveValueY;
  objectivePoints[3].x = 600.0 + moveValueX; objectivePoints[3].y = 920.0 + moveValueY;

  cv::Mat transform = cv::getPerspectiveTransform(objectivePoints, imagePoints);

  // perspective.
  cv::warpPerspective(originalImage,
            perspectiveImage,
            transform,
            cv::Size(originalImage.rows, originalImage.cols),
            cv::INTER_LINEAR | cv::WARP_INVERSE_MAP);

  // cv::imshow("perspective image", perspectiveImage);
  // cvWaitKey(0);

  cv::imwrite("perspectiveImage.png", perspectiveImage);

  return 0;
}

原始图像及其透视变换结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Opencv-Python图像透视变换cv2.warpPerspective的示例

    Opencv-Python图像透视变换cv2.warpPerspective 代码如下: # -*- coding:utf-8 -*- import cv2 import numpy as np import sys img = cv2.imread('test.jpg') # cv2.imshow("original", img) # 可选,扩展图像,保证内容不超出可视范围 img = cv2.copyMakeBorder(img, 200, 200, 200, 200, cv2.B

  • python opencv实现任意角度的透视变换实例代码

    本文主要分享的是一则python+opencv实现任意角度的透视变换的实例,具体如下: # -*- coding:utf-8 -*- import cv2 import numpy as np def rad(x): return x * np.pi / 180 img = cv2.imread("6.jfif") cv2.imshow("original", img) # 扩展图像,保证内容不超出可视范围 img = cv2.copyMakeBorder(img,

  • Opencv实现对象提取与测量

    本文实例为大家分享了Opencv3实现对象提取与测量的具体代码,供大家参考,具体内容如下 案例背景:下图为一张卫星拍摄的图片,要获取其中岛屿的周长和面积 方案思路:高斯模糊去噪,灰度二值化提取轮廓,闭操作填充缝隙 或小的孔洞,寻找轮廓,通过轮廓特征选择轮廓 #include<opencv2\opencv.hpp> using namespace cv; using namespace std; int main(int arc, char** argv) { Mat src = imread(

  • Opencv透视变换综合实例详解

    本文实例为大家分享了Opencv透视变换综合实例的具体代码,供大家参考,具体内容如下 案例背景:对下面发生畸变的图像进行校正 方案思路:灰度二值化分割,闭操作,寻找轮廓,霍夫直线检测,直线排序,直线方程,直线交点,透视矩阵,透视变换. #include<opencv2\opencv.hpp> using namespace cv; using namespace std; int main(int arc, char** argv) { Mat src = imread("1.jpg

  • OpenCV图像几何变换之透视变换

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1. 基本原理 透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为: (u,v)为原始图像像素坐标,(x=x'/w',y=y'/w')为变换之后的图像像素坐标.透视变换矩阵图解如下: 仿射变换(Affine Transformation)可以理解为透视变换的特殊形式.透视变换的数学表达式为: 所以,给定透视变换对应的四对像素点坐标,即可求得透视变

  • OpenCV图像处理之七种常用图像几何变换

    0 程序环境与所学函数 本章程序运行需要导入下面三个库,并定义了一个显示图像的函数 所学函数 ##放大.缩小 cv.resize(img,dsize,[interpolation]) ##平移变换 M = np.array([[...]], dtype=np.float32) cv.warpAffine(img, M, dsize) ##镜像变换 cv.flip(img, 1) # 垂直镜像 cv.flip(img, 0) # 水平镜像 cv.flit(img, -1) # 水平垂直同时进行 #

  • OpenCV实现常见的四种图像几何变换

    目录 准备图片 1. 缩放 cv2.resize()方法 2. 翻转 cv2.flip()方法 3. 仿射变换 warpAffine()方法 3.1 平移 3.2 旋转 3.3 倾斜 4. 透视 准备图片 选择一张shape为(500,500,3)的梵高的<星月夜>以便示例. 1. 缩放 cv2.resize()方法 cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) src 原图(的数组) dsize:

  • opencv实现图像几何变换

    本文实例为大家分享了opencv实现图像几何变换的具体代码,供大家参考,具体内容如下 图像伸缩(cv2.resize) 图像的扩大与缩小有专门的一个函数,cv2.resize(),那么关于伸缩需要确定的就是缩放比例,可以是x与y方向相同倍数,也可以单独设置x与y的缩放比例.另外一个就是在缩放以后图像必然就会变化,这就又涉及到一个插值问题.那么这个函数中,缩放有几种不同的插值(interpolation)方法,在缩小时推荐cv2.INTER_ARER,扩大是推荐cv2.INTER_CUBIC和cv

  • OpenCV+Python几何变换的实现示例

    几何变换 图像的几何变换是指将一幅图像映射到另一幅图像内.有缩放.翻转.仿射变换.透视.重映射等操作. 1 缩放 使用cv2.resize()函数实现对图像的缩放,但要注意cv2.resize()函数内的dsize参数与原图像的行列属性是相反的,也就是:目标图像的行数是原始图像的列数,目标图像的列数是原始图像的行数. 下面举例说明cv2.resize()函数的用法: import cv2 img=cv2.imread('E:/python_opencv/tupian.jpg') rows,col

  • Python OpenCV超详细讲解透视变换的实现

    目录 准备工作 场景描述 透视变换 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库,import numpy并且重命名为np. 我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片.OK,下面开始本节的学习吧. 场景描述 给定任意一张图像,从中分割出你需要的区域,并且以指定的大小显示出来.而且分割出的图像在线性空间中还是与显示的窗口是平行的.就

  • Java OpenCV图像处理之仿射变换,透视变换,旋转详解

    目录 1 仿射变换 2 透视变换 3 图像旋转 1 仿射变换 仿射变换:一种二维坐标到二维坐标的线性变换,它保持二维图像的平直性与平行性,即变换后直线依然是直线,平行的线依然平行. package com.xu.opencv.image; import java.io.File; import java.util.ArrayList; import java.util.List; import org.opencv.core.Mat; import org.opencv.core.MatOfPo

  • Python实现图像几何变换

    本文实例讲述了Python实现图像几何变换的方法.分享给大家供大家参考.具体实现方法如下: import Image try: im=Image.open('test.jpg') #out = im.resize((128, 128)) #改变大小 #out = im.rotate(45) #45°旋转 #out = im.transpose(Image.FLIP_LEFT_RIGHT) #水平翻转 #out = im.transpose(Image.FLIP_TOP_BOTTOM) #垂直翻转

  • python opencv 图像尺寸变换方法

    利用Python OpenCV中的 cv.Resize(源,目标,变换方法)就可以实现变换为想要的尺寸了 源文件:就不用说了 目标:你可以对图像进行倍数的放大和缩小 也可以直接的输入尺寸大小 变换的方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹出现.当图像放大时,类似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方插值

  • python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)

    图像边框的实现 图像边框设计的主要函数 cv.copyMakeBorder()--实现边框填充 主要参数如下: 参数一:源图像--如:读取的img 参数二--参数五分别是:上下左右边的宽度--单位:像素 参数六:边框类型: cv.BORDER_CONSTANT--cv.BORDER_REPLICATE--cv.BORDER_REFLECT--cv.BORDER_WRAP--cv.BORDER_REFLECT_101--cv.BORDER_TRANSPARENT--cv.BORDER_REFLEC

随机推荐