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

bugmenot

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

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

  • Посещение

Репутация

0 Новичек

О bugmenot

  • Звание
    Новичок
  1. У меня в питоне рисование полигонов и полилиний не работает, похоже на баг. Контуры без разрывов можно залить cvDrawContours если указать отрицательную толщину линии. Прямоугольники нарисованы поверх контуров только для наглядности, как нарисовать объект cvMinAreaRect уже пролетало на этом форуме. Я нарисовала так: for rect in rects: pt = cvBoxPoints(rect) cvLine(image, (cvRound(pt[0].x), cvRound(pt[0].y)), (cvRound(pt[1].x), cvRound(pt[1].y)), cvScalarAll(255)) cvLine(image, (cvRound(pt[1].x), cvRound(pt[1].y)), (cvRound(pt[2].x), cvRound(pt[2].y)), cvScalarAll(255)) cvLine(image, (cvRound(pt[2].x), cvRound(pt[2].y)), (cvRound(pt[3].x), cvRound(pt[3].y)), cvScalarAll(255)) cvLine(image, (cvRound(pt[3].x), cvRound(pt[3].y)), (cvRound(pt[0].x), cvRound(pt[0].y)), cvScalarAll(255)) [/php] Основной код программы пока довольно примитивен: [php] cvThreshold(image, image, 1, 255, CV_THRESH_OTSU) cvErode(image, image, None, 13) cvDilate(image, image, None, 10) image, rects = FindFiltContours(image, rects) cvErode(image, image, None, 14) cvDilate(image, image, None, 12) image, rects = FindFiltContours(image, rects) cvDilate(image, image, None, 5) В первой строке бинаризация изображения из первого поста. Функция FindFiltContours - двумя постами выше. Двойное присваивание - особенность питона. Мне так писать удобнее если функция возвращает несколько переменных. Последний cvDilate добавлен просто для равновесия, чтобы полностью восстановить все что покусано cvErode. Залитые контуры - готовая маска. Возможно стоит попробовать ею вырезать часть необработанного изображения и натравить что-то типа cvCanny.
  2. Спасибо всем, вы мне здорово помогли. Итак, некоторые прямоугольники найдены. Моя функция FindFiltContours находит и сортирует контура. Каждый подходящий контур вписывает в прямоугольник MinAreaRect, после чего контур удаляет. Код еще немного кривоват. def FindFiltContours(img): storage = cvCreateMemStorage(0) contour = cvCreateSeq( 0, sizeof_CvSeq, sizeof_CvPoint, storage ) contour = CvSeq_CvPoint.cast( contour ) rects = [] scanner = cvStartFindContours( img, storage ) while contour != None : contour = cvFindNextContour( scanner ) if (contour != None) : if (cvBoundingRect(contour).height < 70) and (cvBoundingRect(contour).width < 270) : rects.append(cvMinAreaRect2(contour)) cvSubstituteContour( scanner, None) contours = cvEndFindContours(scanner) cvZero( img ) cvDrawContours(img, contours, cvScalarAll(255), cvScalarAll(255), 2, -1) return img, rects [/php] Возникает следующий вопрос, теперь уже найденные прямоугольники нужно закрасить в черний цвет или перенести слипшиеся на новое изображение для дальнейшей обработки. Сложность в том, что полученные контуры не заливаются, хоть в cvDrawContours и указана отрицательная толщина линий. Странно, ведь полученные с помощью cvFindContours контуры отлично заливаются. А закрасить найденные прямоугольники у меня не вышло, никак не пойму что передать в полигон.
  3. После бинаризации с параметром CV_THRESH_OTSU и Erode-Dilate получаются более-менее разделенные доски. cvThreshold(pallet, pallet, 1, 255, CV_THRESH_OTSU) cvErode(pallet, pallet, None, 13) cvDilate(pallet, pallet, None, 10) Может будет проще как-то проанализировать контура?
  4. Мама-мия, можно где-нибудь глянуть как это в коде должно выглядеть? В OpenCV есть такая функция?
  5. Структурные элементы пробовала, они здесь только мешают. erode dilate без них получше выглядит, но не все доски разделяет. В любом случае стопроцентного распознавания быть и не может. А как сегментировать эти отдельные части, и как потом их перебрать по одному?
  6. Спасибо, Smorodov. Нужно измерить ширину и высоту каждой доски. То черно-белое изображение вырезано маской после бинаризации. Качественно его сегментировать сложно, даже после обработки. Пробовала заливку cvFloodFill, тени всеравно не захватывает или заливает вместе с фоном. Пробовала преобразование Хафа для линий cvHoughLines2, угол 1.57 радиан . Получилось слишком много разбросанных линий и непонятно что с ними можно сделать.
  7. Здравствуйте. Я junior в программировании. Застряла на распознавании, но не могу так просто признать поражение. Помогите немного пожалуйста. Надо распознать и измерить доски на большой полноцветной фотографии. Некоторые доски сливаются в один объект и их надо разделить или измерить приблизительно. Также сложно полностью отделить доски от фона, так как тени на досках и окружающий фон имеют одинаковый цвет и освещенность. Сегментировать тоже не получилось cvPyrMeanShiftFiltering вылетает, cvPyrSegmentation не подходит - цвета слишком близки, и лишь немного лучше cvWatershed. Разные фильтры на этом этапе только ухудшают результат. Здесь приводили несколько интересных библиотек, но они все на си, а я пишу только на питоне. Картинка черно-белая уже после предварительной обработки. Цветная (оригинал), к сожалению, не приаттачилась.
×