【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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM