iOS получает CGPoint от openCV cv :: Point

введите описание изображения здесь

На изображении выше мы видим точку, нарисованную на изображении некоторыми openCV algorithm,

Я хочу нарисовать UIView указать на эти точки, чтобы пользователь мог обрезать его.

Я не понимаю, как я получу доступ к этим точкам, чтобы я мог добавить uiview точки.

Я пытался прочитать cv::Point , но значение просто отличается (больше) от высоты и ширины координат.

static cv::Mat drawSquares( cv::Mat& image, const std::vector<std::vector<cv::Point> >& squares )
{

int max_X=0,max_Y=0;
int min_X=999,min_Y=999;
for( size_t i = 0; i < squares.size(); i++ )
{
const cv::Point* p = &squares[i][0];
int n = (int)squares[i].size();

NSLog(@"Squares%d %d %d",n,p->x,p->y);

polylines(image, &p, &n, 1, true, cv::Scalar(0,255,0), 3, cv::LINE_AA);

}return image;
}

В приведенном выше коде,drawsquare Метод рисования квадратов. У меня есть NSLog точка x, y координирует, но эти значения не относятся к системе координат устройства.

Может кто-нибудь помочь мне, как это может быть достигнуто Или альтернатива моему требованию.

Спасибо

6

Решение

На самом деле из-за размера изображения координаты отображаются по-разному,

Например, Если размер изображения находится в пределах экрана, проблем нет, вы можете напрямую использовать cvPoint как CGPoint,

Но если дело в том, что размер изображения составляет 3000 * 2464, что является приблизительным размером изображения, полученного камерой, тогда нужно применить некоторую формулу.

Ниже приведен способ, который я получил из Интернета, и он помог мне извлечь CGPoint из cvPoint, когда размер изображения больше, чем размер экрана

Получить масштабный коэффициент изображения

- (CGFloat) contentScale
{
CGSize imageSize = self.image.size;
CGFloat imageScale = fminf(CGRectGetWidth(self.bounds)/imageSize.width, CGRectGetHeight(self.bounds)/imageSize.height);
return imageScale;
}

Предположим, что это cvPoint (переменная _pointA), а затем, используя приведенную ниже формулу, вы можете извлечь ее.

tmp = CGPointMake((_pointA.frame.origin.x) / scaleFactor, (_pointA.frame.origin.y) / scaleFactor);
0

Другие решения

Это в Swift 3. В классе Swift, который вы возвращаете cv::Points чтобы:

  1. Получить x а также y размеры изображения, которое вы записываете с вашего Захват AV камеры
  2. Разделите x а также y размерность UIview вы используете для визуализации изображения по измерениям изображения сеанса захвата в X и Y
  3. Умножьте точку x а также y координаты по шкале x а также y размеры

{
let imageScaleX = imgView.bounds.width/(newCameraHelper?.dimensionX)!
let imageScaleY = imgView.bounds.height/(newCameraHelper?.dimensionY)!
for point in Squares {
let x = point.x * imageScaleX
let y = point.y * imageScaleY
}
}
0