質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

1回答

3886閲覧

C++ Qt creator でOpencvのimreadを使って画像を読み込めない(empty)。

nabla

総合スコア6

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

1クリップ

投稿2021/06/17 08:38

編集2021/06/17 10:36

前提・実現したいこと

画像が入ったフォルダーのパスを入力し、そこから画像を読み取りたいです。テキストボックス(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() にありそう??
パスの区切りを''や''や'/'に変更しても変わりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

QtでLIBSに.libとd.libの両方を追加していることが原因でした。
片方だけにした場合、問題なく読み取れました。(Visual studioではマクロを使って衝突しないようにしていたので問題にならなかったようです。)

自分の調べ不足もありました。すみません。以下同様の質問です。
https://teratail.com/questions/306831
https://teratail.com/questions/291259

file.path().string()はダメで直接文字列を指定したら問題ないなど、詳しい理由はわかりません。

投稿2021/06/17 14:00

nabla

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問