如何在QTableView(Qt和openCV)上存储图像

时间:2018-07-18 08:28:51

标签: c++ qt opencv qt5

我有一个GUI,该GUI由具有18列的QTableView和一个QGraphicsView组成,在其中使用按钮上传图像。我能够在感兴趣的区域(ROI)上绘制一个框,并在使用鼠标右键单击后立即打开一个小对话框。该对话框由具有两个页面的TabWidget组成。第一页有一个小的QGraphicsView,它带有在绘制上一个框时捕获的裁剪图像(例如Image A)。 TabWidget的第二页还具有另一个QGraphicsView,我可以使用它上载以前保存在桌面上的.jpg图像(例如图像B)。一旦我确定,该对话框上的信息将被传输到QTableView的第一行。图像A将存储在一个列中(精确到第17列),图像B也将存储在另一列中(精确地在第18列)。

我能够在QTableView中存储裁剪后的图像A(这是最困难的部分,因为我必须努力理解Qt和openCV之间的转换格式,反之亦然),而不是图像B(我处理起来很简单)我保存在桌面上的图片。

我尝试了其他选项:选项1:我创建了一个函数,用于处理在TabWidget第二页上上传的图像(图像B),选项2:< / strong>我尝试调试以缩小问题范围,并且似乎编译器没有看到我要存储的图像。

我要附加代码中最重要的部分,以解决此错误:

clipscene.h 中,我声明了我使用的最重要的变量和函数:

class clipScene : public QDialog
{
    Q_OBJECT
public:
    explicit clipScene(QWidget *parent = 0);
    ~clipScene();
    void setImage(QImage img);
    void setClassifiedImage(QImage img);
    SelectionData getData();
    void setData(SelectionData newdata);

private:
    SelectionData returnData;
    Ui::clipScene *ui;
    QImage simg;
    QImage featureClassified;
};

clipscene.cpp 中,这是我用来处理图片B的功能setClassifiedImage

 void clipScene::setClassifiedImage(QImage img)
    {
        featureClassified = img;
        QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(featureClassified));
        workingImageScene->addItem(item);
    }

使用setImage clipscene.cpp 中,我成功处理了裁剪图像的Qt和openCV转换

void clipScene::setImage(QImage img)
{
    simg = img;
    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(simg));
    scene->addItem(item);
    ui->graphicsViewClipped->show();
    cv::Mat input = cv::Mat(simg.height(), simg.width(), CV_16UC3, simg.bits(), simg.bytesPerLine());
    // .....operations...
    // .....operations...
}

clipscene.cpp 中,以下img1代表裁剪的图像A,而img2代表图像B(当前未存储或未存储均未通过)

void clipScene::on_acceptBtn_clicked()
{
    // .....operations...
    // This will save the cropped Image A successfully
    QPixmap img1;
    img1.convertFromImage(simg);
    QByteArray img1Array;
    QBuffer buffer1(&img1Array);
    buffer1.open(QIODevice::WriteOnly);
    img1.save(&buffer1, "PNG");
    returnData.mSave = img1Array;

    // This will save a different Image B
    // But here the compiler says that no arguments are being passed
    QPixmap img2;
    QByteArray img2Array;
    QBuffer buffer2(&img2Array);
    buffer2.open(QIODevice::WriteOnly);
    img2.save(&buffer2, "PNG");
    returnData.mClassImg = img2Array;
}

最后,当所有信息都传递并存储在QTableView上时,我可以双击QTableView的一行,而之前用于手动存储数据的对话框将弹出,其中记录了所有信息和两个图像(图像A和图片B)。 在 MainWindow (以及与错误相关的位置)上执行此操作的代码部分如下:

void MainWindow::onTableClick(const QModelIndex &index)
{
    int row = index.row();

    SelectionData currentData;
    currentData.mName = index.sibling(row, 1).data().toString();
    // ....additional data....
    // ....additional data...

    currentData.mSave = index.sibling(row, 17).data().toByteArray();
    currentData.mClassImg = index.sibling(row, 18).data().toByteArray();

    QPixmap iconPix;
    if(!iconPix.loadFromData(index.sibling(row, 17).data().toByteArray())) {
    }
    QPixmap iconPix2;
    if(!iconPix2.loadFromData(index.sibling(row, 18).data().toByteArray())) {
    }

    clipScene d(this);
    d.setData(currentData);
    d.setImage(iconPix.toImage());
    d.setClassifiedImage(iconPix2.toImage());

    // ....additional operations....
}

几天来我一直在努力解决这个问题,任何可以对此有所了解或提供解决方案的人都将是很棒的。

1 个答案:

答案 0 :(得分:0)

我不确定这是否仍然对您有用,但是由于我遇到了同样的问题,这可能会有所帮助。我认为您永远不会将图像传递到目标表。您是否正在加载图像?您是否曾经做过这样的事情:

clipscene.h

private:
    QList<QGraphicsPixmapItem*> leftClipPix;

clipscene.cpp

void clipScene::load_classifiedImageFromDb(QImage image)
{
    clasImg = image;
    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
    leftClipPix.append(item);
    workingImageScene->addItem(item);
    ui->yourgraphicsView->show();
    ui->yourgraphicsView->setSceneRect(QRectF(0, 0, image.width(), image.height()));
}

而且,正如您所说的,如果您尝试从桌面或数据库上传图像,那么执行以下操作可能会很有用:

void clipScene::load_classifiedImage()
{
    QString dir = QFileDialog::getOpenFileName(this, tr("Open image directory"), "", tr("Images (*.tif *.jpg *.png *.jpeg *.bmp *.gif *.tiff)"));
    QImage image;
    if(QString::compare(dir, QString()) != 0) {
        image = QImage(dir);
        QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
        leftClipPix.append(item);
        workingImageScene->addItem(item);
    }
    ui->yourgraphicsView->show();
    ui->yourgraphicsView->setSceneRect(QRectF(0, 0, image.width(), image.height()));
    clasImg = image;

}

并将load_classifiedImage()函数传递给QPushButton