2017-06-22 13 views
0

openCVのdecomposeHomographyMat機能を使用しようとしています。私はスウィフトの人ですが、そのためにObjective Cの不思議な言葉を使用しました。関数のシグネチャは、私は、両方の9つの要素それぞれとNSArray<NSNumber*> *_Nonnullされた入力KとHをしたObjective CのOpenCV decomposeHomographyMatを使用してください

cv::decomposeHomographyMat(
    <#InputArray H#>, 
    <#InputArray K#>, 
    <#OutputArrayOfArrays rotations#>, 
    <#OutputArrayOfArrays translations#>, 
    <#OutputArrayOfArrays normals#> 
) 

あります。

は、どのように私は期待InputArrayOutputArrayOfArraysを作成することができ、そしてどのように私はタイプのObjective CへOutputArrayOfArraysバックが迅速に渡すことができます変換するのですか? cv::decomposeHomographyMatを呼び出すとき

===編集===

クアンの答えをしようとは墜落:

OpenCV Error: Assertion failed (0 <= i && i < (int)vv.size()) in getMat_, 
file .../opencv/modules/core/src/matrix.cpp, line 1287 

コードです:

+ (nullable NSArray<NSNumber*> *) decomposeHomography:(NSArray<NSNumber*> *_Nonnull) homography intrisics:(NSArray<NSNumber*> *_Nonnull) intrisics 
{ 
    cv::Mat rotations, translations, normals; 
    vector<vector<float> > H(3,vector<float>(3)); 
    for (int i = 0; i<3; ++i){ 
    for (int j = 0; j<3; ++j){ 
     H[i][j] = [homography[i*3 + j] floatValue]; 
    } 
    } 
    vector<vector<float> > K(3,vector<float>(3)); 
    for (int i = 0; i<3; ++i){ 
    for (int j = 0; j<3; ++j){ 
     K[i][j] = [intrisics[i*3 + j] floatValue]; 
    } 
    } 

    cv::decomposeHomographyMat(
       H, 
       K, 
       rotations, 
       translations, 
       normals 
); 
    NSLog(@"ok"); 
} 

答えて

1

あなたはstd::vector<vector<float> >NSArrayを変換する必要があるとそれをcv::decomposeHomographyMatに送ってください。たとえば、

- (std::vector<std::vector<float> >) getVectorFrom: (NSArray *) arr{ 

    std::vector<std::vector<float> > ret(3,vector<float>(3)); 

    for (int i = 0; i<3; ++i){ 
     for (int j = 0; j<3; ++j){ 
      ret[i][j] = [arr[i*3 + j] floatValue]; 
     } 
    } 
    return ret; 
} 

- (void) someFunction: (NSArray *)H with: (NSArray *)K{ 

    cv::Mat rotations, translations, normals; 

    cv::decomposeHomographyMat([self.getVectorFrom H], 
           [self.getVectorFrom K], 
           rotations, 
           translations, 
           normals); 
} 
+0

残念ながら、クラッシュします。私は私の答えを編集しました。 – Guig

+1

回転、平行移動、法線に 'std :: vector 'を使用する。 H、KのためのMatがあります。正しい方向に私を入れてくれてありがとう – Guig

関連する問題