前提・実現したいこと
画像が入ったフォルダーのパスを入力し、そこから画像を読み取りたいです。テキストボックス(lineEdit)に入力されたパスをボタン(pushButton)を押して読み込みます。
発生している問題・エラーメッセージ
imreadで読み込んでもすべてemptyになってしまいます。
画像の読み取りは同じコードでも Visual studio 2019 で実行すれば問題なく読み取れます。
該当のソースコード
ボタンが押されたときの処理 void MainWindow::on_pushButton_clicked(){} 内が該当の箇所です。
C++
1#include "mainwindow.h" 2#include "ui_mainwindow.h" 3 4#include <opencv2/opencv.hpp> 5#include <filesystem> 6#include <string> 7 8MainWindow::MainWindow(QWidget *parent) 9 : QMainWindow(parent) 10 , ui(new Ui::MainWindow) 11{ 12 ui->setupUi(this); 13} 14 15MainWindow::~MainWindow() 16{ 17 delete ui; 18} 19 20 21void MainWindow::on_pushButton_clicked() 22{ 23 namespace fs = std::filesystem; 24 25 /* 入力されたテキストをpathに代入 */ 26 std::string path = ui->lineEdit->text().toUtf8().constData(); 27 28 cv::Mat img; 29 30 if(fs::is_directory(path)) 31 { 32 /* フォルダー内の画像を順に読み込む */ 33 for(const auto& file : fs::recursive_directory_iterator(path)) 34 { 35 img = cv::imread(file.path().string()); 36 if(img.empty()){ 37 std::cout << "cannot load : " << file.path().string() << std::endl; 38 } 39 else{ 40 std::cout << "loading ... " << file.path().string() << std::endl; 41 } 42 } 43 std::cout << "----- end -----" << std::endl; 44 } 45 else{std::cout << path << " cannot open : " << path << std::endl;} 46}
本来は読み込んだ画像をvector配列に変換するなどといった処理もします。
出力
cannot load : E:\CC_Ddata\circle\IMG_4544.PNG cannot load : E:\CC_Ddata\circle\IMG_4545.PNG cannot load : E:\CC_Ddata\circle\IMG_4546.PNG (省略) cannot load : E:\CC_Ddata\circle\IMG_4573.PNG ----- end -----
試したこと
サイトやteratailの似た記事を参考に以下のようなことが原因に挙げられていましたが、どれも該当しませんでした。
・パスに日本語が使われている。
・フルパスを指定していない。
・パスが間違っている。(std::filesystem::existsで確認済み)
補足情報(FW/ツールのバージョンなど)
Microsoft Visual C++ compiler 16.10.31402.337(amd64)
Qt 6.2.0 MSVC2019 64bit
CMake 3.19.2(Qt)
C++17
追記
cv::Mat img2 = cv::imread("C:\CC_Ddata\circle\IMG_4573.PNG");
のようにすればemptyにならず読み取れたので、原因は .path().string() にありそう??
パスの区切りを''や''や'/'に変更しても変わりません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。