iit512 Попробуйте вот это скомпилировать. Если не получится - опять дайте лог ошибок.
http://rghost.ru/44769613 Добавлено: Scan Tailor Featured 2013.03.25
http://rghost.ru/44769669 Добавлено: В этой сборке я начал эксперименты с формой зоны Test. Я взял за основу форму "Обведённая" - т.е. "обведённую прямоугольником" зону (PictureShape-зону).
Как я уже писал ранее, одним из недостатков PictureShape является то, что она слишком сильно обводит исходную зону - получается значительная синяя окантовка между реальной картинкой и получаемой зоной.
Но если применить обычную исходную зону - то она, хоть и не имеет такой неприятной окантовки, но зато контур её получается весь в микрозубцах - как подводная часть корпуса корабля, обросшая ракушками.
Я слегка доработал алгоритм PictureShape. Принцип действия доработки такой:
1. Я назначил произвольный порог - 25%. Взял просто с потолка это значение.
2. Беру верхнюю горизонтальную границу PictureShape-зоны. В цикле перемещаюсь от неё внутрь фигуры (т.е. цикл по горизонтальным рядам зоны). На каждом шаге цикла в другом цикле прохожу по всем словам (32-битным) этой стороны зоны. Если текущее слово - целиком белое - увеличиваю построчный счетчик белых слов.
3. После каждого прохода цикла по словам (внутреннего) смотрю - если отношение счетчика белых слов к количеству слов стороны зоны больше порога (25%) - то выхожу из внешнего цикла, считая при этом, что я нашёл истинную границу прямоугольной фигуры.
4. Повторяю то же самое для оставшихся 3-х сторон PictureShape-зоны. Только для левой-правой сторон вместо слов использую, разумеется, просто пиксели. Я ещё, кстати, намаялся писать функции getPixel/setPixel для Tulon'ского класса BinaryImage (удовольствие ниже среднего)
Вот они - для интереса:
Цитата: void
BinaryImage::setPixel(int x, int y, BWColor color)
{
uint32_t* line = this->data() + m_wpl * y;
(color == WHITE) ? line[x >> 5] &= ~(0x80000000 >> (x & 31)) : line[x >> 5] |= (0x80000000 >> (x & 31));
}
BWColor
BinaryImage::getPixel(int x, int y)
{
uint32_t* line = this->data() + m_wpl * y;
return (BWColor)((line[x >> 5] >> (31 - (x & 31))) & 1);
}
То, что получилось, можно увидеть в сегодняшней сборке при использовании Test-зоны. Сравните её результат с зоной "Обведённая" - наверняка увидите разницу. Test-зона - это всегда производная от обведённой и всегда меньше её.
О принципе работы Test-зоны: я подумал - что есть шероховатости ("зазубрины", "шипы", неровные края) оригинальной авто-зоны с точки зрения алгоритмики? Это всего лишь в достаточной мере прерывистый прямолинейный контур. И задача удаления этих шипов сводится к постепенному "срезанию" (допустим, попиксельному) найденного контура - до тех пор, пока уровень прерывистости контура не достигнет какой-то величины. Я выбрал - 25%, но не факт, что это наилучшая цифра.