cv::imread() で画像を読み込めない
Siv3D勉強中の学生  2025/03/17(Mon) 13:47
OpenCVのimread()で画像が読み込めず、empty()がtrueになってしまいます。
OpenCVを使って、ファイルから画像を読み込む方法を教えてください。

・環境
Windows11
OpenSiv3D_0.6.15
Visual Studio Community 2022 verion 17.12.5
OpenCV 4.10.0

・試したこと
追加のインクルードディレクトリと追加のライブラリパスは設定しました。

#include <Siv3D.hpp>
#include <opencv2/opencv.hpp>

#ifdef _DEBUG
#pragma comment(lib,"opencv_world4100d.lib")
#else
#pragma comment(lib,"opencv_world4100.lib")
#endif

void Main()
{
std::string imagePath = "example/windmill.png";
cv::Mat frame = cv::imread(imagePath, cv::IMREAD_UNCHANGED);

while (System::Update())
{
ClearPrint();
if (frame.empty())
{
Print << U"Image is Empty!";
}
else {
Print << U"Image is not Empty!";
}
}
}
記事編集
Reputeless  2025/03/17(Mon) 18:09
Siv3D にもともと同梱されている OpenCV ライブラリは PNG / JPEG 等の読み込みに対応していません。BMP 形式の画像は正常に読み込めるので BMP を試してください。対応したい場合は OpenCV ライブラリの差し替えが必要になります。

Siv3D には Image を cv::Mat_<cv::Vec3b> に変換する `OpenCV_Bridge::ToMatVec3bBGR(image)` があります。それで対応可能な場合はこちらを使ってください。
編集
Siv3D勉強中の学生  2025/03/18(Tue) 00:07
ご回答ありがとうございます。

OpenCV ライブラリの差し替えとは、
OpenSiv3D_0.6.15\lib\Windows\opencv\ にある opencv_core451.lib などを opencv_core4100.lib に置き換える ということでしょうか?

現在、以下の手順を試しましたが、個別の .libが手に入らず、
手元にopencv_world4100.lib と opencv_world4100d.lib しかありません。

・opencv-4.10.0-windows.exe を実行
・opencv-4.10.0.zip を展開

この場合、どのように OpenCV ライブラリを差し替えればよいか、具体的な手順を教えていただけますか?
よろしくお願いいたします。
編集
Reputeless  2025/03/18(Tue) 02:33
opencv-4.10.0-windows.exe のようなインストーラではなく、OpenCV 4.5.1 をソースコードから自前でビルドすると個別の .lib を入手できます。
それを Siv3D に同梱されているライブラリと差し替えます。

Siv3D.hpp 内でリンクしている箇所がこうなので、バージョンを一致させる必要があります。
https://github.com/Siv3D/OpenSiv3D/blob/main/Siv3D/include/Siv3D/Windows/Libraries.hpp#L48-L53

OpenCV のビルドに慣れていない場合は難しいと思うので、imread ではなく OpenCV_Bridge::ToMatVec3bBGR(image) を使うことを推奨します。
編集
Siv3D勉強中の学生  2025/03/18(Tue) 18:58
ご回答ありがとうございます。以下のことを試してみました。

(1)OpenCV 4.5.1のソースコードをcmake-guiを用いてビルドし、C:/Libraries/opencv-4.5.1/buildディレクトリに生成しました。

(2)Siv3Dのプロジェクトで、以下のようにプロパティを設定しました。
追加のインクルードディレクトリ: C:/Libraries/opencv-4.5.1/build/install/include
追加のライブラリディレクトリ: C:/Libraries/opencv-4.5.1/build/install/lib

(3)C:\Users\Documents\OpenSiv3D_0.6.15\lib\Windows\opencvにある451d.libと451.libが末尾につくファイルを、C:/Libraries/opencv-4.5.1/build/install/lib内の.libファイルに置き換えました。

質問1
これらの設定を行い、以下のコードを実行したところ、imread()による画像の読み込み自体は成功しました。しかし、cv::Matからs3d::Imageを作成し、それを使ってs3d::Textureを作成したら、s3d::Textureが正しく表示されない問題が発生しました。

#include <Siv3D.hpp>
#include <Siv3D/OpenCV_Bridge.hpp>
#include <opencv2/opencv.hpp>

void Main()
{
std::string imagePath = "example/windmill.png";
cv::Mat3b mat3b = cv::imread(imagePath, cv::IMREAD_UNCHANGED);
Image image;
OpenCV_Bridge::FromMatVec3b(mat3b, image, OverwriteAlpha::No);

Texture texture(image);
while (System::Update())
{
ClearPrint();
if (image.isEmpty())
{
Print << U"Image is Empty!";
}
else
{
Print << U"Image is not Empty!";
}

if (!texture.isEmpty())
{
Print << U"Texture is not Empty!";
texture.drawAt(Scene::Center());
}
else
{
Print << U"Texture is Empty!";
}
}
}

質問2
追加のライブラリディレクトリを設定しない場合、ライブラリが読み込めないというエラーが発生しました。差し替えたライブラリのファイル名は変わっていないのに、追加のライブラリディレクトリを設定する必要があるのはなぜでしょうか?

質問3
C:\Users\Documents\OpenSiv3D_0.6.15\lib\Windows\opencvにある.libはリンクされていないということでしょうか?

長文失礼しました。
編集
Reputeless  2025/03/18(Tue) 22:08
1:
s3d::Textureが正しく表示されないとはどういうことですか。
何が起こっているのか具体的に説明してください。

2:
ライブラリが読み込めないというエラーとは、どういうエラーですか。
エラーメッセージを示してください。

3:
https://github.com/Siv3D/OpenSiv3D/blob/main/Siv3D/include/Siv3D/Windows/Libraries.hpp#L48-L53 で、
C:\Users\Documents\OpenSiv3D_0.6.15\lib\Windows\opencv にある .lib を静的リンクしています。

.lib を差し替えるだけであれば、「追加のライブラリディレクトリ」は一切変更する必要はありません。
変更しないといけないという時点で何かが間違っています。
編集
Siv3D勉強中の学生  2025/03/18(Tue) 23:27
1:
1枚目の画像のように、写真が表示されるのを期待しているのですが、何も表示されないという状況です。ImageもTextureもemptyではないのですが、Print出力したものしか表示されません。

2:
「.dllが見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。」

というエラーが出ていたのですが、以下のように環境変数を設定し,パソコンを再起動して反映させたら、エラーが出なくなりました。なので、追加のライブラリディレクトリを設定することなく実行できました。

C:\Libraries\opencv-4.5.1\build\install\lib
C:\Libraries\opencv-4.5.1\build\install\bin

3:
承知しました。ありがとうございます。



編集
Reputeless  2025/03/19(Wed) 09:07
1:
OpenCV_Bridge::FromMatVec3b(mat3b, image, OverwriteAlpha::No);
OverwriteAlpha::No なので、アルファ成分がすべて未初期化で 0 になっています。

2:
OpenCV を「ダイナミック ライブラリ (.dll)」構成でビルドした場合、生成された .lib には OpenCV の本体コードは入っていないため、実行時に .exe と同じフォルダに .dll が存在しないと動作しません。

一方、Siv3D に同梱している OpenCV は「スタティック ライブラリ (.lib)」構成でビルドしているため、.lib にリンクするだけで完結し、.dll は不要になっています。

どちらでも動作すれば問題ありません。OpenCV のスタティックライブラリを Siv3D に適合するようにビルドするには、プロジェクトの設定で、ランタイム ライブラリを
Debug ビルドは「マルチスレッド デバッグ (/MTd)」
Release ビルドは「マルチスレッド (/MT)」
に設定する必要があります。
編集
Siv3D勉強中の学生  2025/03/19(Wed) 13:45
OverwriteAlpha::Yesにしたら画像を表示できました。
ありがとうございました。
編集
件名
Re: cv::imread() で画像を読み込めない
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -