1

記述子(SurfDescriptorExtractor出力)とキーポイント(SurfFeatureDetector出力)の両方をXMLファイルに書き込んでいます。キーポイント(std :: vector)を書き込む前に、Matへの変換が行われます(これに続いて:キーポイントをmatに変換するか、テキストファイルopencvに保存します)。記述子は必須ではありませんが、すでにマットです。したがって、両方ともマットとして保存され、どちらも読むことに問題はありません。ただし、FlannBasedMatcherを使用してからdrawMatchesを使用する場合、このメソッドはキーポイントデータを要求します。

問題は、MatをKeypointのベクトルにどのように変換するか、そしてどちらが最良のアプローチであるかということです。

4

2 に答える 2

1

OpenCVソース(/modules/java/generator/src/cpp/converters.cppの下、185行目あたり)を見てこれを見つけました:

void Mat_to_vector_KeyPoint(Mat& mat, vector<KeyPoint>& v_kp)
{
    v_kp.clear();
    CHECK_MAT(mat.type()==CV_32FC(7) && mat.cols==1);
    for(int i=0; i<mat.rows; i++)
    {
        Vec<float, 7> v = mat.at< Vec<float, 7> >(i,0);
        KeyPoint kp(v[0], v[1], v[2], v[3], v[4], (int)v[5], (int)v[6]);
        v_kp.push_back(kp);
    }
    return;
}

そして私はそれを次のように使用しています:

vector<KeyPoint> mat_to_keypoints(Mat* mat) {

    vector<KeyPoint>  c_keypoints;

    for ( int i = 0; i < mat->rows; i++) {
        Vec<float, 7> v = mat.at< Vec<float, 7> >(i,0);

        KeyPoint kp(v[0], v[1], v[2], v[3], v[4], (int)v[5], (int)v[6]);

        c_keypoints.push_back(kp);

    };

    return c_keypoints;

};
于 2013-02-16T04:09:36.273 に答える
1

これは、opencvソースコードJavaで変換を行う方法です。この変換は、C ++で見つかりませんでした。存在しない可能性がありますが、これをC++に変換できるかもしれませんが、それほど複雑ではありません。

 //Code from Opencv4Android: utils/Converters.java
 public static void Mat_to_vector_KeyPoint(Mat m, List<KeyPoint> kps) {
        if (kps == null)
            throw new java.lang.IllegalArgumentException("Output List can't be null");

        int count = m.rows();
        if (CvType.CV_64FC(7) != m.type() || m.cols() != 1)
            throw new java.lang.IllegalArgumentException(
                    "CvType.CV_64FC(7) != m.type() ||  m.cols()!=1\n" + m);

        kps.clear();
        double[] buff = new double[7 * count];
        m.get(0, 0, buff);

        for (int i = 0; i < count; i++) {
            kps.add(new KeyPoint((float) buff[7 * i], (float) buff[7 * i + 1], (float) buff[7 * i + 2], (float) buff[7 * i + 3],
                    (float) buff[7 * i + 4], (int) buff[7 * i + 5], (int) buff[7 * i + 6]));
        }
    }
于 2013-02-15T17:53:32.403 に答える