この実行:一台のマシン上でOpenCVのはstd :: CVのためのベクトル::マット引数
std::vector<cv::Point2f> pts; // contains 4 elements
cv::Mat ptsMat = ((cv::InputArray)pts).getMat();
は、私は2つのチャンネルを4行1cv::Mat
を取得します。各要素は2D点を表します。 別のマシンでは、2090-by-1をcv::Mat
に、奇妙なデータの2つのチャンネルがあります。 これは間違っており、ベクトルには4つの項目しか含まれていないので、これは問題です。 EDIT
のWindows 10上にCMakeを使ってソースから構築されたOpenCVの3.1を使用して、両方のマシンで
は、私は別のマシンで同様の問題を経験し始めました。 Visual Studioで デバッグモードで次のコードは正常に動作します:
std::vector<cv::Point2f> points = { cv::Point2f(2, 1), cv::Point2f(2, 1), cv::Point2f(1, 3) };
cv::InputArray arr = points;
cv::Mat ma = arr.getMat();
std::cout << ma.ptr<float>(0)[1];
しかし、私はリリースでそれをコンパイルするとき、それは場所を読んアクセス違反で最後の行にクラッシュ...
さらなる調査明らかに違いが重要なフラグがあること:
ランタイムライブラリ:マルチスレッドDLL(/MD)--------> クラッシュ
ランタイムライブラリ:Mateen Ulhaqのコメントに基づいて
EDIT 2
を作品マルチスレッドDLLのデバッグ(/MDD)-------->、私がチェック
std::vector<cv::Point2f> points;
cv::Mat image(points);
これは問題なく動作します。 問題は、OpenCVのより大きな関数(例:undistortPoints)の中に内部的にgetMat()
の変換を使用していることです。私がリリース時にそれを実行すると、アプリケーションがクラッシュします。
EDIT 3
だけチェックし、同じ問題がこれはまさに私が探していた答えではないが、ここに行くのOpenCV 3.2
同じコードが別のマシンで構築されている場合は機能しますか?どのコンパイラが使われていて、同じものがOpenCVのビルドに使われたのですか? – slawekwin
私は両方のコンピュータでこのコードとOpenCVの両方をビルドするために、同じバージョンのVisual Studioとそのコンパイラを使用します。 – ancajic
あなたは[this](https:// stackoverflow)を見ましたか?com/questions/23585158/create-mat-from-vectorpoint2f?rq = 1)?それがなぜ起こるのかを理解するための質問ですか? –