OpenCV【2】---读取png图片显示到QT label上的问题

博客讨论了使用OpenCV读取PNG图片并在QT界面显示时遇到的问题,主要涉及图片尺寸为256x256时出现边框和透明度处理。通过分析发现,问题可能与PNG的alpha通道有关,尽管OpenCV支持alpha通道,但在转换到QImage时出现问题。尝试了不同解决方案,包括检查和修改图片的alpha通道值,但未能彻底解决问题。最后,博主计划进一步研究这个问题。
摘要由CSDN通过智能技术生成

问题一:

  操作图片test.png是一个365x365的PNG图片

这里写图片描述

  通过OpenCV自带的GUI显示出来图像是没问题的,如下操作代码所示:

    QStringfileName=QFileDialog::getOpenFileName(this,
                tr("OpenImage"),".",
                tr("ImageFiles(*.png*.jpg*.jpeg*.bmp)"));
    if(fileName.length()<=0)return;
    //imread的第二个参数:读取4通道的png图像。其中第四个通道的数据类型和其他通道的一样,都是uchar型,完全透明为0,否则为255
    image=cv::imread(fileName.toUtf8().data());
    QString status = QString::number(image.rows)+"x"+QString::number(image.cols);
    ui->label_2->setText(status);
    //OpenCV显示出来
    cv::namedWindow("OriginalImage");
    cv::imshow("OriginalImage",
要实现一个裁剪图片的软件,可以使用QtOpenCV库来处理图像,使用Visual Studio作为开发工具。以下是一些基本步骤: 1. 创建一个Qt桌面应用程序工程,并添加OpenCV库文件。 2. 在Qt的界面设计师中创建一个窗口,并添加一个按钮和一个显示图片的标签控件。 3. 在按钮的槽函数中,使用OpenCV加载图片文件,并在标签控件中显示出来。 4. 实现鼠标事件处理函数,当用户在标签控件上进行鼠标操作时,记录下鼠标的位置信息。 5. 当用户松开鼠标时,根据鼠标的位置信息计算出裁剪区域,并使用OpenCV图片进行裁剪。 6. 将裁剪后的图片显示在标签控件中,或者保存到本地文件中。 代码示例: ```c++ // 引入OpenCV库 #include <opencv2/opencv.hpp> #include <QLabel> #include <QMouseEvent> #include <QFileDialog> using namespace cv; // 声明一个Mat对象用于存储图片 Mat srcImage; // 声明一个标签控件用于显示图片 QLabel* imageLabel; // 声明一个鼠标位置变量 Point startPoint, endPoint; // 加载图片 void loadImg() { // 打开文件对话框选择图片文件 QString fileName = QFileDialog::getOpenFileName(nullptr, "Open Image", ".", "Image Files(*.png *.jpg *.bmp)"); // 如果用户未选择文件,直接返回 if (fileName.isEmpty()) { return; } // 读取图片文件 srcImage = imread(fileName.toStdString()); // 如果读取失败,直接返回 if (srcImage.empty()) { return; } // 将Mat对象转换成Qt的图像对象 QImage img = QImage((const unsigned char*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888).rgbSwapped(); // 显示图片 imageLabel->setPixmap(QPixmap::fromImage(img)); } // 鼠标按下事件处理函数 void mousePressEvent(QMouseEvent* event) { startPoint = event->pos(); } // 鼠标松开事件处理函数 void mouseReleaseEvent(QMouseEvent* event) { endPoint = event->pos(); // 计算裁剪区域 int x = std::min(startPoint.x(), endPoint.x()); int y = std::min(startPoint.y(), endPoint.y()); int width = std::abs(startPoint.x() - endPoint.x()); int height = std::abs(startPoint.y() - endPoint.y()); // 裁剪图片 Mat dstImage = srcImage(Rect(x, y, width, height)); // 将Mat对象转换成Qt的图像对象 QImage img = QImage((const unsigned char*)(dstImage.data), dstImage.cols, dstImage.rows, QImage::Format_RGB888).rgbSwapped(); // 显示裁剪后的图片 imageLabel->setPixmap(QPixmap::fromImage(img)); } int main(int argc, char *argv[]) { // 初始化Qt应用程序 QApplication app(argc, argv); // 创建一个窗口 QWidget* window = new QWidget(); // 创建一个按钮 QPushButton* loadButton = new QPushButton("Load Image", window); // 创建一个标签控件 imageLabel = new QLabel(window); // 设置标签控件的大小和位置 imageLabel->setGeometry(10, 50, 780, 520); // 连接按钮的点击事件到loadImg函数 connect(loadButton, &QPushButton::clicked, loadImg); // 显示窗口 window->show(); // 运行Qt应用程序 return app.exec(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值