2017-05-10 5 views
4

この実行:一台のマシン上で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

+2

同じコードが別のマシンで構築されている場合は機能しますか?どのコンパイラが使われていて、同じものがOpenCVのビルドに使われたのですか? – slawekwin

+0

私は両方のコンピュータでこのコードとOpenCVの両方をビルドするために、同じバージョンのVisual Studioとそのコンパイラを使用します。 – ancajic

+1

あなたは[this](https:// stackoverflow)を見ましたか?com/questions/23585158/create-mat-from-vectorpoint2f?rq = 1)?それがなぜ起こるのかを理解するための質問ですか? –

答えて

0

で発生します。

これが発生するたびに、Windows Updateの直後だったようです。

以下のライブラリを完全に削除して再構築しました: VTK、OpenCV、Eigen、そして最後に私のプロジェクトです。

これは私のために修正されました。

関連する問題