Извлечение значений RGB из нескольких изображений и программа не выходит из вложенного цикла с использованием Qt - PullRequest
2 голосов
/ 05 июня 2019

Я новичок в Qt и c ++. Я написал некоторый код, который загружает несколько изображений (одинаковых размеров). Красный, зеленый, синий и альфа-данные копируются в трехмерный вектор. Это все работает.

Проблема в том, что он застрял во вложенном цикле for и не выполняет код после цикла, пока я не остановлю или не закрою. Затем он печатает на консоль в качестве теста. Я хочу иметь возможность выполнять обработку данных в векторе после выполнения цикла.

Я очень застрял в этом.

Это пример вывода с использованием очень маленьких тестовых изображений для каждого изображения, для каждого пикселя, альфа-значений красного, зеленого и синего.

Изображение 0: Пиксель: 0 181 230 29 255 Изображение 0: Пиксель: 1 255 255 255 255

Изображение 1: Пиксель: 0 233 5 7 255 Изображение 1: Пиксель: 1 0 0 0 255

Вот мой код.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColor>
#include <iostream>
#include <QByteArray>
#include <QDebug>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <string>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}



void MainWindow::on_cleanPlate_clicked()
{

    // load multiple images - must be same dimensions
    QStringList filename = QFileDialog::getOpenFileNames(this, tr("Choose Image"), "", tr("Images (*.png *.jpg *.jpeg *.bmp)"));

    uint numberOfImages = static_cast<uint>(filename.count());

    QString sizeQuery = filename.at(0);
    QImage getImageSize(sizeQuery);
    getImageSize = getImageSize.convertToFormat(QImage::Format_RGBA8888);
    uint numberOfBytes = static_cast<uint>(getImageSize.sizeInBytes());

    std::vector<std::vector<std::vector<uint>>> rgb(numberOfImages, std::vector<std::vector<uint>>(numberOfBytes / 4, std::vector<uint>(4,0)));
    std::vector<std::vector<std::vector<uint>>> rgbTranspose(numberOfBytes/4, std::vector<std::vector<uint>>(numberOfImages, std::vector<uint>(4,0)));

    // start of nested loop
    for (uint i{0};i < numberOfImages;++i) {

        QString pictures = filename.at(i);
        QImage image(pictures);
        image.load(pictures);
        image = image.convertToFormat(QImage::Format_RGBA8888);

        auto const pictureRGBdata = image.bits();
        for (uint j{0};j < numberOfBytes/4; ++j) {

            std::cout  << "Image " << i << ": Pixel: " << j;

            for (uint k{0};k < 4;++k) {

                rgb[i][j][k] = pictureRGBdata[4*j +k];
                std::cout << " " << rgb[i][j][k];

            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }
    //end of nested loop - but loop gets stuck here - does not exit loop to next line of code
    std::cout << "This won't print ";


}
...