我正在做一个基于iOS和Opencv的项目。我需要获得检测到的轮廓的坐标。 我想要的是比较边缘'坐标和我手动绘制的点的坐标。 我尝试将轮廓的结果向量转换为NsArray。但那是我得到这个错误的地方。
以下是代码:
-(UIImage*)findContourPoints:(UIImage*) proceesingImage
{
cv::Mat _image = [proceesingImage CVMat];
cv::Mat pyr, timg, gray0(_image.size(), CV_8U), gray;
int thresh = 50, N = 11;
cv::pyrDown(_image, pyr, cv::Size(_image.cols/2, _image.rows/2));
cv::pyrUp(pyr, timg, _image.size());
std::vector<std::vector<cv::Point> > contours;
for( int c = 0; c < 3; c++ ) {
int ch[] = {c, 0};
mixChannels(&timg, 1, &gray0, 1, ch, 1);
for( int l = 0; l < N; l++ ) {
if( l == 0 ) {
cv::Canny(gray0, gray, 0, thresh, 5);
cv::threshold(gray,gray,128,255,cv::THRESH_BINARY);
cv::dilate(gray, gray, cv::Mat(), cv::Point(-1,-1));
}
else {
gray = gray0 >= (l+1)*255/N;
}
cv::findContours(gray, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
std::vector<cv::Point> approx;
for ( int i = 0; i< contours.size(); i++ ) {
// draw contour
cv::drawContours(_image, contours, i, cv::Scalar(255,255,255), 1, 1, std::vector<cv::Vec4i>(), 0, cv::Point());
}
}
}
NSArray *myArray = [NSArray arrayWithObjects:&contours[0] count:contours.size()];
return [UIImage imageWithCVMat:_image];
}
或者有更好的解决方法吗?
答案 0 :(得分:0)
你做不到! NSArray
只能存储指向NSObject
的指针。 NSArray
会保留已存储的项目,此操作只能在NSObjects
上完成。
请注意,contours
包含一些C / C ++结构。
您有两种选择:在std::vector
中保存数据或在NSData
中保留数据并将其作为C结构的C数组进行威胁(第3个选项是装箱每个项目并将其存储在{{} 1}},但是无用的开销很大。)
IMO在这里使用NSArray
将无法获得任何收益。我会尽可能坚持使用C ++,只有最终结果转换为Objective-c
个对象。