5

私はOpenCVを学ぼうとしていますが、頭が固いので、次のアルゴリズムを実行しようとしています:

 cv::Mat cur_features;
 cv::goodFeaturesToTrack(current_image, cur_features, 400, 0.01, 0.01);

さて、頭の固い個人として、cur_features が保持しているものを確認することに興味があります... 400x2 cv::Mat を期待していましたが、代わりに 400x1 cv::Mat を取得しました

大したことではありませんが、おそらく直接的なインデックスだと思います。ただし、私の人生では、cur_features.at(0) から値を抽出して出力することはできません。

私は何を間違っていますか?goodFeaturesToTrack_Demo.cpp を見てきました。そのデモで注意すべき点がいくつかありますが、私のものとは異なります。その例を考えて、次の呼び出しを試しました。

 std::cout << cur_features.size() << std::endl; // This throws a compile time error even though its in the example
 std::cout << cur_features.at<Point2f>(0).x << std::endl; //This throws a run time error.

誰かが私の目標を達成する方法を説明するドキュメントに私を導くことができますか? goodFeaturesToTrack は、コーナーのベクトルである OutputArray を返すことを示していますが、それらのコーナーのタイプについてはどこにも説明していません。他の方法でこの回答を取得した場合、ドキュメントのどこでこの回答を探すことができますか?


編集: また、Mat::type()のポイントは何ですか。戻り値を説明できる場所が見つかりません...ドキュメントで列挙を探していますが、見つけるのに苦労しています。

 std::cout << current_image.type() << std::endl; //This returns 0
 std::cout << cur_features.type() << std::endl; //This returns 13
4

3 に答える 3

5

提案として、次元と型で行列を初期化してみてください

 cv::Mat cur_features(400,1,CV_32_FC1); //400x1 32 bits, 1 channel
 cv::Mat cur_features2(400,1,CV_32_FC2); //400x1 32 bits, 2 channels

Mat の値を取得するには

int pos = 0;
foat value = cur_features.at<float>(pos);
cv::Vec2f value2 = cur_features2.at<Vec2f>(pos); // for a two channel, CV_23F image

そして、私を大いに助けてくれた Visual Studio の便利なデバッグ テクニック

  • 1- デバッグ時に cur_features を右クリックします。
  • 2-クイックウォッチ
  • 3-これを書きます:

    (float*)cur_features.data,400

  • 4-配列のすべての値が表示されます

于 2012-06-13T11:34:01.220 に答える
4

私の goodFeaturesToTrack は 400x1 を返しますが、黒の画像で行っていたため、コーナーがないことがわかりました。これにより

 cur_features.data == NULL

C コードは C++ コードよりも簡単で使いやすいと思われる興味深い状況です。

于 2012-06-08T23:33:29.470 に答える
2

ここに記載されています:http://opencv.itseez.com/modules/imgproc/doc/feature_detection.html

vector<Point2f>出力配列としてa を指定する必要があります。

OpenCV のローカル コピーの goodFeaturesToTrack_Demo.cpp で次のように宣言されています。

  vector<Point2f> corners;
  ...
  /// Apply corner detection
  goodFeaturesToTrack( src_gray, 
               corners,
               maxCorners,
               qualityLevel,
               minDistance,
               Mat(),
               blockSize,
               useHarrisDetector,
               k );

更新: 上記のリンクでは、コーナーのテンプレート引数を使用しています。 ライブラリの 2.1 バージョンに関するhttp://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.htmlOutputArrayのドキュメントには、次のように記載されています。vector<Point2f>

于 2012-06-08T23:28:27.590 に答える