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

Opencv cvFindContours - нахождение контуров и сортировка по горизонтали - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить, является ли система магистралей чётно-нечётной или нет http://www.cyberforum.ru/cpp-beginners/thread1176444.html
Условие Предположим, что есть страна с N городами. Дана система магистралей, соединяющая напрямую города между собой. Движение по магистрали возможно в обе стороны. Длина любого прямого соединения равна 1. Для того, чтобы система магистралей называлась чётно-нечётной, необходимо, чтобы каждая пара различных городов была соединена маршрутом как чётной длины, так и нёчетной длины (причём...
C++ Минимальная длина маршрута робота Условие Имеется план местности, разбитой на квадраты, заданный матрицей размера N × M. Каждый квадрат c координатами (i, j) имеет высоту относительно уровня моря, значение которой определяется натуральным числом Aij (нумерация строк и столбцов матрицы A начинается с 1, верхний левый квадрат матрицы имеет координаты (1, 1)). Робот может двигаться только по местности и только параллельно осям ОX и... http://www.cyberforum.ru/cpp-beginners/thread1176442.html
Найти количество двух- и количество трехразрядных чисел в заданной последовательности C++
Помогите,пожалуйста, написать программу. Вводится последовательность из Nцелых чисел. Найти количество двух-и количество трехразрядных чисел в последовательности (функцией оформить определение количества разрядов числа).
C++ Вывести все ISBN российских изданий
Ребята помогите решить задачу.Имеется текст, содержащий среди прочего ISBN различных изданий. Вывести все ISBN российских изданий. Например Российский ISBN 9785161484100, немецкий ISBN 9783161484100 и разница в 4ой цифре как все это написать на С++. Заранее спасибо!
C++ Стандартный класс stack: как вывести все его содержимое на экран http://www.cyberforum.ru/cpp-beginners/thread1176411.html
Добрый день, в общем следующая проблема, работаю с шаблонным классом stack, хочу разобраться как вывести все его содержимое на экран или как обращаться к ячейкам его, вот например std::stack <int> s; // инициализирую переменную типа stack s.push(3);// заполняю его тремя числами s.push(4); s.push(5); // не знаю как вывести все его значения на экран
C++ Азбука Морзе: перевод в русский язык и обратно Доброго времени суток! Мне нужна помощь. Я не могу в конструкторе сделать программу которая могла бы переводить русский язык в азбуку морзе и обратно. Да туплю. Стрессия. Расчитываю на вашу помощь. В замен могу предоставить разумную финансовую помощь :) Добавлено через 40 минут Я не могу в конструкторе Точнее в формах..:) подробнее

Показать сообщение отдельно
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
16.05.2014, 17:20  [ТС]     Opencv cvFindContours - нахождение контуров и сортировка по горизонтали
Цитата Сообщение от iRomul Посмотреть сообщение
gore-lykovoe, скиньте код
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//-------------------------------------------------------------------------------------
// помогает упорядочивать контуры горизонтально
struct ProcessingImage::Hor {
    int x;
    int i;
    friend bool operator < (Hor const &a, Hor const &b) {
        return a.x < b.x;
    }
};
//-------------------------------------------------------------------------------------
void ProcessingImage::SortHor(Hor *a, int n) {
    int j = 0;
    for (int i = 1; i < n; ++i) {
        Hor temp = a[i];
        for (j = i; j > 0 && temp < a[j - 1]; --j) {
            a[j] = a[j-1];
        }
        a[j] = temp;
    }
}
//-------------------------------------------------------------------------------------
// получение матриц контуров (символов)
QVector<Matrix> ProcessingImage::get_contours_pixels() {
    if (!approx_contours) {
        throw UninitializedData("Uninitialized approx_contours "
                                "ProcessingImage::get_contours_pixels()");
    }
    CvSeq* copy_approx_contours = approx_contours;
    int k = 0; // количество контуров
    // находим количестве контуров
    for(; copy_approx_contours != 0; copy_approx_contours = copy_approx_contours->h_next, ++k );
    Hor hor[k];
    CvMat data;
    CvSeq* approx_contours2 = approx_contours;
    for(int z = 0; approx_contours2 != 0; approx_contours2 = approx_contours2->h_next, ++z ) {
            CvPoint* p = (CvPoint*)cvGetSeqElem(approx_contours2, z);
            if (!p) {
                throw UninitializedData("Uninitialized p "
                                        "ProcessingImage::get_contours_pixels()");
            }
            hor[z].i = z;
            hor[z].x = p->x;
    }
 
    // упорядочиваем контуры горизонтально
   SortHor(hor, k);
   QVector<Matrix> input_list;
   Matrix input[k];
 
    for(int t = 0; approx_contours != 0; approx_contours = approx_contours->h_next, ++t)
    {
        // получаем прямоугольный контур
        CvRect rect=cvBoundingRect(approx_contours, NULL);
        cvGetSubRect(threshold_smooth_gray_image, &data, rect);
        cv::Mat convData = cv::Mat(&data);
        cv::Mat scaledConvData;
        // изменяем размер
        cv::resize(convData, scaledConvData, cv::Size(col, row), 0, 0, CV_INTER_NN);
        data = scaledConvData;
 
        Matrix countour_pixels;
        // получаем писксели контура
        for (int i = 0; i < data.rows; ++i) {
            uchar* ptr = (uchar*) (data.data.ptr + i * data.step);
            if (!ptr) {
                throw UninitializedData("Uninitialized ptr"
                                        "ProcessingImage::get_contours_pixels()");
            }
            for (int j = 0; j < data.cols; ++j) {
                if (ptr[j] == 255)
                    countour_pixels[i][j] = 1;
                else
                    countour_pixels[i][j] = 0;
            }
        }
        input[hor[t].i] = countour_pixels;
 
    }
 
    for (int i = 0; i < k; ++i) {
        input_list.push_back(input[i]);
    }
 
    return input_list;
}
Гавнокод, но это временно. Первый раз пробегаюсь по контурам чтобы получить их число в "k". Потом пробегаюсь еще раз по ним чтобы загнать в структуру Hor координату и порядковый номер. Потом уже кладу в контейнер данные. На выходе иногда данные перемешанные случайным образом.

Добавлено через 6 минут
На 2 контурах он сортирует всегда правильно. Если 3 контура то иногда неправильно. Если 5 и больше, то всегда неправильно практически.
С перевернутым изображением код был такой же, только убрал сортировку, структуру и два ненужных прогона.
 
Текущее время: 09:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru