我目前正在构建一个使用相机的Qt应用程序。 在此应用程序中,使用捕获图像,然后它们会自动保存在特定文件夹中。一切都很好。
现在,当"库"单击按钮,我想读取所有图像(JPEG文件)并显示在QLabel
中逐个拍摄的所有图像。
我找不到任何教程,只找到教程并使用argv
参数,这对我没有好处,因为在我的应用程序中,用户可以捕获图像,然后在同一个中显示它们运行
如何读取文件列表并显示它?
非常感谢:)
答案 0 :(得分:0)
如果您只有一个QLabel
,那么您必须将图像合并为一个。我发现更容易显示QLabel
s列表:
auto layout = new QVBoxLayout();
Q_FOREACH (auto imageName, listOfImages) {
QPixmap pixmap(dirPath + "/" + imageName);
if (!pixmap.isNull()) {
auto label = new QLabel();
label->setPixmap(pixmap);
layout->addWidget(label);
}
}
a_wdiget_where_to_show_images->setLayout(layout);
最后一行取决于您何时要放置标签。我推荐一些带滚动条的小部件。
现在,您想要读取目录中的所有图像(上面的listOfImages
变量)。如果你没有它:
const auto listOfImages = QDir(dirPath).entryList(QStringList("*.jpg"), QDir::Files);
如果图片太大,可能会出现布局问题。在这种情况下,如果它们大于给定大小,则应缩放它们。请查看QPixmap::scaled或QPixmap::scaledToWidth。此外,如果图像质量很重要,请将Qt::SmoothTransformation
指定为转换模式。
答案 1 :(得分:0)
您可以使用opencv库来读取目录中的所有图像。
vector<String> filenames; // notice here that we are using the Opencv's embedded "String" class
String folder = "Deri-45x45/"; // again we are using the Opencv's embedded "String" class
float sayi = 0;
glob(folder, filenames); // new function that does the job ;-)
float toplam = 0;
for (size_t i = 0; i < filenames.size(); ++i)
{
Mat img = imread(filenames[i],0);
//Display img in QLabel
QImage imgIn = putImage(img);
imgIn = imgIn.scaled(ui->label_15->width(), ui->label_15->height(),Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
ui->label_15->setPixmap(QPixmap::fromImage(imgIn));
}
为了将Mat类型转换为QImage,我们使用putImage函数:
QImage putImage(const 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();
}
}