关于GUI编程和OpenCV相关程序的问题

本人在做一个集合多个图像处理的程序,目前在初期,已经建立了一个图像增强功能的类,但是在GUI编程时遇到了问题。接下来描述两个主要问题:
首先是图像增强功能类HistogramEqualization() ,其中使用了OpenCV,在处理之后,使用了HighGui.imshow()和HighGui.waitKey(0)l来显示图片,具体用法如下:

    public Mat histEqualization(String path) {
        //以灰度图的形式读入
        Mat mat = Imgcodecs.imread(path, 0);
        HighGui.imshow("原图", mat);
        //定义直方图均衡化后的图像
        Mat mat_equalize = new Mat();
        //进行直方图均衡化
        Imgproc.equalizeHist(mat, mat_equalize);
        //显示处理后的图片
        HighGui.imshow("均衡化后的图像", mat_equalize);
        HighGui.waitKey(0);
        return mat_equalize;
    }

但是在主函数运行后,出现处理前后的图片,但waitKey()没有做出反应,点击任何按钮都没有反应,不会关闭窗口,并且手动关闭显示的两幅图片之后程序一直在运行状态,不知道应该如何停下来。
第二个问题出现在GUI编程中的按钮事件中,我设计了一个按钮,使得按下这个按钮就可以执行直方图均衡化的功能,事件定义如下:

        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ee) {
                //以下内容即调用直方图均衡化的功能类
                HistogramEqualization he = new HistogramEqualization();
                Mat mat = he.histEqualization("D:\\TEST_image\\Test.jpg");
                //将均衡化后的图像存入文件
                Imgcodecs.imwrite("D:\\IMG_result\\result.jpg", mat);
            }
        });

其中,在按下按钮后,本应该出现处理前后图像的两个窗口成为空白窗口,并且页面卡住,点击任何案件都没有效果,甚至关都关不上。本人没有系统学习过GUI编程,所以来问一下。

以下回答引用自chatGpt, 有用的话,请采纳哇,这对我很重要!!!
关于第一个问题,waitKey(0)表示无限等待用户按键响应,因此当你点击任何键盘按键时,程序会继续执行下去。如果你希望程序在显示完图片后就停下来,可以修改waitKey()函数的参数为一个大于0的整数,表示等待指定毫秒数后自动关闭窗口,例如waitKey(2000)表示等待2秒后自动关闭窗口。

关于第二个问题,可能是因为程序在主线程中进行了耗时的图像处理操作,导致页面卡住。为了解决这个问题,可以将直方图均衡化的操作放到新的线程中进行处理,这样可以避免阻塞主线程。具体可以参考以下代码示例:

btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ee) {
            // 在新线程中进行直方图均衡化操作
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //以下内容即调用直方图均衡化的功能类
                    HistogramEqualization he = new HistogramEqualization();
                    Mat mat = he.histEqualization("D:\\TEST_image\\Test.jpg");
                    //将均衡化后的图像存入文件
                    Imgcodecs.imwrite("D:\\IMG_result\\result.jpg", mat);
                }
            }).start();
        }
    });

这样,在点击按钮后,直方图均衡化的操作会在新线程中进行,不会影响主线程的运行,同时用户也可以正常使用页面。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^