実現したいこと
OpenCVを使用してWebカメラの映像を取得したいです。
発生している問題
エラー無く動作するものの肝心のカメラの映像が僅かにノイズの走った真っ暗な画像しか出力されません。
下記画像参照
(画像上部に僅かにノイズがある、このノイズも一定せず全くない場合もあれば画像のあちこちにランダムに走り実行毎に変化する)

下記コードを実行時に「Camera connect Success!」とは表示されカメラの縦横の値は表示される
ただしFPSの値は30のはずが0になっている
以下実行結果
Camera connect Success!----------------------- Width :640 Height:480 FPS :0 ---------------------------------------------- [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\highgui\src\registry.impl.hpp (114) cv::highgui_backend::UIBackendRegistry::UIBackendRegistry UI: Enabled backends(4, sorted by priority): GTK(1000); GTK3(990); GTK2(980); WIN32(970) + BUILTIN(WIN32UI) [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\opencv\build\x64\vc15\bin\opencv_highgui_gtk454_64.dll => FAILED [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_highgui_gtk454_64.dll => FAILED [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\opencv\build\x64\vc15\bin\opencv_highgui_gtk3454_64.dll => FAILED [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_highgui_gtk3454_64.dll => FAILED [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\opencv\build\x64\vc15\bin\opencv_highgui_gtk2454_64.dll => FAILED [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_highgui_gtk2454_64.dll => FAILED [ INFO:0] global C:\build\master_winpack-build-win64-vc15\opencv\modules\highgui\src\backend.cpp (90) cv::highgui_backend::createUIBackend UI: using backend: WIN32 (priority=970) [ INFO:0] global C:\build\master_winpack-build-win64-vc15\opencv\modules\highgui\src\window_w32.cpp (3013) cv::impl::Win32BackendUI::createWindow OpenCV/UI: Creating Win32UI window: win (1) [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\parallel\registry_parallel.impl.hpp (96) cv::parallel::ParallelBackendRegistry::ParallelBackendRegistry core(parallel): Enabled backends(3, sorted by priority): ONETBB(1000); TBB(990); OPENMP(980) [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\opencv\build\x64\vc15\bin\opencv_core_parallel_onetbb454_64d.dll => FAILED[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_onetbb454_64d.dll => FAILED [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\opencv\build\x64\vc15\bin\opencv_core_parallel_tbb454_64d.dll => FAILED [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_tbb454_64d.dll => FAILED [ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load C:\opencv\build\x64\vc15\bin\opencv_core_parallel_openmp454_64d.dll => FAILED[ INFO:0] global c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\utils\plugin_loader.impl.hpp (67) cv::plugin::impl::DynamicLib::libraryLoad load opencv_core_parallel_openmp454_64d.dll => FAILED カメラ読み込み中 カメラ読み込み中 カメラ読み込み中 カメラ読み込み中 ・ ・ ・
該当のソースコード
C++
1#include <iostream> 2#include <opencv2/opencv.hpp> 3 4using namespace cv; 5 6int main() 7{ 8 int camera_id = 0; 9 10 VideoCapture cap(camera_id); 11 if (!cap.isOpened()) 12 { 13 //読み込みに失敗したときの処理 14 std::cout << "Camera connect Error!\n"; 15 return -1; 16 } 17 18 std::cout << "Camera connect Success!-----------------------\n"; 19 std::cout << "Width :" << cap.get(3) << "\n"; 20 std::cout << "Height:" << cap.get(4) << "\n"; 21 std::cout << "FPS :" << cap.get(5) << "\n"; 22 std::cout << "----------------------------------------------\n"; 23 Mat frame; //取得したフレーム 24 25 while (true)//無限ループ 26 { 27 cap.read(frame); 28 if (frame.empty()) { 29 std::cout << "Mat Load Error!\n"; 30 return -1; 31 } 32 imshow("win", frame);//画像を表示. 33 imwrite("camera_picture.png",frame); 34 waitKey(1); 35 std::cout << "カメラ読み込み中\n"; 36 } 37 destroyAllWindows();// ウィンドウを閉じる. 38 cap.release(); 39 40 return 0; 41}
試したこと
試しに他ソフトでカメラ映像を確認したところ無事に出力されるため、カメラの故障ではないと思われます。
補足情報(FW/ツールのバージョンなど)
Windows10
VisualStudio2019
OpenCV 4.5.4
となっています。
OpenCV 関連 DLL のロードに失敗しているからぢゃないですか?
失敗しても起動はされるものなんでしょうか?
私も同じような開発環境ですが、プログラムは問題なく実行できるようです。
表示できないのは動画だけでしょうか?
画像ファイル (.jpg, .png など) は正常に表示できますか?
画像ファイルも正常に表示できないとすると、開発環境の構築 (設定) に問題があるかもしれません。
別のカメラに接続してしまっているとか
>>Bull様
表示されないのは動画だけです。
試しにpng画像を読み込むと表示されました
>>yominet様
その線は薄いと思います。
試しにカメラを抜いて実行すると「Camera connect Error!」と表示されるので。
念の為にcamera_idを-1から5まで試しましたが0以外ではエラーになりました。(カメラを挿している場合)
> 表示されないのは動画だけです。
> 試しにpng画像を読み込むと表示されました
そうすると、開発環境の問題は無さそうですね。
VideoCapture cap(camera_id);
を
VideoCapture cap(camera_id, cv::CAP_DSHOW);
とすると、どうでしょうか?
ご指摘いただいたコードで変えて実行してみましたが、変わらずエラーは無いものの画面は真っ黒のままになっています。
そうなると OpenCV では扱えないデバイスの可能性もありますが、よく分からないです。
別のカメラを用意できれば、原因の切り分けができるかもしれませんが。
一応OpenCvを元としたVb.net内でのOpenCVSharpを使った実行では同じカメラで読み込みが出来ました。
あまり関係は無いでしょうか…?
すいませんが、OpenCVSharp に付いてはよく知らないです。
Python の opencv-python に関しては、C++ のソースがそのまま使われているようなので、Python で実行できて、C++ でエラーになることはあまり考えられないのですが。
OpenCVのC++&VisualStudioということで
いつものrelease版とDebug版混じりが発生してるかもしれないですね
動作確認している構成はdebugかreleaseか、
リンクしているlibファイル、および動作時に読み込みしている(配置している)dllと
構成が、きちんとあっているか?など確認してみてはいかかでしょうか
あなたの回答
tips
プレビュー