Отобразить изображение в QGraphicsview, похожее на изображения c в matlab - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть CSV-файл (128 столбцов и 2815 строк), где значения варьируются от 0 до 1. Я хочу отобразить его в виде серого масштабированного изображения. Что мне делать? В matlab я могу просто прочитать файл csv и вызвать функцию images c и установить цветовую карту на серый, чтобы отобразить ее как изображение в оттенках серого, и аналогично это можно сделать в Opencv. В Qt, что я должен сделать, чтобы отобразить его в Qgraphicsview. Я новичок в Qt, может кто-нибудь описать это в простейшей форме.

Вот код, который я пытался реализовать.

imshow("image", ImageOutf);
 QImage imageObject3(ImageOutf.data, ImageOutf.cols, ImageOutf.rows, ImageOutf.step, QImage::Format_Grayscale16);
     scene1 = new QGraphicsScene(this);
     image = QPixmap::fromImage(imageObject3);
     scene1->addPixmap(QPixmap::fromImage(imageObject3));
     ui->graphicsView->setScene(scene1);
     ui->graphicsView->setBackgroundBrush(QBrush(QColor(16,16,16), Qt::SolidPattern));
     ui->graphicsView->fitInView((scene1->itemsBoundingRect()));

"ImageOutf" - это объект cv Mat, который имеет 128 столбцы и 2815 строк. Я прилагаю скриншот результатов, которые я получаю. Я не получаю то же изображение. Может кто-нибудь объяснить, почему это отличается. enter image description here

** Примечание: мой необработанный файл является CSV-файл. Сначала я преобразовал его в вектор вектора или матрицы, затем в матрицу в opencv mat, затем в mat в QImage, а затем попытался отобразить qimage. Я отправляю коды ниже:

1) CSV в Matrix

using vec = vector<float>;
using matrix = vector<vec>;

matrix readCSV(string filename)
{
matrix M;

ifstream in(filename);
string line;
while (getline(in, line))                   // read a whole line of the file
{
    stringstream ss(line);                     // put it in a stringstream (internal stream)
    vec row;
    string data;
    while (getline(ss, data, ','))           // read (string) items up to a comma
    {
        row.push_back(stof(data));           
    }
    if (row.size() > 0) M.push_back(row);    // add non-empty rows to matrix
}
return M;

}

2) Matrix to Mat

Mat matrixtoMAT(const matrix& M, int R, int C)
Mat Img_Data;
Img_Data = Mat::zeros(R, C, CV_32FC1);
for (int i = 0; i < M.size(); i++)
{
    for (int j = 0; j < M[i].size(); j++)
    {
        Img_Data.at<float>(i, j) = M[i][j];
    }
}
return Img_Data;

}

3) Мат для QImage

QImage imageObject3(ImageOutf.data, ImageOutf.cols, ImageOutf.rows,ImageOutf.step, QImage::Format_Indexed8);

1 Ответ

0 голосов
/ 21 февраля 2020

Я не знаком с imagesc, но из того, что вы говорите, это в основном цветная карта. Не имеет значения, является ли это Matlab или Qt, или OpenCV, или чем-то еще - вам просто нужно создать изображение с заданными размерами (в вашем случае 128x2815) и отрендерить его.

Как отобразить QImage в QGraphicsScene (обратите внимание, что QGraphicsView - это просто окно просмотра, которое отображает видимую область QGraphicsScene; вы можете иметь несколько представлений для одной и той же сцены), имеется множество ресурсов ( пример ). Что касается того, как создать QImage - официальную документацию , в которой рассказывается, как это сделать. Обратите внимание, что так же, как в OpenCV et c. у вас есть одномерный массив для данных. Вот почему задание размеров так важно, чтобы Qt знал, как распределить одномерные данные в двух измерениях в виде значений пикселей. Если вы ищете отображение значений от 0 до 1 и от 0 до 255 - это относительно простая математическая задача. ;)

...