Форум программистов, компьютерный форум CyberForum.ru

OpenCV определить координаты точки по матрице преобразований - C++

Восстановить пароль Регистрация
 
GVA_
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
14.06.2016, 16:09     OpenCV определить координаты точки по матрице преобразований #1
Проблема в следующем: есть картинка полученная с камеры, точнее видеопоток по отдельным картинкам. На картинке определенная область (квадрат или прямоугольник) и внутри области есть точка, координаты которой меня интересуют.
Задача получить координаты точки относительно заданной области.
Я ее решаю следующим образом: в openCV преобразую картинку в однобитную, затем используя исходную картинку и координаты вершин области, делаю корректировку перспективных искажений по матрице преобразований, в результате чего получаю еще одну картинку, с откорректированной перспективой, т.е. реальный квадрат, либо прямоугольник и уже на нем нахожу координаты искомой точки. Программа работает, только перспективные преобразования и получение откорректированной картинки занимает определенной время, в результате на видео заметны задержки.
По сути мне вся откорректированная картинка не нужна, ведь для ее получения при разрешении 640*480 пересчитываются координаты 300к точек, а надо получить координаты только одной точки зная ее координаты на исходном изображении и матрицу преобразований. Если кто знает как это сделать подскажите пожалуйста. Вот кусок кода как я это делаю:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
        
                // точки для матрицы преобразования перспективы
        CvPoint2D32f srcQuad[4], dstQuad[4];
 
        // матрица преобразования
        CvMat* warp_matrix = cvCreateMat(3, 3, CV_32FC1);
 
        // клонируем картинку
        dst = cvCloneImage(src);
 
        // задаём точки
        src[0].x = config[0];                             // координаты вершин области Top left 
        src[0].y = config[1];
        src[1].x = config[2];                            // Top right
        src[1].y = config[3];
        src[2].x = config[4];                             // Bottom left
        src[2].y = config[5];
        src[3].x = config[6];                    // Bottom right
        src[3].y = config[7];
        //- - - - - - - - - - - - - -//
        dstQuad[0].x = 0;                //Координаты вершин после коррекции dst Top left
        dstQuad[0].y = 0;
        dstQuad[1].x = src->width;           //dst Top right
        dstQuad[1].y = 0;
        dstQuad[2].x = 0;                //dst Bottom left
        dstQuad[2].y = src->height;
        dstQuad[3].x = src->width;           //dst Bottom right
        dstQuad[3].y = src->height;
 
        // получаем матрицу преобразования
        cvGetPerspectiveTransform(srcQuad, dstQuad, warp_matrix);
        // преобразование перспективы
        cvWarpPerspective(src, dst, warp_matrix);
 
        // показываем
        cvNamedWindow("cvWarpPerspective", 1);
        cvShowImage("cvWarpPerspective", dst);
 
        
        // находим координаты точки
        int x = 0;
        int y = 0;
        int Xc = 0;
        int Yc = 0;
        
 
        // пробегаемся по пикселям изображения
        for (int y = 0; y<dst->height; y++)
        {
            uchar* ptr = (uchar*)(dst->imageData + y * dst->widthStep);
            for (int x = 0; x<dst->width; x++)
            {
                if (ptr[x]>0)
                {
                    Xc = x;
                    Yc = y;
                }
            }
        }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2016, 16:09     OpenCV определить координаты точки по матрице преобразований
Посмотрите здесь:

C++ Определить полярные координаты точки
Ввести с клавиатуры координаты точки (x,y). Определить попала ли точка в заштрихованную область C++
C++ Диагонали (Четыре точки являются вершинами параллелограмма. Определить длину диагоналей и найти координаты )
C++ Определить принадлежность точки, координаты которой вводятся с клавиатуры, заштрихованной области
C++ Ввести координаты точки на плоскости, и определить, попала ли эта точка в заштрихованную область
Ввести координаты точки и определить, попадает ли точка в заштрихованную область C++
C++ Определить координаты точки наиболее близкой к центру тяжести
C++ Выбрать в вектор координаты от одной точки до другой по матрице высот

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GVA_
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
15.06.2016, 17:15  [ТС]     OpenCV определить координаты точки по матрице преобразований #2
Нашел решение при помощи perspectiveTransform вместо cvWarpPerspective. Сравнил скорость, разница примерно в 25 раз быстрее.
Yandex
Объявления
15.06.2016, 17:15     OpenCV определить координаты точки по матрице преобразований
Ответ Создать тему
Опции темы

Текущее время: 12:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru