【OpenCV】透视变换矫正

演示结果参考

功能实现:运行程序,会显示图片的尺寸,按回车键后,依次点击需矫正的图片的左上、右上、左下、右下角,结果弹出矫正后的图片,如图上的PIC2对话框。按下字符‘q‘后退出。

代码如下:(注:图中的11.jpg图片自己选取放到该程序目录下。)

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
const int N = 400;
const int M = 220;
Mat img;
Point p1[5];
int flag = 1;
int cnt = 0;
static void mouse_callback(int event, int x, int y, int, void *) {
    //当鼠标左键按下时,记录其坐标
    if(event == EVENT_LBUTTONDOWN) {
        p1[cnt].x = x*1.0; p1[cnt].y = y*1.0;
        cout << "p1 is recorded at " << p1[cnt++] << endl;
    }

    if(cnt==4) {
            cnt=0;
            //变换前图像四个点
            vector<Point2f>src(4);
            src[0] = p1[0];
            src[1] = p1[1];
            src[2] = p1[2];
            src[3] = p1[3];
            //变换后
            vector<Point2f>dst(4);
            dst[0] = Point2f(0, 0);//左上
            dst[1] = Point2f(N, 0);//右上
            dst[2] = Point2f(0, M);//左下
            dst[3] = Point2f(N, M);//右下
            //获取透视变换矩阵

            Mat m = getPerspectiveTransform(src, dst);
            Mat res;

            warpPerspective(img, res, m, Size(N, M),INTER_LINEAR);//实现图像透视变换
            namedWindow("PIC2",1);
            imshow("PIC2", res);
            waitKey(0);
        }    

}
int main() {
    img = imread("11.jpg");
    if(!img.data) {cout<<"read image file wrong!"<<endl; getchar(); return 0;}
    cout << "height = " << img.size().height << ",width = " << img.size().width << endl;
    getchar();

    namedWindow("PIC");
    imshow("PIC", img);

    setMouseCallback("PIC", mouse_callback);//设置鼠标事件回调函数

    while(char(waitKey(1)) != ‘q‘) {}

    return 0;
}

原文地址:https://www.cnblogs.com/GraceSkyer/p/8585105.html

时间: 2024-11-07 04:04:18

【OpenCV】透视变换矫正的相关文章

Java基于opencv—透视变换矫正图像

很多时候我们拍摄的照片都会产生一点畸变的,就像下面的这张图 虽然不是很明显,但还是有一点畸变的,而我们要做的就是把它变成下面的这张图 效果看起来并不是很好,主要是四个顶点找的不准确,会有一些偏差,而且矫正后产生的目标图是倒着的,哪位好心人给说说为啥 因为我也没有测试畸变很大的图像,也不能保证方法适用于每个图像,这里仅提供我的思路供大家参考. 思路: 我们最重要的就是找到图像的四个顶点,有利用hough直线,求直线交点确定四个顶点,有采用寻找轮廓确定四个顶点等等:今天我提供的思路,也是采用寻找轮廓

opencv透视变换

opencv透视变换 实现透视变换 目标: 在这篇教程中你将学到: 1.如何进行透视变化 2.如何生存透视变换矩阵 理论: 什么是透视变换: 1.透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping). 2.换算公式 u,v是原始图片左边,对应得到变换后的图片坐标x,y,其中.变换矩阵可以拆成4部分,表示线性变换,比如scaling,shearing和ratotion.用于

OpenCV 透视变换实例

参考文献: http://www.cnblogs.com/self-control/archive/2013/01/18/2867022.html http://opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/ 透视变换: http://blog.csdn.net/xiaowei_cqu/article/details/26478135 具体流程为: a)载入图像→灰度化→边

opencv透视变换GetPerspectiveTransform的总结

对于透视变换,必须为map_matrix分配一个3x3数组,除了3x3矩阵和三个控点变为四个控点外,透视变化在其他方面与仿射变换完全类似.具体可以参考:点击打开链接 主要用到两个函数WarpPerspective和GetPerspectiveTransform. 1)WarpPerspective 对图像进行透视变换 void cvWarpPerspective( const CvArr* src, CvArr* dst,const CvMat* map_matrix, int flags=CV

opencv计算两个轮廓之间hu矩相似程度,MatchShapes

https://blog.csdn.net/jiake_yang/article/details/52589063 [OpenCV3.3]通过透视变换矫正变形图像 https://blog.csdn.net/rrrfff/article/details/77340641 OPENCV提供了输入图像直接进行hu矩匹配的函数,返回的是两个图像或轮廓之间hu矩的相似度: double cvMatchShapes(const void*object1,const void*object2,int met

网友提问(透视变化)

您好: 我在网上看到您的opencv透视变换的博客,https://www.cnblogs.com/jsxyhelu/p/4219564.html, 我是opencv小菜鸟一个,现在想要得到一个图片变形之后保存,整个图片信息不丢失,即四个角的信息不丢失应该怎么做?原图中某一点在新图中坐标应该怎么计算?万望不吝赐教,不胜感激,万分感谢. 你好: 我按照您的代码和网上找到的python代码(https://blog.csdn.net/fengxueniu/article/details/779643

OpenCV】透视变换 Perspective Transformation(续)

载分 [OpenCV]透视变换 Perspective Transformation(续) 分类: [图像处理] [编程语言] 2014-05-27 09:39 2776人阅读 评论(13) 收藏 举报 透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: [cpp] view plaincopyprint? Mat getPerspectiveTransform(c

【OpenCV】透视变换 Perspective Transformation(续)

透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[]) 输入原始图像和变换之后的图像的对应4个点,便可以得到变换矩阵.之后用求解得到的矩阵输入perspectiveTransform便可以对一组点进行变换: void perspec

OpenCV文本图像的旋转矫正

用户在使用Android手机拍摄过程中难免会出现文本图像存在旋转角度.这里采用霍夫变换.边缘检测等数字图像处理算法检测图像的旋转角度,并根据计算结果对输入图像进行旋转矫正. 首先定义一个结构元素,再通过该结构元素对该图像进行开运算和闭运算(即腐蚀膨胀运算). Imgproc.cvtColor(matOri, matGray, Imgproc.COLOR_RGB2GRAY); Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_R