【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 p[5];
int flag = 1;
int cnt = 0;
static void mouse_callback(int event, int x, int y, int, void *) {
    //当鼠标左键按下时,记录其坐标
    if(event == EVENT_LBUTTONDOWN) {
        p[cnt].x = x*1.0; p[cnt++].y = y*1.0;
        cout << "p" << cnt << " is recorded at " << p[cnt-1] << endl;
    }

    if(cnt==4) {
            cnt=0;
            //变换前图像四个点
            vector<Point2f>src(4);
            src[0] = p[0];
            src[1] = p[1];
            src[2] = p[2];
            src[3] = p[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;
}

 

posted @ 2018-03-16 20:48  GraceSkyer  阅读(2844)  评论(0编辑  收藏  举报

~~~~~~ACM大牛语录,激励一下~~~~~~

为了世界的和平,为了女生的安全,我拼命做题,做题,做题!

用最短的时间,刷最多的题!

给我一滴泪,我就看到了你全部的海洋!

seize the hour, seize the day.

人生难免有无奈,幸福走远了,或是感叹幸福来迟了.其实我一直相信,无论手中的幸福是多么微不足道的感觉,我会把握住那每一分,每一秒,当幸福依旧像那百鸟般飞逝,终究无法掌握时,我会感谢它,曾经降临过!

A自己的题,让别人郁闷去吧

WA肠中过,AC心中留 TLE耳边过,AC特别牛

天然的悲苦和伤逝,过去有过,以后还会有

^*^一步一步往上爬^*^

AC就像练级,比赛就像PK. 练级不如PK好玩

其实,世上本没有ACM,AC的人多了,也便有了!

AC无止尽~ Seek you forever~

找呀找呀找水题,找到一个AC一个呀!

AC是检验程序的唯一标准。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血……