C++ 使用OpenCV分解来自目标C的同形图

C++ 使用OpenCV分解来自目标C的同形图,c++,objective-c,swift,opencv,C++,Objective C,Swift,Opencv,我正在尝试使用openCV的decomposeHomographyMat函数。我是一个更敏捷的人,但为此我必须使用客观的C语言。函数的签名是 cv::decomposeHomographyMat( <#InputArray H#>, <#InputArray K#>, <#OutputArrayOfArrays rotations#>, <#OutputArrayOfArrays translations#>, <#

我正在尝试使用openCV的
decomposeHomographyMat
函数。我是一个更敏捷的人,但为此我必须使用客观的C语言。函数的签名是

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

+ (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");
}
+(可为空的NSArray*)分解同调:(NSArray*\u Nonnull)单应插值:(NSArray*\u Nonnull)插值
{
cv::Mat旋转、平移、法线;
向量H(3,向量(3));

对于(int i=0;i您需要将
NSArray
转换为
std::vector
,并将其馈送到
cv::decompostehomographyMat

- (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);
}
-(std::vector)getVectorFrom:(NSArray*)arr{
std::向量ret(3,向量(3));
对于(int i=0;i使用
std::vector
进行旋转、平移、法线;对于H、K使用Mat。感谢您为我指明了正确的方向
- (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);
}