2017-10-01 12 views
1

私は現在Qtの作成者に取り組んでいます。メインウィンドウのハードドライブからブラウズしてイメージを取得し、RGBカラーイメージをグレーイメージに変換した後、グレーイメージを別のウィンドウに表示したいとします。mainwindowのイメージをC++とQTの別のウィンドウに表示するには?

「ブラウズ」ボタンをクリックすると、カラーからグレイのイメージ変換が適用される場所にカラーイメージをロードできます。ここではgrayImageはパブリックMatタイプの変数です。同時に、SecondDialogという名前の別のウィンドウのインスタンスが呼び出されて実行されます。 seconddialog.cppで

void MainWindow::on_Browse_clicked() 
{ 
    QFileDialog dialog(this); 
    dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg)")); 
    dialog.setViewMode(QFileDialog::Detail); 
    fileName = QFileDialog::getOpenFileName(this, tr("Open Images"), "/home/rpi/Desktop/Picture/Sample Pictures", tr("Image Files (*.png *.jpg *.bmp)")); 
    if (!fileName.isEmpty()) 
    { 
     String image_path=fileName.toLocal8Bit().constData(); 
     Mat image= imread(image_path); 
     cvtColor(image, grayImage, CV_BGR2GRAY); 
     SecondDialog obj; 
     obj.setModal(true); 
     obj.exec(); 
    } 
} 

、私はQLabelに表示するQImageのにマットの画像を変換している私は、このプログラムを実行すると、そこには、コンパイル・エラーがありませんが、それはlabel_img

SecondDialog::SecondDialog(QWidget *parent) : 
QDialog(parent), 
ui(new Ui::SecondDialog) 
{ 
    ui->setupUi(this);  
    MainWindow object; 
    Mat src= object.grayImage; 
    Mat temp(src.cols,src.rows,src.type()); 
    QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888); 
    dest.bits(); 
    ui->label_img->setPixmap(QPixmap::fromImage(dest)); 
} 
SecondDialog::~SecondDialog() 
{ 
    delete ui; 
} 

の名前2番目のウィンドウに画像が表示されるようになりました。 私のコードに間違いがあるかどうかはわかりません。誰かがこの問題を解決できるなら、本当に役に立ちます。 ありがとうございます。

+0

私はちょうどあなたの解決策に従って試しました。しかしそれはまだ表示されていません。 – Gansroy

+0

私はgithubアカウントにこれを追加しました。プログラムは次のリンクにありますgithub.com/ashraful100/DisplayImageもう一度ありがとうございます。 – Gansroy

答えて

0

あなたはタイプのメインウィンドウの新しいオブジェクト作成しているあなたのコードによると:

[...] 
ui(new Ui::SecondDialog) 
{ 
ui->setupUi(this);  
MainWindow object; 
[...] 

をそして、あなたはこの動作を取得するので、これは空のgrayImage属性を持っています。

別の問題は、使用する形式であり、QImage::Format_RGB888からQImage::Format_Indexed8に変更する必要があります。

Format_RGB888:画像は24ビットRGB形式(8-8-8)で保存されます。

Format_Indexed8:イメージは8ビットインデックスを使用してカラーマップに格納されます。

何がしなければならないことはsetterメソッドを作成し、次の操作を行う必要があり、それのために、新しいウィンドウに画像を渡すことです:

SecondDialog.h

public: 
    void setImage(const Mat &image); 

SecondDialog .cpp

SecondDialog::SecondDialog(QWidget *parent) : 
QDialog(parent), 
ui(new Ui::SecondDialog) 
{ 
    ui->setupUi(this);  
} 

void SecondDialog::setImage(const Mat &image){ 
    QImage dest((const uchar *) image.data, image.cols, image.rows, image.step, QImage::Format_Indexed8); 
    ui->label_img->setPixmap(QPixmap::fromImage(dest)); 
} 

だから、最後にあなたがMainWindow.cppで、次を実行する必要があります。

void MainWindow::on_Browse_clicked() 
{ 

    QFileDialog dialog(this); 
    dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg)")); 
    dialog.setViewMode(QFileDialog::Detail); 
    fileName = QFileDialog::getOpenFileName(this, 
     tr("Open Images"), "/home/rpi/Desktop/Picture/Sample Pictures", tr("Image Files (*.png *.jpg *.bmp)")); 
    if (!fileName.isEmpty()) 
    { 
     String image_path=fileName.toLocal8Bit().constData(); 
     Mat image= imread(image_path); 
     cvtColor(image, grayImage, CV_BGR2GRAY); 
     SecondDialog obj; 
     obj.setImage(grayImage); 
     obj.setModal(true); 
     obj.exec(); 
    } 

} 

編集:私の場合は

私はQImagecv::Matの変換を行うには、次の機能を使用します。

# https://github.com/eyllanesc/Mirosot-Peru/blob/master/Mirosot-PC/MatToQImage.cpp 
QImage MatToQImage(const cv::Mat& mat) 
{ 
    // 8-bits unsigned, NO. OF CHANNELS=1 
    if(mat.type()==CV_8UC1) 
    { 
     // Set the color table (used to translate colour indexes to qRgb values) 
     QVector<QRgb> colorTable; 
     for (int i=0; i<256; i++) 
      colorTable.push_back(qRgb(i,i,i)); 
     // Copy input Mat 
     const uchar *qImageBuffer = (const uchar*)mat.data; 
     // Create QImage with same dimensions as input Mat 
     QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8); 
     img.setColorTable(colorTable); 
     return img; 
    } 
    // 8-bits unsigned, NO. OF CHANNELS=3 
    if(mat.type()==CV_8UC3) 
    { 
     // Copy input Mat 
     const uchar *qImageBuffer = (const uchar*)mat.data; 
     // Create QImage with same dimensions as input Mat 
     QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); 
     return img.rgbSwapped(); 
    } 
    else 
    { 
     qDebug() << "ERROR: Mat could not be converted to QImage."; 
     return QImage(); 
    } 
} // MatToQImage() 
+0

ありがとうございます。私もこの編集で試しました。しかし、残念ながら、まだgrayImageを表示していません。MainWindowに空のgrayImageがある理由を説明できますか? – Gansroy

+0

あなたのプロジェクトを共有して、ドライブ、ドロップボックス、ギブスなどを使って、完全にテストされた回答を得られます。 – eyllanesc

+0

私はgithubアカウントにこれを追加しました。プログラムは次のリンクにありますhttps://github.com/ashraful100/DisplayImage もう一度ありがとうございます。 – Gansroy

関連する問題