gpt4 book ai didi

c++ - 将 vector 转换为 NSArray,以便将其传递给 Swift 类

转载 作者:行者123 更新时间:2023-11-30 03:21:44 34 4
gpt4 key购买 nike

我正在使用 dlib 的面部标志检测器,并希望将面部标志坐标存储在可在 Swift 中使用的数组中。

此时我已将地标坐标存储在 vector 中:

std::vector<dlib::point> facialLandmarks;

for (unsigned long k = 0; k < shape.num_parts(); k++) {
dlib::point p = shape.part(k);

facialLandmarks.push_back(p);
}

我现在想编写一个函数,将 vector 转换为 NSArray,以便我可以返回数组并在我的 Swift 代码中使用它。

当我尝试以下操作时:

 NSArray* facialLandmarksArray = &facialLandmarks[0];

我得到一个错误:

Cannot initialize a variable of type 'NSArray *__strong' with an rvalue of type 'std::__1::__vector_base<dlib::vector<long, 2>, std::__1::allocator<dlib::vector<long, 2> > >::value_type *' (aka 'dlib::vector<long, 2> *')

我真的对 Objective-C 或 C++ 知之甚少,但需要将其用于 Dlib。非常感谢任何帮助!

最佳答案

NSArray 只能包含 Objective-C 对象,不能包含 C++ 对象。所以你必须首先将你的点转换为 NSValue。这样的事情应该有效:

NSMutableArray* facialLandmarksArray = [NSMutableArray arrayWithCapacity: facialLandmarks.size()];

for (auto const& pt: facialLandmarks) {
[facialLandmarksArray addObject: [NSValue valueWithCGPoint:CGPointMake(pt.x, pt.y)]];
}

并确保它被编译为 Objective-C++(文件结尾为 *.mm)。

但是,请注意,这对于大型 vector 来说效果不佳。 SwiftC++ 都能够确保此类数组/vector 的值存储在 consecutive memory 中。 , 通过 Objective-C 桥接会破坏这个地方。

关于c++ - 将 vector<dlib::point> 转换为 NSArray,以便将其传递给 Swift 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51840794/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com