Привет, есть допустим такое изображение: Неплохо было бы его автоматически выровнять строго горизонтально. Наклон может быть любой, как в одну так и в другую сторону. Даже может оно строго вертикально располагаться. Чтобы правильно поняли - вертеть изображение программно не проблема. Проблема понять, что штрих-код находится под углом и под каким углом (чтобы потом на этот угол его повернуть). Нужно для программы распознавания штрих-кодов. Само распознавание сделал, но работает только с горизонтальными штрих-кодами. Идеи, мысли?
Tronix Найти чёрный пиксель принадлежащий изображению, найти слева от него белый пиксель и попиксельно описать линию. На основе максимального и минимального Y этого региона определить угол наклона.
То есть находим первую черную точку, от нее проводим линию например сначала вверх, а потом постепенно линию крутив вокруг этой точки. Как только все точки под линией стали черными - значит это и есть угол. Правильно мысль понял?
Стандартное решение это нахождение ориентированного бокса, для ускорения можно сильно понизить разрешение.
Tronix Не так. Вы находите пиксель принадлежащий границе штриха, затем описываете его попиксельно, отделяя от изображения. Этим найдёте лимиты штриха. Среднее их значение даст угол наклона прямой. Booster Вроде эффективность вашего решения последней подобной задачи была 96% паразитных итераций =)
Booster Если я ответил то это ничего не значит. Нечего предлагать не эффективные решения http://wasm.ru/forum/viewtopic.php?pid=394408#p394408. Как вы определите что пиксель принадлежит штриху, а не цифре к примеру без описания контура ?
С самого лева - вправо, найти черную точку. Отступить чутку вниз и повторить предыдущий пункт. Соотношение двух отрезков даст угол наклона. На самом деле все не так просто: картинка может лежать как ей угодно(?) ред: обогнали с ответом
Clerk Наверное я тупой, но я не понимаю Вас. Честно, перечитал раз 10 каждое сообщение и не отдупляю ( А как я предложил крутить линию не получится? Начало штрих-кода я могу определить на не очень больших углах. Все дело в том, что это Code128 штрихкод, а они могут начинаться только с трех "нибблов": START_A : 11010000100 START_B : 11010010000 START_C : 11010011100 где 1 - черная полоса, 0 - белая соответственно. Несложно приметить, что у всех этих трех "нибблов" общее начало - 110100 (две черные линии,белая, черная и две белых). С них и будет начинаться любой Code128 штрих-код.
У меня есть предложение считать что штрихкод является прямой, а по координатам чёрных точек расчитывать её коэффициенты. Для длинных штрихкодов должно работать идеально.
Clerk Жалко что вы высшую математику не учили. :p Tronix Считаешь корреляционную матрицу. Потом находишь обратную. Применяешь ее в качестве матрицы аффинных преобразований.
Я бы просканировал изображение по пикселям. Нашел бы самый левый, самый нижний, верхний и правых. Логично предположить, что это и будут границы прямоугольника. А дальше - поворачивай, как хочешь
В смысле не нужно? Не нужно ничего поворачивать и Вы знаете алноритм который будет распознавать любой штрих-код под любым углом?
Pavia Какую есчо матрицу. Если приращение координат на двух участках описываемой линии больше чем лимит, то линия не прямая, это позволяет идентифицировать её. Вдобавок определить что пиксель принадлежит штриху можно только попиксельным описанием его, матрицы отдахают (рис в пэйнте к сабжу). Графы лучше изучайте. http://wasm.ru/forum/viewtopic.php?id=38446