石立 喬

OpenCV3.2.0に関するメモ


 最新の記事が上になっているので、過去の記事を参照しないと分かりにくい場合がある

2017. 1.23
 さきに(1月21日記事)、「OpenCV3.1.0でも、flann_base.hppに「fopen」が使われていたのに、それがなぜ、ビルドできていたのかは、まだ謎のままである。」と述べたが、謎でも何でもなく、OpenCV3.1.0では、opencv2/opencv.hppがflann.hppをインクルードしていなかっただけ(1月20日記事参照)だった。OpenCV3.1.0でも、flann.hppを別途インクルードして使えば、エラーになったことと思われる。OpenCV3.2.0では、opencv.hppがインクルードするファイルの数が増えた。これは、ありがたいことである。しかし、そのことがエラーの原因となった。flann.hppにおいて、「fopen」が「fopen_s」に変更されることを希望する。

2017. 1.21
 OpenCV3.2.0でビルドできなかった例をより具体的に示す。図1はその時のエラーメッセージである。警告は許容できるとして、エラーの「'fopen'は危険なので、'fopen_s'を使用せよ」は無視することができない。


図1 Visual Studio 2015の「エラー一覧」の例


 そこで、「fopen」がどこで使われているのかを探したところ、opencv2/opencv.hppがインクルードするopencv2/flann.hppが更にインクルードするopoencv2/flann_base.hppに二か所使われていることが分かった。これは、特にプログラム上のバグと言われるようなものではなく、Visual Studio 2015のチェックが厳し過ぎると判断した。
 そこで、Visual Studio 2015の「Microsoft.Cpp.x64.userプロパティ」ウインドウで、左欄で「共通プロパティ」→「C/C++」→「コード生成」と選択し、右欄の「セキュリティチェック」を「セキュリティチェックを有効にします」(デフォルト)から「セキュリティチェックを無効にします」に変更した。この状態を図2に示す。


図2 「セキュリティチェック」欄を変更した、Visual Studio 2015の「プロパティページ」


 そうすると、OpenCV3.2.0のopencv2/opencv.hppをそのままインクルードしても、警告やエラーが発生することなく、正常にビルドできるようになった。
 「OpenCV3.1.0とVisual C++ 2015による画像処理と認識」シリーズに含まれるすべてのプログラムについて確認したところ、すべて、そのままで、支障なくOpenCV3.2.0が使用できることが分かった。
 OpenCV3.1.0でも、flann_base.hppに「fopen」が使われていたのに、それがなぜ、ビルドできていたのかは、まだ謎のままである。

2017. 1.20
 必要なヘッダファイルをその都度記述するのは、やはり面倒なので、opencv_modules.hppから#define HAVE_OPENCV_FLANNを削除することにした。「アクセスが拒否されました」を避けるために、buidフォルダをProgram Files/opencv/から別の場所に一時的に移し、そこで書き換えてから元に戻した。
 これにより、「(1)」〜「(7)」において、OpenCV3.1.0のプログラムがそのままOpenCV3.2.0で使用できることを確認した。
 OpenCV3.2.0のopencv2/opencv.hppは、OpenCV3.1.0の場合よりも多くのインクルードファイル(下記参照)を含み、これは改善である。新しく追加されたものをNewで示し、この中から、flann.hppは削除した。
    opencv2/core.hpp
    opencv2/calib3d.hpp
    opencv2/featured2d.hpp
    opencv2/flann.hpp --------------- New
    opencv2/highgui.hpp
    opencv2/imgcodecs.hpp
    opencv2/imgproc.hpp
    opencv2/ml.hpp
    opencv2/objdetect.hpp
    opencv2/photo.hpp
    opencv2/shape.hpp -------------- New
    opencv2/stitching.hpp ------------ New
    opencv2/superres.hpp ------------ New
    opencv2/video.hpp
    opencv2/videoio.hpp
    opencv2/videostab.hpp ----------- New
    opencv2/viz.hpp ----------------- New
    多くのCUDA関連ヘッダファイル ---- New

2017. 1.19
 「(3)」、「(4)」、「(5)」についても、
       #include <opencv2/opencv.hpp> → #include <opencv2/highgui.hpp>
                             #include <opencv2/imgproc.hpp>
のみの変更で、そのままプログラムが動作した。
 opencv.hppやopencv_modules.hppを編集してopencv2/flann.hppを削除しようとすると、「アクセスが拒否されました」と出るし(避ける方法はあるが)、opencv_modulesには、「File generated aurtomatically, do not modify」と書いてあるので、結局、これらのファイルからFLANNヘッダを削除することはやめ、面倒でも必要なヘッダファイルのみをその都度設定することにした。

2017. 1.18
 OpenCV3.2.1が昨年末に公開になったので、早速使用してみた。従来、ここで扱ってきたテーマの範囲では、ほとんど変わりがないように感じたので、OpenCV3.1.0のプログラムをそのまま使用したところ、ビルドできず、実行もできなかった。
 問題は、#include <opencv2/opencv.hpp>にあり、これがインクルードするopencv2/flann.hppが不具合のようである。opencv.hppからこれを外すか、使用するインクルードファイルだけを、 #include <opencv2/hgigui.hpp>などのように個別に記述すると、正常に動作した。
 このメモでは、「OpenCV3.1.0とVisual C++ 2015による画像処理と認識」シリーズに対する変更点を、順次示していく。
 「(1)」に対しては、図7で、
       opencv_world310.dll → opencv_world320.dll
       opencv_world310d.dll → opencv_world320d.dll
とし、 図9で、
       #include <opencv2/opencv.hpp> → #include <opencv2/highgui.hpp>
                             #include <opencv2/imgproc.hpp>
するのみで良い。
 「(2)」に対しては、
       #include <opencv2/opencv.hpp> → #include <opencv2/highgui.hpp>
のみで良い。






「Visual C++の勉強部屋」(目次)へ