当前位置:   article > 正文

OpenCV(十二):图像透视变换_图片怎么透视变换矩阵

图片怎么透视变换矩阵

目录

1.透视变换介绍

2.计算透视变换矩阵getPerspectiveTransform()

3.透视变换函数warpPerspective()

4.demo


1.透视变换介绍

透视变换是一种将原始图像映射到目标图像平面上的投影变换,又称为四点变换。

透视变换矩阵的一般形式如下所示:

| A B C |

| D E F |

| G H I |

通过透视变换矩阵来实现,以下是透视变换的数学公式:

对于原始图像中的点 P(x, y),经过透视变换后得到的新坐标 P'(x', y') 可以通过以下公式计算:

x' = (A * x + B * y + C) / (G * x + H * y + I)

y' = (D * x + E * y + F) / (G * x + H * y + I)

其中,(x, y) 是原始图像中点的坐标,(x', y') 是透视变换后点的新坐标。

矩阵元素 A、B、C、D、E、F、G、H 和 I 是透视变换矩阵的元素,它们决定了透视变换的具体变换方式。

2.计算透视变换矩阵getPerspectiveTransform()

CV_EXPORTS_W Mat getPerspectiveTransform(InputArray src, 

InputArray dst, 

int solveMethod = DECOMP_LU

);

  • src[]:原图像中的四个像素坐标。
  • dstl]:目标图像中的三个像素坐标。
  • solveMethod:计算透视变换矩阵方法的选择标志。

其中计算方法标志:

3.透视变换函数warpPerspective()

通过将透视变换矩阵应用于原始图像,可以获得投影后的图像。

CV_EXPORTS_W void warpPerspective( InputArray src,

OutputArray dst,

InputArray M,

Size dsize,

int flags = INTER_LINEAR,

int borderMode = BORDER_CONSTANT,

const Scalar& borderValue = Scalar());

  • src:输入图像
  • dst:透视变换后输出图像,与src数据类型相同,但是尺寸与dsize相同
  • M:3X3的变换矩阵。
  • dsize:输出图像的尺寸。
  • flags:插值方法标志。
  • borderMode:像素边界外推方法的标志
  • borderValue:填充边界使用的数值,默认情况下为0

4.demo

 

            (原图)                              (透视变换处理后的图片)

  1. #include <jni.h>
  2. #include <string>
  3. #include <android/bitmap.h>
  4. #include <opencv2/opencv.hpp>
  5. #include <iostream>
  6. using namespace cv;
  7. using namespace std;
  8. extern "C"
  9. JNIEXPORT void JNICALL
  10. Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jclass clazz,
  11. jobject bitmap) {
  12. AndroidBitmapInfo info;
  13. void *pixels;
  14. CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);
  15. //判断图片是位图格式有RGB_565 、RGBA_8888
  16. CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
  17. info.format == ANDROID_BITMAP_FORMAT_RGB_565);
  18. CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);
  19. CV_Assert(pixels);
  20. //将bitmap转化为Mat类
  21. Mat image(info.height, info.width, CV_8UC4, pixels);
  22. // 输入图像的四个角点
  23. Point2f src[4];
  24. src[0] = Point2f(0, 0); // 左上角
  25. src[1] = Point2f(image.cols, 0); // 右上角
  26. src[2] = Point2f(image.cols, image.rows); // 右下角
  27. src[3] = Point2f(0, image.rows); // 左下角
  28. // 输出图像的四个角点
  29. Point2f dst[4];
  30. dst[0] = Point2f(image.cols * 0.2, image.rows * 0.2); // 输出图像左上角
  31. dst[1] = Point2f(image.cols * 0.8, image.rows * 0.2); // 输出图像右上角
  32. dst[2] = Point2f(image.cols * 0.8, image.rows * 0.8); // 输出图像右下角
  33. dst[3] = Point2f(image.cols * 0.2, image.rows * 0.8); // 输出图像左下角
  34. // 计算透视变换矩阵
  35. Mat perspectiveMatrix = getPerspectiveTransform(src, dst);
  36. Mat outputImage;
  37. // 执行透视变换
  38. warpPerspective(image, outputImage, perspectiveMatrix, image.size());
  39. imwrite("/sdcard/DCIM/outputImage.jpg",outputImage);
  40. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/153359
推荐阅读
相关标签
  

闽ICP备14008679号