Partage
  • Partager sur Facebook
  • Partager sur Twitter

QT. tableau 1d en QImage

    11 juin 2021 à 18:45:00

    Bonjour tout le monde,

    J'ai besoin d'un petit coup de pouce sur un problème avec QT . J'essaye d'afficher une image(8288 *5644) 16 bits en niveau de gris sur un QLabel. Cette image est stocké dans un tableau dynamique 1d d'entiers. 

    Voici les code:

    GlobalStruct.h

    #ifndef GLOBALSTRUCT_H
    #define GLOBALSTRUCT_H
    
    using namespace std;
    typedef struct img
    {
    
        long * size;
        long totalPixels;
        int dim;
        int *data;
    
    } img;
    
    #endif // GLOBALSTRUCT_H
    


    fit.h

    #ifndef FIT_H
    #define FIT_H
    
    #include "cfitsio/fitsio.h"
    #include "GlobalStruct.h"
    #include <vector>
    #include <utility>
    
    using namespace std;
    class Fit
    {
    
    public:
    
        static void open(const char* path, img* Img);
    
    
    
    private:
        static int getTotalPixel(int dim, long * size);
    };
    
    
    
    #endif // FIT_H
    

    fit.cpp

    #include "fit.h"
    
    
    void Fit::open(const char* path, img * Img) {
    
        int status = 0;
        int nullval = 0;
        int anynul = 0;
        fitsfile* fptr;
        fits_open_file(&fptr, path, READONLY, &status); // open file
        fits_get_img_dim(fptr, &Img->dim, &status);	// get dim of image (color or gray scale basicly
        Img->size = (long*)malloc(Img->dim * sizeof(long));
        fits_get_img_size(fptr, 2, Img->size, &status); // get size of image (pixels)
        Img->totalPixels = getTotalPixel(Img->dim, Img->size);
        Img->data = (int*)malloc(Img->totalPixels * sizeof(int));
        fits_read_img(fptr, ULONG_IMG, 1, Img->totalPixels, &nullval, Img->data, &anynul, &status);
        fits_close_file(fptr, &status);
    
    }
    
    
    
    int Fit::getTotalPixel(int dim, long* size) {
        int multOfAllPixel = 1;
        for (int i = 0; i < dim; i++)
            multOfAllPixel *= size[i];
        return multOfAllPixel;
    
    }
    
    

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    };
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "GlobalStruct.h"
    #include "fit.h"
    #include <fstream>
    #include<iostream>
    
    
    using namespace std;
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        const char* path = "c:/users/antoi/onedrive/bureau/astroimg/14-05-2021/light/m51/l/light_m51_60.0s_bin1_l_gain60_20210515-015357_-9.4c_0001.fit";
        img Img;
        Fit::open(path, &Img);
    
    
        float * newImg = (float*)malloc(Img.totalPixels * sizeof(float)); // just for rescale the dynamics of the image
        for(int i = 0; i < Img.totalPixels; i++){
            newImg[i]=(Img.data[i] - 1000.0) / (9000-1000);
            if(newImg[i] < 0)
                newImg[i] = 0;
            if(newImg[i] > 1)
                newImg[i] = 1;
            Img.data[i]=(int)(65535 * newImg[i]);
    
        }
    
    
        QImage I((unsigned char*) Img.data, Img.size[0], Img.size[1], Img.size[0]*2, QImage::Format_Grayscale16);
        QPixmap px = QPixmap::fromImage(I);
        ui->label->setPixmap(px);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    


    Le problème ce situe dans la mainwindow.cpp. J'ai fournie le reste du code pour que vous puissiez le tester directement avec l'image en fit que j'ai fournie. Il faudra juste installer la librairie cfitsio. J'utilise le compilateur MSVC2019 vous pouvez donc installer la librairie facilement en utilisant vcpkg. 

    voici dans l'ordre:

    - ce qu'on est censé voir (j'ai utilisé la même classe fit pour lire l'image. J'ai juste exporté en un csv 2d et ploter avec python)

    - le résultat de la même image et du même tableau 1d mais sous qt

    merci d'avance!!!

    sous python

    résultat sous qt

    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2021 à 19:03:14

      Des malloc en C++, ca semble mal parti de base. On dirait du code C que tu as copier-coller.

      Comme l'image obtenue dans Qt est une partie de l'image d'origine, tu as probablement un problème de copie ou de format. Il faut que tu vérifies tes données et les formats.

      • Partager sur Facebook
      • Partager sur Twitter
        11 juin 2021 à 19:23:49

        C'est ce que je pense aussi cependant l'image a était prise avec une caméra monochromatique donc c'est bien du grayscale et la valeur max du tableau est 65520. On est donc bien sur du 16 bits/pixel.

        c'est d'autant plus bizarre qu'avec pyqt j'ai réussie a le mettre sur un qlabel.(bon c'est pas franchement bizarre vue que je traite des tableau 2d en python)

        • Partager sur Facebook
        • Partager sur Twitter

        QT. tableau 1d en QImage

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown