この例に従って、
ビデオ内のオブジェクトを認識するアプリケーションを構築しようとしています。
私のプログラムは次のステップで構成されています (以下の各ステップのコード サンプルを参照してください)。
- 認識対象の画像をオブジェクトに読み込み
cv::Mat
ます。 - オブジェクト内のキーポイントを検出し、記述子を計算します。
- ビデオの各フレームを読み取り、
- キーポイントを検出し、フレームの記述子を計算します。
- フレームの記述子をオブジェクトの記述子に一致させます。
- 結果を描画します。
問題: 6 番目のステップでセグメンテーション違反が発生します (以下のコードを参照)。
質問:何が原因で、どうすれば修正できますか?
ありがとうございました!
ノート:
- プログラムは、segfault の前に数フレーム実行されます。クラッシュはフレーム 23 で発生します。フレーム 23 は、コンテンツを含む (完全に黒ではない) ビデオの最初のフレームです。
- の行を削除することにより、クラッシュ
drawMatches(...);
はありません。 - Windows 7、OpenCV 2.4.2、MinGW で動作します。
デバッグ試行:
gdb を介してプログラムを実行すると、次のメッセージが表示されます。
Program received signal SIGSEGV, Segmentation fault.
0x685585db in _fu156___ZNSs4_Rep20_S_empty_rep_storageE () from c:\opencv\build\install\bin\libopencv_features2d242.dll
ステップ 1 - オブジェクトの画像の読み取り:
Mat object;
object = imread(OBJECT_FILE, CV_LOAD_IMAGE_GRAYSCALE);
ステップ 2 - オブジェクト内のキーポイントの検出と記述子の計算:
SurfFeatureDetector detector(500);
SurfDescriptorExtractor extractor;
vector<KeyPoint> keypoints_object;
Mat descriptors_object;
detector.detect(object , keypoints_object);
extractor.compute(object, keypoints_object, descriptors_object);
手順 3 ~ 6:
VideoCapture capture(VIDEO_FILE);
namedWindow("Output",0);
BFMatcher matcher(NORM_L2,true);
vector<KeyPoint> keypoints_frame;
vector<DMatch> matches;
Mat frame,
output,
descriptors_frame;
while (true)
{
//step 3:
capture >> frame;
if(frame.empty())
{
break;
}
cvtColor(frame,frame,CV_RGB2GRAY);
//step 4:
detector.detect(frame, keypoints_frame);
extractor.compute(frame, keypoints_frame, descriptors_frame);
//step 5:
matcher.match(descriptors_frame, descriptors_object, matches);
//step 6:
drawMatches(object, keypoints_object, frame, keypoints_frame, matches, output);
imshow("Output", output);
waitKey(1);
}
セグメンテーション違反直前のスクリーンショット:
フレーム 22 (完全な黒):
フレーム 23 (セグメンテーション違反が発生):