图像处理opencv单应矩阵代码鼠标响应函数没有反应

鼠标响应函数没有反应,函数中的图像展示也没有弹出窗口
导致findHomography没有输入
(代码是从网上找的,自己根据理解改了一下,可能在函数调动规范的地方有些没理解透)

#include <iostream>
#include <opencv2/opencv.hpp>
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <Eigen/Dense>
using namespace cv;
using namespace std;
using namespace Eigen;
struct userdata
{
    Mat im;
    vector<Point2f> points;
};
void Mouse_press(int event, int x, int y, int flag, void *data_ptr);
int main()
{
    Mat image_logo;
    userdata image_main;
    image_logo = imread("/home/wgd/opencv_test/love.jpg");
    image_main.im = imread("/home/wgd/opencv_test/main.jpg");
    vector<Point2f> left_image;
    left_image.push_back(Point2f(0, 0));
    left_image.push_back(Point2f(0, image_logo.rows));
    left_image.push_back(Point2f(image_logo.cols, image_logo.rows));
    left_image.push_back(Point2f(image_logo.cols, 0));
    /*


    */
    setMouseCallback("Display", Mouse_press, (void *)&image_main);
    /*


    */
    Mat H = findHomography(left_image, image_main.points);
    cout << H << endl;
    Mat logoWarped;
    warpPerspective(image_logo, logoWarped, H, image_main.im.size());
    // showFinal(image_main, logoWarped);
    imshow("Result", logoWarped);
    waitKey(0);
    system("pause");

    return 0;
}
void Mouse_press(int event, int x, int y, int flag, void *data_ptr)
{

    if (event == EVENT_LBUTTONDOWN)
    {
        userdata *data = ((userdata *)data_ptr);

        circle(data->im, Point(x, y), 3, Scalar(0, 0, 255), 5, CV_AA); //用圆圈标记出鼠标选点击的每一个点
        imshow("Image", data->im);
        waitKey(0);
        if (data->points.size() < 4)
        {
            data->points.push_back(Point2f(x, y)); //将鼠标选出的每一个点按照选取顺序push_back保存
        }
    }
}

函数中data应该用类定义,否则每次鼠标循环会清除data.points的内容