前提・実現したいこと
特徴点抽出プログラムをvisualstdio2017 c++で実装したところ
detectでエラーになってしまいます。
解決方法お願いします。
発生している問題・エラーメッセージ
ハンドルされない例外が 0x00007FFF78434ED9 で発生しました (ConsoleApplication1.exe 内): Microsoft C++ の例外: cv::Exception (メモリの場所 0x00000071BD0FC220)。
該当のソースコード
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/calib3d/calib3d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp> #include <vector> #include <iostream> #include <opencv2/core/mat.hpp> #include <opencv2/core/types.hpp> using namespace cv; using namespace std; int main(void) { // 画像の読み込み Mat im = imread("画像"); // Variables to store keypoints and descriptors // Detect ORB features and compute descriptors. Ptr<Feature2D> orb = ORB::create(); vector<KeyPoint> keypoint; orb->detect(im, keypoint); Mat descriptor; orb->compute(im, keypoint, descriptor); }
試したこと
画像表示が可能かどうか
画像の正規化
補足情報(FW/ツールのバージョンなど)
opencv3.4.1
visualstdio2017
> cv::Exception
とのことですが,コンソールウィンドウあたりに何かエラーメッセージが出ていませんか?
返信ありがとうございます。
確認したところ、下文のエラーメッセージが表示されていました。
OpenCV(3.4.1) Error: Assertion failed (TlsSetValue(tlsKey, pData) == 1) in cv::TlsAbstraction::SetData, file C:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\system.cpp, line 1245
(それが何なのかはわからんですが)
> TlsSetValue(tlsKey, pData) == 1
となるべきところが,そうならなかったので例外なげちゃいました,という話ですね.
で,場所も出ているので,OpenCVのソースを辿っていけば何かがわかるかもしれません.大変そうですが.
ちなみに,質問文に提示されたコードを実行してみても同じ現象は起きない様子でした.
(試した OpenCVは 3.2.0 ですが)
画像が空でも例外が出ることもない様子.
それは私の実行環境に問題があるという認識でよろしかったでしょうか。
ちなみにfanaさんが使われるvisual stdioのバージョンも2017年版なのでしょうか。
> それは私の実行環境に問題があるという認識でよろしかったでしょうか。
こちらでたまたま用いたOpenCVのバージョンの方がより古い物なので,バージョンアップによって「まともなチェックが入った」のかもしれません.
Visual Studio は 2017 です.
わかりました。
opencvのバージョンを変えて試してみます。
ありがとうございます。
たまたまディスク内にあった 4.1.1 でも試してみましたが,やはり同じ(cv::Exception は出ない)ですね.
> OpenCV(3.4.1) Error: Assertion failed (TlsSetValue(tlsKey, pData) == 1) ……(以下略)
の TlsSetValue というのが,↓のURLのAPIだとしたら,戻り値に関しては
If the function succeeds, the return value is nonzero.
とだけ書かれているので,==1 というチェック自体がバグなんじゃないのか?という気もします.
TlsSetValue()が成功時にどんな値を返してくるのか?(←何によって定まるのか?も謎ですが)次第では,成功しているのにCVが失敗としてしまいそうです.
(手元の4.1.1 のソースを見ても ==TRUE と書かれていますが…)
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-tlssetvalue
おはようございます。
昨日、色々なバージョンのOpenCVを導入してみたのですが、どれも同じ場所で止まってしまいます…
visual stdio側でopencvのパスなどを登録する以外に特別な操作などしてますでしょうか?
もちろん本体のシステム環境にもパスは通してあります。
特に変わったことはしてないです.
OpenCVを使う際は,
プロジェクト作って,プロジェクトのプロパティで
・C/C++ → 追加のインクルードディレクトリ
・リンカー → 追加のライブラリディレクトリ
にパスを追加して,
リンカー → 追加の依存ファイル
にOpenCVのlibのファイル名を追加するだけですね.
あと,私はOpenCVのdllのある場所にシステムではパスを通してないので,Visual Studio から実行できるようにするために
デバッグ → 環境
のところでdllのありかにパスを通してますが,それだけですね.
(昔,OpenCVの複数のバージョンが同じdllファイル名だったときに面倒を起こした経験があるので)
あ,一応,差異としては
> #include <opencv2/xfeatures2d/nonfree.hpp>
これが私の環境には存在してないので,このincludeだけは外してましたね.
OpenCV3.2.0を使ったReleaseビルドの設定では 追加の依存ファイル に書いてるlibは
opencv_core320.lib
opencv_highgui320.lib
opencv_imgproc320.lib
opencv_imgcodecs320.lib
opencv_features2d320.lib
になってます.
あなたの回答
tips
プレビュー