Перейти к содержимому
Compvision.ru

kazanOpenCV

Пользователи
  • Количество публикаций

    27
  • Зарегистрирован

  • Посещение

Репутация

0 Новичек

О kazanOpenCV

  • Звание
    Бывалый
  1. Вопрос по findContours

    mrgloom, так я и использовал CV_CHAIN_APPROX_SIMPLE, чтобы исключить ручную обработку точек контура на предмет исключения прямых отрезков.
  2. Вопрос по findContours

    kilop, мне нужно чтобы прямые участки контура представлялись не поточечно, а отрезками, как раз для этого использую CV_CHAIN_APPROX_SIMPLE. Smorodov, а как мне тип связности поменять на 4?
  3. Вопрос по findContours

    Доброго времени суток, возникла проблема с findContours. Вопрос в следующем: есть квадрат: contours[1]([4]({x=10 y=10 },{x=110 y=10 },{x=110 y=110 },{x=10 y=110 })). Рисуем его на белом фоне черным цветом с черной заливкой. Убираем грани, т.е. уменьшаем каждую сторону квадрата на толщину 1 пиксел. С помощью cv::findContours( empty_image, contours_optimized,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); находим все контура на картинке, получаем: [0] [8]({x=10 y=11 },{x=11 y=10 },{x=109 y=10 },{x=110 y=11 },{x=110 y=109 },{x=109 y=110 },{x=11 y=110 },{x=10 y=109 }) - искомый контур. [1] [4]({x=1 y=1 },{x=1 y=1078 },{x=1918 y=1078 },{x=1918 y=1 }) - контур по периметру картинки Вопрос, почему найденный контур [8]({x=10 y=11 },{x=11 y=10 },{x=109 y=10 },{x=110 y=11 },{x=110 y=109 },{x=109 y=110 },{x=11 y=110 },{x=10 y=109 }) отличается от [4]({x=10 y=10 },{x=110 y=10 },{x=110 y=110 },{x=10 y=110 })?? Т.е почему он находит контур как на рис.1, а не как на рис.2 строгий квадрат?
  4. Уточнение контура объекта

    Smorodov, спасибо за очередную порцию полезных идей. По п.0) если умножить все значения, например на 10, то разве "прыжков" станет меньше? Или же усиливать только "окрестности" значений, соответствующих началу и концу отрезка. По поводу п.1) можно поподробнее? не совсем понял.
  5. Уточнение контура объекта

    Всем доброго времени суток, на картинке слева результат работы Gimp'а, справа моего алгоритма. Пока еще дорабатываю, остаются вопросы по скорости и по детализации мелких деталей. Вообщем есть большое поле для оптимизации. Smorodov, mrgloom большое вам спасибо за ощутимую помощь, думаю еще возникнут вопросы и не раз)
  6. Уточнение контура объекта

    mrgloom, спасибо, посмотрю. Первая ссылка в любом случае мне помогла в плане понимания.
  7. Уточнение контура объекта

    Пришла в голову идея определять вес ребра, соединяющего 2 пикселя, как Weight ((i,j); (i1,j1))=(Max - 1/2*(img(i,j)+img(i1,j1)))*koef; koef=sqrt(2) для диагональных ребер, =1 для верикальных и горизонтальных ребер. Max-для grayscale =255, для чернобелого изображения =1. Возможно в этом случае кратчайший путь будет идти по границе, а не скакать по диагоналям как на рисунке 1 в посте №32.
  8. Уточнение контура объекта

    mrgloom, так Dijkstra, насколько, я понял работает именно перебором всех узлов графа. Если координаты концов отрезка (x1,y1)-(x2,y2), то получается прямоугольный граф с количеством узлов N=(x2-x1+1)*(y2-y1+1) и количеством ребер L=(x2-x1-1)*(y2-y1-1)*8+ //серединные пиксели - у них по 8 связей со всеми остальными +(width-2)*2*5+(height-2)*2*5+ //краевые пиксели без угловых - у них по 5 связей со всеми остальными +4*3; //угловые пиксели - у них по 3 связи со всеми остальными Upd. Единственное, можно остановиться когда дойдем до узла, соответствующего концу отрезка, но как много узлов будет уже посещено до этого зависит от характера картинки. Но в среднем, конечно это ускорит выполнение алгоритма.
  9. Уточнение контура объекта

    Smorodov, да, я использую кусок исходного изображения соответствующий отрезку. Исходник на CUDA смотрел, но там нужно подключать Boost Graph Library, не хотелось бы. Пока реализовал сам на основе кода с priority_queue, выкладываю программу, если будет время посмотрите, пожалуйста. Там небольшая проблемка (см. приложенный рисунок). На рисунке тестовое изображение 10x10 пикселов. Черная горизонтальная полоса на уровне второго пиксела сверху на белом фоне. Граф состоит из 100 вершин. Веса для соединяющих ребер нахожу как в http://www.cs.washington.edu/education/courses/cse455/02wi/projects/project1/project1.htm (см. рис.2). В итоге кратчайший путь из 10 вершины в 9 определяется как показано красной линией (т.е. путь из номеров пикселов 10-1-12-3-14-5-16-7-18). Вероятно я что то делаю не так. Dijkstra.rar
  10. Уточнение контура объекта

    Для куска изображения размером 200x200 пикселов (количество вершин графа 40 000), время выполнения алгоритма поиска кратчайшего пути от заданной точки до всех остальных ~25 секунд. Что-то многовато. Если 1920x1080 то совсем долго будет. Как же, интересно, реализуют подобные алгоритмы в gimp или photoshope. Smorodov, mrgloom, может быть есть соображения по оптимизации?
  11. Уточнение контура объекта

    Smorodov, спасибо за ссылку. Нашел вот такой алгоритм Дейкстры. он ищет минимальную "стоимость пути" от исходного узла до всех узлов. Чтобы сформировать цепочку из узлов я добавил код с комментарием //kazanOpenCV 18.02.2013. Еще не проверял, вечером попробую скомпилировать. #include <cstdio> #include <queue> #include <vector> using namespace std; #define MAX 100001 #define INF (1<<20) #define DEBUG if(0) #define pii pair< int, int > #define pb(x) push_back(x) struct comp { bool operator() (const pii &a, const pii &B )/>/>/>/> { return a.second > b.second; } }; priority_queue< pii, vector< pii >, comp > Q; vector< pii > G[MAX]; int D[MAX]; bool F[MAX]; int main() { int i, u, v, w, sz, nodes, edges, starting; //kazanOpenCV 18.02.2013 vector<vector<int> > e; DEBUG freopen("in.txt","r", stdin); // create graph scanf("%d %d", &nodes, &edges); for(i=0; i<edges; i++) { scanf("%d %d %d", &u, &v, &w); G[u].pb(pii(v, w)); G[v].pb(pii(u, w)); // for undirected } scanf("%d", &starting); // initialize graph for(i=1; i<=nodes; i++) D[i] = INF; //kazanOpenCV 18.02.2013 for(i=1; i<=nodes; i++) e.push_back(vector<int>()); - начальное заполнение массива векторов пустыми векторами D[starting] = 0; Q.push(pii(starting, 0)); // dijkstra while(!Q.empty()) { u = Q.top().first; Q.pop(); if(F[u]) continue; sz = G[u].size(); DEBUG printf("visiting from %d:", u); for(i=0; i<sz; i++) { v = G[u][i].first; w = G[u][i].second; if(!F[v] && D[u]+w < D[v]) { DEBUG printf(" %d,", v); D[v] = D[u] + w; //kazanOpenCV 18.02.2013 //std::vector<int> newvector(oldvector); -копирование одного вектора в другой std::vector<int> e[v](e[u]);//-копирование одного вектора в другой // vector<vector<int> > e; // e.push_back(vector<int>()); e[v].push_back(u);//вставка элемента u в конец цепочки узлов в пути Q.push(pii(v, D[v])); } } DEBUG printf("\n"); F[u] = 1; // done with u } // result for(i=1; i<=nodes; i++) printf("Node %d, min weight = %d\n", i, D[i]); return 0; }
  12. Уточнение контура объекта

    Smorodov, спасибо, сейчас занимаюсь как раз этим!
  13. Уточнение контура объекта

    Добрый день, на скриншоте результат - третье маленькое окно сверху с белым контуром. Белый контур - это попиксельно найденный c помощью Sobel. Есть проблема когда в фрагменте несколько ощутимызх перепадов яркости, как быть в этом случае? Нужно искать максимум по каким-то критериям. Вообщем застопорился.
  14. Уточнение контура объекта

    mrgloom, спасибо за ощутимую помощь и внимание к теме.
  15. Уточнение контура объекта

    Smorodov, спасибо.
×