Qt + opencv mat转换成qimage后无法使用qpainter显示

Qt下配置opencv已经成功,系统为win764位。使用的vs2010编译器。至于怎么配置好的,有其他的信息可以找到。或者改天给写出来。

为了显示图片,看有的人使用qlabel,这个就不必过多描述,除了能显示,并不能做别的事情。Qt下正儿八经显示的方法还是qpainter。这个是做绘图板用的,还可以在上面画很多的图像。QPainter加上QImage,是比较合理的组合。

问题就出来了。我用opencv读取一个视频,用>>导入到mat结构中,然后转换成QImage结构,在paintEvent中进行刷新显示。是可以的。其中关键的转换代码如下:

Mat temp,image;

temp = imread(“…”);

cvtColor(temp,image,CV_BGR2RGB);

img=QImage((unsignedchar*)(image.data),image.cols,image.rows,image.step,QImage::Format_RGB888);

 

这样是可以显示的,可是在imread后得到image就无法显示,输出窗口输出:

The program has unexpectedly finished.

报错界面为:

查看了每一个环节,转换后的img,通过QLabel是可以正常显示的。但是就是进入到paintEvent后就出现以上的问题。用各种高大上的搜索引擎也找不到问题出在哪里。

paintEvent()关键代码如下

painter.begin(this);

painter.drawImage(ui->frame_preview->x()+ui->centralWidget->x(),

                      ui->frame_preview->y()+ui->centralWidget->y(),

                      img);

painter.end();

并没有什么玄妙的地方。曾经一度怀疑人品问题。调试了一个上午就是卡到这里。

不过受到启发后,得到QImage类型其实可以自己读取图片,但是读取进来jpg格式是FORMAT_RGB32,不是原来的FORMAT_RGB888,这个可以转换一下。读进来之后就可以正常显示了,也可以在上面画各种图形。

问题没有真正得到解决,但是通过其他方法实现了目的。以后有方法解决再记录下来。

    img.load(fileInfo_jpg->at(index_jpg).filePath());

    img.convertToFormat(QImage::Format_RGB888);

以下是一个基于Qt插件机制和OpenCV库实现的图像缩放功能的示例代码: 首先,创建一个Qt插件项目,并将OpenCV库添加到项目中。 在插件类头文件中定义纯虚函数: ```c++ class ImageProcessorInterface { public: virtual ~ImageProcessorInterface() {} virtual void setImage(const QImage& image) = 0; virtual QImage processImage(double scaleFactor) = 0; }; ``` 在插件类实现文件中实现缩放功能: ```c++ #include "imageprocessorinterface.h" #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> class ImageProcessor : public QObject, public ImageProcessorInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "com.example.ImageProcessorInterface" FILE "imageprocessor.json") Q_INTERFACES(ImageProcessorInterface) public: void setImage(const QImage& image) override { m_image = image; } QImage processImage(double scaleFactor) override { cv::Mat mat = cv::Mat(m_image.height(), m_image.width(), CV_8UC4, const_cast<uchar*>(m_image.bits()), m_image.bytesPerLine()); cv::Mat resizedMat; cv::resize(mat, resizedMat, cv::Size(), scaleFactor, scaleFactor); QImage resultImage(resizedMat.data, resizedMat.cols, resizedMat.rows, static_cast<int>(resizedMat.step), QImage::Format_ARGB32); return resultImage; } private: QImage m_image; }; ``` 在主应用程序中加载插件并使用插件提供的函数进行图像缩放: ```c++ #include <QPluginLoader> #include <QPainter> #include "imageprocessorinterface.h" void MainWindow::onScaleImage(double scaleFactor) { if (m_imageProcessorPlugin) { ImageProcessorInterface* imageProcessor = qobject_cast<ImageProcessorInterface*>(m_imageProcessorPlugin->instance()); if (imageProcessor) { QImage processedImage = imageProcessor->processImage(scaleFactor); m_scaledImage = processedImage; update(); } } } void MainWindow::paintEvent(QPaintEvent* event) { QMainWindow::paintEvent(event); QPainter painter(this); painter.drawImage(QPoint(0, 0), m_scaledImage); } void MainWindow::loadImage(const QString& filePath) { QImage image(filePath); if (!image.isNull()) { m_originalImage = image; m_scaledImage = m_originalImage; if (m_imageProcessorPlugin) { ImageProcessorInterface* imageProcessor = qobject_cast<ImageProcessorInterface*>(m_imageProcessorPlugin->instance()); if (imageProcessor) { imageProcessor->setImage(m_originalImage); } } update(); } } void MainWindow::loadImageProcessor(const QString& filePath) { if (m_imageProcessorPlugin) { m_imageProcessorPlugin->unload(); } m_imageProcessorPlugin = new QPluginLoader(filePath, this); if (m_imageProcessorPlugin) { QObject* plugin = m_imageProcessorPlugin->instance(); if (plugin) { ImageProcessorInterface* imageProcessor = qobject_cast<ImageProcessorInterface*>(plugin); if (imageProcessor) { imageProcessor->setImage(m_originalImage); } } } } ``` 需要注意的是,插件的元数据应该定义在一个JSON文件中,例如imageprocessor.json: ```json { "IID": "com.example.ImageProcessorInterface", "MetaData": { "Keys": [ "ImageProcessor" ], "Values": [ "OpenCV Image Processor" ] } } ``` 以上代码仅为示例,实际实现中可能需要进行修改以适应具体应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值