[opencv]利用鼠标事件选取坐标进行透视变换矫正图像

本文介绍使用OpenCV库实现图像的透视变换矫正过程。通过鼠标选择图像上的四个点,然后应用透视变换,将图像从扭曲的角度校正为正面视图。代码详细展示了如何设置鼠标回调函数来捕获点击事件,并使用getPerspectiveTransform和warpPerspective函数完成变换。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "time.h"

#define CLOCKS_PER_SEC ((clock_t)1000)
using namespace cv;
using namespace std;


//鼠标事件声明
void onMouse(int event,int x,int y,int flags,void *utsc);
Point2f srcTri[4],dstTri[4];
int clickTimes=0;  //在图像上单击次数
Mat image;
Mat imageWarp;

int main(int argc,char *argv[])
{
    clock_t start_time, end_time;
    start_time = clock();

    image=imread("/home/leoxae/KeekoRobot/TestPic/编程贴纸/bc01.jpg");
    imshow("Source Image",image);
    //回调函数:鼠标事件
    setMouseCallback("Source Image",onMouse);
    waitKey(0);

    end_time = clock();
    cout << "运行时间==" << ((end_time - start_time) / CLOCKS_PER_SEC) << "ms" << endl;

    return 0;
}


/**
 * 鼠标事件:点选四边形坐标 进行透视变换人工矫正
 * @param event
 * @param x
 * @param y
 * @param flags
 * @param utsc
 */
void onMouse(int event,int x,int y,int flags,void *utsc)
{
    if(event == EVENT_LBUTTONUP)   //响应鼠标左键抬起事件
    {
        circle(image,Point(x,y),2.5,Scalar(0,0,255),2.5);  //标记选中点
        imshow("Source Image",image);
        srcTri[clickTimes].x=x;
        srcTri[clickTimes].y=y;
        clickTimes++;
    }

    if(clickTimes == 4)
    {
        dstTri[0].x = 0;
        dstTri[0].y = 0;
        dstTri[1].x = image.rows-1;
        dstTri[1].y = 0;
        dstTri[2].x = 0;
        dstTri[2].y = image.cols-161;
        dstTri[3].x = image.rows-1;
        dstTri[3].y = image.cols-161;
        Mat transform = Mat::zeros(3,3,CV_32FC1); //透视变换矩阵
        transform = getPerspectiveTransform(srcTri, dstTri);  //获取透视变换矩阵
        warpPerspective(image, imageWarp, transform, Size(image.rows,image.cols-160));  //透视变换
        imshow("After WarpPerspecttive",imageWarp);
    }
}

效果图如下:

 

转载于:https://www.cnblogs.com/lx17746071609/p/11103078.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值