Когда я запускаю свою программу и хочу загрузить в нее изображение, появляется окно выбора изображения, но вскоре после сбоя программы я получаю сообщение об ошибке: ## Заголовок ##
Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Failed to load /usr/share/icons/Yaru/16x16/status/image-missing.png: Fatal error reading PNG image file: Invalid IHDR data (gdk-pixbuf-error-quark, 0)
Bail out! Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Failed to load /usr/share/icons/Yaru/16x16/status/image-missing.png: Fatal error reading PNG image file: Invalid IHDR data (gdk-pixbuf-error-quark, 0)
Aborted
Я пытался добавить unset GDK_PIXBUF_MODULEDIR
и unset GDK_PIXBUF_MODULE_FILE
к .bashrc
, и это работало примерно 7 запусков программы, когда ошибка появилась снова. Потом я попробовал бежать sudo update-mime-database /usr/share/mime
но ничего не изменилось. Кто-то упомянул, что запуск в режиме sudo
решил проблему, но мне ничего не помогло. Хуже всего то, что иногда программа работает нормально. Я запускаю его несколько раз подряд, но ошибка не проявляется.
Редактировать:
У меня есть простой графический интерфейс, созданный на Qt, с кнопкой и QGraphicsView, и вот фрагменты кода, которые могут быть полезны.
Главное окно:
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <iostream>
#include <QFileDialog>
#include <QMessageBox>
#include <QWidget>
#include <QTableWidget>
#include <QString>
#include <QCloseEvent>
#include "colorfilter.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setFixedSize(800, 600);
ui->wHidden->hide();
connect(ui->pbUploadImage, &QPushButton::clicked, this, &MainWindow::uploadImage);
connect(ui->pbShowLayer, &QPushButton::clicked, this, &MainWindow::exposeLayer);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::uploadImage()
{
if (ui->imgView->scene())
ui->imgView->scene()->clear();
this->m_fName = QFileDialog::getOpenFileName(this, tr("Open Image"), "/home", tr("Image Files (*.png *.jpg *.bmp)"));
if (this->m_fName.isEmpty())
return;
QPixmap pMap(this->m_fName);
if (! ui->imgView->scene()) {
qDebug() << "No Scene!";
QGraphicsScene *scene = new QGraphicsScene(this);
ui->imgView->setScene(scene);
}
ui->imgView->scene()->addPixmap(pMap);
std::cout << m_fName .toStdString()<< std::endl;
}
void MainWindow::exposeLayer()
{
if (this->m_fName.size() == 0){
MainWindow::showMessage(this, "Please sellect an image first");
return;
}
ColorFilter::Layer layer = ColorFilter::toLayer(ui->cbColor->currentText());
auto cf = new ColorFilter(this->m_fName, layer);
std::vector<QImage> images = cf->getImages();
ui->wHidden->setVisible(true);
QPixmap pMap(QPixmap::fromImage(images[0]));
if (!ui->imgView->scene()){
qDebug() << "No Scene!";
QGraphicsScene *scene = new QGraphicsScene(this);
ui->imgView->setScene(scene);
}
ui->imgView->scene()->addPixmap(pMap);
}
void MainWindow::closeEvent(QCloseEvent *event)
{
for(auto w : this->openedWindows)
w->close();
event->accept();
}
void MainWindow::showMessage(QWidget *parent, QString message)
{
QMessageBox *noData = new QMessageBox(parent);
noData->setText(message);
noData->show();
}
цветной фильтр:
#include "colorfilter.h"
#include <iostream>
#include <vector>
#include <QString>
#include <QDebug>
#include <QWidget>
#include <QLabel>
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
ColorFilter::ColorFilter(QString &fName, ColorFilter::Layer layer):
m_fName{fName}, m_layer{layer}
{}
std::vector<QImage> ColorFilter::getImages()
{
cv::Mat image = cv::imread(this->m_fName.toStdString(), cv::IMREAD_COLOR);
if (image.empty())
qDebug() << "No image";
std::vector<cv::Mat> newImages;
if (this->m_layer == ColorFilter::Layer::SUPER)
newImages = this->superImage(image);
// else if (this->m_layer == ColorFilter::Layer::RED)
// newImages = this->superImage()
std::vector<QImage> result;
for(auto &im : newImages)
result.push_back(this->cvMatToQImage(im));
return result;
}
ColorFilter::Layer ColorFilter::toLayer(const QString &layer)
{
std::unordered_map<QString, Layer> toLayer = {
{"red", ColorFilter::Layer::RED},
{"blue", ColorFilter::Layer::BLUE},
{"green", ColorFilter::Layer::GREEN},
{"superimposed", ColorFilter::Layer::SUPER}
};
auto it = toLayer.find(layer);
if (it != toLayer.end())
return it->second;
return ColorFilter::Layer::UNDEFINED;
}
std::vector<cv::Mat> ColorFilter::superImage(const cv::Mat &image)
{
std::vector<cv::Mat> alteredImages;
cv::Mat tmp;
for(int i = 0; i < 8; i++){
tmp = image.clone();
for(int n = 0; n < tmp.rows; n++)
{
cv::Vec3b *row = tmp.ptr<cv::Vec3b>(n);
for(int m = 0; m < tmp.cols; m++){
cv::Vec3b &pixel = row[m];
// pixel[i] is uchar to represent values between 0 and 255
tmp.ptr<cv::Vec3b>(n)[m][0] = (uchar)(((((int)pixel[0]) >> i) & 1)*255);
tmp.ptr<cv::Vec3b>(n)[m][1] = (uchar)(((((int)pixel[1]) >> i) & 1)*255);
tmp.ptr<cv::Vec3b>(n)[m][2] = (uchar)(((((int)pixel[2]) >> i) & 1)*255);
}
}
alteredImages.push_back(tmp);
}
return alteredImages;
}
QImage ColorFilter::cvMatToQImage(const cv::Mat &image)
{
if (image.type() == CV_8UC1) {
// Grayscale image
return QImage(image.data, image.cols, image.rows, image.step, QImage::Format_Grayscale8);
} else if (image.type() == CV_8UC3) {
// 3-channel color image (BGR format)
// cv stores images in BGR format, but QImage expects RGB, that's why it it swapped
return QImage(image.data, image.cols, image.rows, image.step, QImage::Format_RGB888).rgbSwapped();
} else {
qDebug() << "Unsupported cv::Mat format for QImage conversion";
return QImage();
}
}
Я видел ваше редактирование. Я предлагаю вам создать пример программы, воспроизводящей вашу проблему, но минимальной (минимальное количество для воспроизведения). В большинстве случаев решение находится при создании этого примера кода. Если вы все еще не нашли решение, вы можете опубликовать здесь свой минимальный пример, чтобы другие могли попробовать его дома. На данный момент мы не можем опробовать ваш код.
Просто наличие строки cv::Mat image = cv::imread(this->m_fName.toStdString(), cv::IMREAD_COLOR);
вызывает ошибку, я даже не вызываю содержащую ее функцию. Может ли это быть связано с библиотекой opencv?
Я бы посоветовал вам удалить «Решено» из заголовка, ответить на свой вопрос и принять его. Что касается вашего второго вопроса, я бы предложил опубликовать новый вопрос об этой конкретной проблеме. У вас будет больше шансов получить ответ.
Если с Конаном возникла конкретная проблема, лучше всего сообщить об этом по адресу github.com/conan-io/conan/issues, чтобы получить официальную поддержку от сопровождающих.
Это вопрос-ответ, возможно, вы захотите отправиться на экскурсию. Пожалуйста, не добавляйте «Решено» к заголовку и решению в текст вопроса. Если у вас есть ответ на ваш вопрос, опубликуйте его как ответ. Я откатил ваше последнее редактирование, так как это не относится к вопросу.
Проблема была в установке библиотеки opencv, после установки вручную ошибки ali исчезли.
Не могли бы вы привести минимальный и воспроизводимый пример?