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 точки, но эти значения не относятся к системе координат устройства.

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

Спасибо


person Mukesh    schedule 01.06.2015    source источник
comment
Итак, проблема в том, что вы не можете построить CropView (Polygon) поверх изображения? Верно?   -  person Skynet    schedule 02.06.2015
comment
Нет, я просто хочу преобразовать cv::Point в CGPoint, чтобы я мог добавить точки uiview в эти точки и добавить функцию обрезки. cv::Point не являются координатами устройства. Есть ли какая-либо формула для ее преобразования.   -  person Mukesh    schedule 02.06.2015
comment
@muku у меня похожая проблема, смогли ли вы найти решение этой cvpoint для cgpoint ..   -  person Dave    schedule 07.07.2015
comment
К вашему сведению: CIDetector класса Apple предлагает аналогичные функции обнаружения прямоугольников.   -  person Alec    schedule 01.09.2016


Ответы (2)


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

  1. Получите размеры x и y изображения, которое вы записываете, во время сеанса AV Capture с камеры.
  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
    }
}
person pale bone    schedule 30.03.2017

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

Например. Если размер изображения находится в пределах экрана, проблем нет, вы можете напрямую использовать 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);
person Mukesh    schedule 08.07.2015