将 CGPoint 数组传回 swift
Passing CGPoint array back to swift
有谁知道是否可以将 CGPoint 数组从 objective c++ 传递到 swift?
我可以将 CGPoint 传回 swift。但是,我无法弄清楚如何将值作为数组传回。
这是我用来将其传回给 swift 的代码。
OpenCVWrapper.mm
+(CGPoint) detectCircle:(UIImage *)image
{
CGPoint pointArray;
cv::Mat img;
UIImageToMat(image, img);
cv::Mat grayMat;
cvtColor(img, grayMat, CV_BGR2GRAY);
cv::Mat dilateMat;
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(7,7));
cv::morphologyEx(grayMat, dilateMat, cv::MORPH_OPEN, kernel);
cv::Mat cannyMat;
Canny(dilateMat, cannyMat, 10, 100);
cv::Mat guassianMat;
cv::GaussianBlur(cannyMat, guassianMat, cv::Size(11,13), 0);
std::vector<cv::Vec3f> circleMat;
cv::HoughCircles(guassianMat, circleMat, CV_HOUGH_GRADIENT, 1, cannyMat.rows / 15,120, 10, 0, 30);
cv::Mat houghCircles;
houghCircles.create(guassianMat.rows, guassianMat.cols, CV_8UC1);
for( size_t i = 0; i < circleMat.size(); i++ )
{
cv::Vec3i parameters = circleMat[i];
double x, y;
int r;
x = parameters[0];
y = parameters[1];
r = int(parameters[2]);
pointArray.x = x;
pointArray.y = y;
}
return pointArray;
}
OpenCVWrapper.h
+(CGPoint) detectCircle: (UIImage *)image;
viewController.Swift
@IBAction func detectBtn(_ sender: Any) {
var points : CGPoint = OpenCVWrapper.detectCircle(adjustBtightnessImage)
print(points)
}
执行此操作的最佳方法是使用 NSValue
将其包装起来,如@OOPer 所说。
主要原因是CGPoint
不是Objective-C中的对象类型。你不能直接把它放在 NSArray
中。您需要将其包装在 NSValue
.
中
// Objective-C
+ (NSArray<NSValue *> *)detectCircle:(UIImage *)image {
return @[
[NSValue valueWithCGPoint:CGPointMake(10, 10)],
[NSValue valueWithCGPoint:CGPointMake(10, 20)]
];
}
// swift
let points = Circle.detect(UIImage()).map { [=10=].cgPointValue }
有谁知道是否可以将 CGPoint 数组从 objective c++ 传递到 swift?
我可以将 CGPoint 传回 swift。但是,我无法弄清楚如何将值作为数组传回。
这是我用来将其传回给 swift 的代码。
OpenCVWrapper.mm
+(CGPoint) detectCircle:(UIImage *)image
{
CGPoint pointArray;
cv::Mat img;
UIImageToMat(image, img);
cv::Mat grayMat;
cvtColor(img, grayMat, CV_BGR2GRAY);
cv::Mat dilateMat;
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(7,7));
cv::morphologyEx(grayMat, dilateMat, cv::MORPH_OPEN, kernel);
cv::Mat cannyMat;
Canny(dilateMat, cannyMat, 10, 100);
cv::Mat guassianMat;
cv::GaussianBlur(cannyMat, guassianMat, cv::Size(11,13), 0);
std::vector<cv::Vec3f> circleMat;
cv::HoughCircles(guassianMat, circleMat, CV_HOUGH_GRADIENT, 1, cannyMat.rows / 15,120, 10, 0, 30);
cv::Mat houghCircles;
houghCircles.create(guassianMat.rows, guassianMat.cols, CV_8UC1);
for( size_t i = 0; i < circleMat.size(); i++ )
{
cv::Vec3i parameters = circleMat[i];
double x, y;
int r;
x = parameters[0];
y = parameters[1];
r = int(parameters[2]);
pointArray.x = x;
pointArray.y = y;
}
return pointArray;
}
OpenCVWrapper.h
+(CGPoint) detectCircle: (UIImage *)image;
viewController.Swift
@IBAction func detectBtn(_ sender: Any) {
var points : CGPoint = OpenCVWrapper.detectCircle(adjustBtightnessImage)
print(points)
}
执行此操作的最佳方法是使用 NSValue
将其包装起来,如@OOPer 所说。
主要原因是CGPoint
不是Objective-C中的对象类型。你不能直接把它放在 NSArray
中。您需要将其包装在 NSValue
.
// Objective-C
+ (NSArray<NSValue *> *)detectCircle:(UIImage *)image {
return @[
[NSValue valueWithCGPoint:CGPointMake(10, 10)],
[NSValue valueWithCGPoint:CGPointMake(10, 20)]
];
}
// swift
let points = Circle.detect(UIImage()).map { [=10=].cgPointValue }