使用Objective C中的OpenCV decomposeHomographyMat

时间:2017-06-22 01:52:52

标签: c++ objective-c swift opencv

我正在尝试使用openCV的decomposeHomographyMat函数。我更像是一个斯威夫特人,但为此,我要使用Objective C神秘语言。该功能的签名是

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

我输入的K和H都是NSArray<NSNumber*> *_Nonnull,每个都有9个元素。

如何创建预期的InputArrayOutputArrayOfArrays,如何将OutputArrayOfArrays转换回类型,Objective C可以传递给swift?

===编辑===

尝试使用以下语句调用cv::decomposeHomographyMat时,Quang的答案崩溃了。

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 个答案:

答案 0 :(得分:1)

您需要将android:backgroud="@drawable/yourimage"转换为NSArray并将其提供给std::vector<vector<float> >。例如

cv::decomposeHomographyMat