Последнее изменение файла: 2003.03.26
Скопировано с www.bog.pp.ru: 2003.09.22

Использование USB сканера в Linux

Компьютер с современной версией Linux можно использовать не только в качестве интернет-сервера, но и как рабочую станцию для графических работ (например, с использованием Gimp). Для этого, в частности, необходима возможность получать изображения с помощью сканера (вы же не будете покупать отдельный компьютер и ставить на него MS Windows только для сканирования?).

Критерии выбора модели сканера

  • Цена. Так как я не занимаюсь графикой профессионально, то я даже не смотрел в сторону профессиональных моделей. Кстати, существует громадный ценовой разрыв между любительскими и профессиональными моделями. Например, Seiko Epson продает сканеры либо дешевле $500, либо дороже $2000. Так что купить модель неподходящего уровня вам просто не дадут ;)
  • Область сканирования - A4.
  • Тип датчика. Какой датчик выбрать: CIS, ПЗС (CCD) или ФЭУ? На ФЭУ денег нет (см. выше), про CIS достаточно вспомнить, что там нет оптики. Так что выбор очевиден - CCD.
  • Тип кинематического механизма: ручной, роликовый, планшетный, проекционный или барабанный (в них используется ФЭУ, так что отбрасываем сразу). Ручные и проекционные сканеры я уже имел несчастье пробовать, так что также отбросим их. Роликовый сканер, конечно, лучше ручного, но доверия все же не внушает. Итого - планшетный сканер.
  • Тип оригинала: прозрачный или непрозрачный. Хотелось бы иметь универсальное устройство, которое могло бы сканировать как бумажные носители, так и слайды, а в идеале и негативы. Для слайд адаптера нужна функция фокусировки.
  • Аппаратный интерфейс: параллельный порт (устарел и слишком медленный), SCSI или USB. Вы где нибудь видели дешевый SCSI сканер? Вот и я тоже. Устаревшие модели не предлагать!
  • Драйвера. Большинство (все ?) изготовители сканеров не предоставляют драйверов под Linux. К счастью, драйвера ко многим моделям можно получить от энтузиастов. Поэтому перед покупкой сканера необходимо убедиться, что кем-нибудь написан драйвер именно для этой модели сканера. Отличие одной буквы в имени приведет к тому, что сканером вы воспользоваться не сможете. Убедитесь также, что драйвер достаточно отлажен, и не верьте обещаниям, что все будет работать буквально на следующей неделе (в крайнем случае, можно отложить покупку на неделю ;). Информацию о поддерживаемых сканерах можно найти:
  • Оптическое разрешение (число элементов CCD-линейки, деленное на ширину поля сканирования) и механическое разрешение (количество считываний линейки, деленное на длину поля сканирования). С моей точки зрения, необходимо иметь такое разрешение, чтобы самая маленькая отсканированная фотография (или слайд) помещалась ровно на экран (а лучше с запасом - IBM обещает ЭЛТ с разрешением 200dpi): 35 миллиметрам слайда в этом случае соответствует 1920 пикселов на экране, т.е. получается около 1400 dpi. Лучше иметь запас, чтобы не думать об уровне взаимных помех ячеек CCD-матрицы.
  • Глубина цвета. Казалось бы простой вопрос - 8 бит на цвет, все равно больше на экран не выводится и глазом не распознается (кроме людей, профессионально работающих с красками). Однако, если вы собираетесь обрабатывать получившиеся изображения, то необходимо иметь "запас прочности", т.к. в результате округлений при обработке часть информации теряется. Следует также учитывать, что младшие биты содержат скорее "шум", чем полезную информацию. Так что сканер должен уметь выдавать наружу минимум 10 бит на цвет (правда, для обработки такого изображения вам потребуется самостоятельно собрать Gimp Hollywood). Неплохо также, если сканер умеет делать гамма- и цветокоррекцию в аналоговом режиме.
  • Диапазон оптических плотностей (Dmax-Dmin). Для сканеров "любительского" ценового диапазона обычно не сообщается (стыдно признаться, наверное). Равняется разнице между максимальной (Dmax, до 4.0 D) и минимальной оптической (Dmin, от 0.0 D) плотностью оригиналов, которые сканер еще способен различить (0.0 D - проходит 100% света, 1.0 D - 10%, 2.0 D - 1%, 3.0 D - 0.1% ). Для справки: газетная бумага - 0.9 D, мелованная бумага - 1.9 D, цветная фотография - 2.5 D, негатив - 2.8 D (но Dmin здоровый), любительский слайд - 3.0 D, рентгеновский снимок - 3.6 D. Теоретический предел при 10-битной глубине цвета - 3.0 D, при 12-битной - 3.6 D (шумы и пребразования не дадут достичь этих значений).
  • Такие характеристики CCD-матрицы как уровень шума, разброс чувствительности ячеек, уровень взаимных помех и совмещение цветов, а также уровень шума АЦП я опущу - все равно оценить их можно только после покупки ;)
  • Количество проходов - 1 (бывают еще слайд-сканеры с дополнительным проходом для выявления пыли и царапин или уменьшения случайных шумов).
  • Скорость сканирования.
  • Возможность коррекции экспозиции (управление мощностью лампы освещения).

Epson Perfection 1650 Photo

Теперь вы поняли, как я мучился выбирая сканер? К счастью, все гораздо проще - посмотрите список сканеров с интерфейсом USB и сравните со списком современных сканеров, продаваемых в местном магазине. В пересечении списков окажется всего несколько моделей. Дальнейший выбор можно провести исходя из личных пристрастий и обзоров в журналах.

Seiko Epson Perfection 1650 Photo (GT-8200UF):

  • Изготовитель: Seiko Epson (сайт поддержки, российский сайт Seiko Epson, российский сайт поддержки).
  • Цена: около $250.
  • Область сканирования: A4 (216x297mm).
  • Датчик: CCD (2 линии на цвет).
  • Планшетный со съемной крышкой, 4 кнопки.
  • Встроенный пассивный адаптер (EU-54) для сканировная 35мм пленок (вертикально расположенная лампа с матовым стеклом). Область сканирования 48.26x231.1mm (? 36x226mm). Пленку надо класть блестящей стороной вниз. Две точки фокусировки: на стекло и 2 mm над ним (пленка в держателе).
  • Аппаратный интерфейс: USB 1.1, гнездо типа B (глубокое, так что USB кабель с ограничителем глубины не подошел), Full Speed mode (12Mbits/sec), подключать к корневому концентратору или концентратору первого уровня с блоком питания. Выдает о себе следующую информацию (надо бы добавить в modules.usbmap, в ядре 2.4.18 - RH 8.0 - уже есть):
    • string description: manufacturer: "EPSON", product: "EPSON Scanner"
    • Device Class: ff
    • Device Subclass: ff
    • Device Protocol: ff
    • Vendor Id: 0x04b8
    • Product Id: 0x0110
    • Revision Number: 1.10
  • Драйвера для Linux:
  • Оптическое разрешение: 13600 элементов (1600 dpi). Механическое разрешение: 3200 dpi (пользы от сканирования с разрешением 3200 dpi нет).
  • Глубина цвета: 16 бит на цвет внутренних и внешних (похоже, что младшие 8 бит выдумываются firmware).
  • Диапазон оптических плотностей: 3.2 D (в некоторых текстах - 3.0 D, при самостоятельном тестировании получается 2.4 D, линейная часть - до 1.7 D).
  • Скорость (полная область сканирования: 215.9mm x 297.18mm):
    • preview 8 бит - 10 секунд
    • preview 16 бит - 15 секунд
    • scanimage --mode Color --depth 8 --resolution 50 (10.5 секунд)
    • scanimage --mode Color --depth 16 --resolution 50 (10.5 секунд)
    • scanimage --mode Color --depth 8 --resolution 100 (10.5 секунд)
    • scanimage --mode Color --depth 16 --resolution 100 (13.5 секунд)
    • scanimage --mode Color --depth 8 --resolution 200 (21 секунда)
    • scanimage --mode Color --depth 16 --resolution 200 (37.5 секунд)
    • scanimage --mode Color --depth 8 --resolution 400 (71 секунда)
    • scanimage --mode Color --depth 16 --resolution 400 (159 секунд)
    • scanimage --mode Color --depth 8 --resolution 600 (150 секунд)
    • scanimage --mode Color --depth 16 --resolution 600 (300 секунд)
    • scanimage --mode Color --depth 8 --resolution 800 (293 секунды)
    • scanimage --mode Color --depth 16 --resolution 800 -x 172.7 (413 секунд, PNM создается с ошибкой, а в TIFF нет последней строки)
    • scanimage --mode Color --depth 8 --resolution 1600 -x 172.7 (833 секунды)
  • Дополнительные возможности:
    • command level: ESC/I-B8, FS
    • 7 уровней яркости (реализовано программно, а не увеличением яркости лампы)
    • line art: fixed threshold, text enhancement technology
    • halftone: auto area segmentation, 3 режима error diffusion, 4 шаблона dither, 2 загружаемых шаблона (bi-level и quad-level)
    • гамма коррекция: 2 типа для CRT, 3 типа для печати, 1 загружаемый
    • цветокоррекция: 1 для CRT, 3 для принтера, 1 загружаемая
    • Источник питания: DC 24V, 0.8A (15W/6W)

Настройка Linux

Я использую Red Hat 7.2 с ядром 2.4.9-13. USB-контроллер: UHCI (chipset Intel BX).

Так как ядро 2.4.9 ничего не знает о Epson Perfection 1650 (в 2.4.18 всё в порядке), то надо добавить в /etc/modules.conf строку:

options scanner vendor=0x04b8 product=0x110 read_timeout=8000

Может возникнуть проблема со слишком маленьким временем ожидания подтверждения в драйвере. Стандартное время ожидания (в /usr/src/linux/drivers/usb/scanner.h) равно 10 секундам. Для Epson этого мало, особенно в режиме TPU и в больших разрешениях. В старом ядре приходилось менять scanner.h и пересобирать ядро. Затем у модуля scanner появился параметр read_timeout (только задавать его надо не в секундах, как написано в документации, а в тиках - 1/100 секунды). Сейчас драйвер сканера самостоятельно увеличивает этот параметр до 40 секунд для сканеров Epson. В новой версии драйвера также убран эффект "тормознутости" - приложение нельзя было снять в течении этих самых 40 секунд.

При подсоединении сканера в syslog приходят сообщения от ядра:

hub.c: USB new device connect on bus1/1, assigned device number 5
usb.c: USB device 5 (vend/prod 0x4b8/0x110) is not claimed by any active driver.
/etc/hotplug/usb.agent: ... no drivers for USB product 4b8/110/110

Oops! Ядро 2.4.9 (в 2.4.18 всё в порядке) ничего не знает об этом устройстве. Берем подходящую строчку из /etc/hotplug/usb.distmap от другого сканера Epson:

scanner              0x0003      0x04b8   0x0107    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x00000000

Копируем ее в /etc/hotplug/usb.handmap (не надо в /lib/modules/2.4.9-13/modules.usbmap, т.к. он формируется при каждой загрузке), заменив идентификатор устройства на 0x110. Переподсоединяем сканер - теперь hotplug счастлив (lsmod показывает загруженный модуль scanner):

usb.c: USB disconnect on device 5
hub.c: USB new device connect on bus1/1, assigned device number 6
usb.c: USB device 6 (vend/prod 0x4b8/0x110) is not claimed by any active driver.
usb.c: registered new driver usbscanner
scanner.c: probe_scanner: User specified USB scanner -- Vendor:Product - 4b8:110
scanner.c: USB Scanner support registered.

То же самое можно сделать вручную:

/sbin/modprobe usb-uhci
/sbin/modprobe scanner

Осталось убедиться, что права к устройству /dev/usb/scanner0 достаточны для пользователя, который будет сканировать.

Если сканер долго не использовать, то он отключается, а модуль выгружается из памяти. В результате автоматический поиск устройства не работает. Можно или передернуть устройство, перезагрузить драйвер вручную или указывать имя устройства явно.

SANE 1.0.6 (1.0.8)

Убедившись, что при подсоединении сканера автоматически загружается модуль scanner, переходим к следующему этапу. Дело в том, что USB драйвер Linux обеспечивает только транспортный уровень протокола, т.е. он умеет передавать/принимать байты, но не понимает их значения. Для работы с конкретной моделью сканера (или серией сканеров, если они используют общий командный язык) необходима программа, умеющая общаться именно с данной моделью сканера. Наиболее популярным комплектом таких программ является SANE.

SANE представляет собой API, который обеспечивает доступ к сканирующему оборудованию стандартизованным образом и библиотеку модулей для конкретных моделей сканеров. Поддерживаются не только USB сканеры, но SCSI-сканеры, устройства, подключаемые к параллельному порту, цифровые камеры из комплекта gphoto2 и другие устройства. Обеспечивается сетевая работа (я не пробовал).

В дополнение к библиотеке (backends), в состав пакета входят программы для сканирования (frontends): scanimage, xcam, xscanimage. scanimage - это консольная программа и пользоваться ею можно, но неудобно. xcam и xscanimage - убогие и глючные, так что лучше пользоваться xsane.

Получить SANE можно

  • вместе с Red Hat 7.2: пакеты sane-frontends-1.0.5, sane-backends-1.0.5 и sane-backends-devel-1.0.5
  • переустановив (rpm -Uvh) новые версии (1.0.6) с RawHide (они тянут за собой libusb-0.1.4-1.i386.rpm)
  • собрав их самостоятельно (удалив предварительно старую версию и пакеты, которые от нее зависят):
    • ./configure
    • make
    • make install
    • добавить в /etc/ld.so.conf директории /usr/local/lib, /usr/local/lib/sane и запустить /sbin/ldconfig (т.к. самосборный SANE (устанавливается в /usr/local, вместо /usr)

Редактируем список устройств в файле /etc/sane.d/dll.conf (/usr/local/etc/sane.d/dll.conf, если собирали SANE самостоятельно): все лишние устройства надо закоментировать - автопроба неправильного драйвера может привести устройство или всю систему в неработоспособное состояние.

В /etc/sane.d/epson.conf добавить:

usb /dev/usb/scanner0

Тестируем список доступных устройств:

scanimage -L -v

Среди распознанных устройств должно быть:

device `epson:/dev/usb/scanner0' is a Epson GT-8200 flatbed scanner

Тестируем работоспособность получившейся системы (весьма поверхностно):

scanimage -T -v -d epson:/dev/usb/scanner0

Посмотрим какие возможности сканера доступны с помощью SANE:

scanimage --help -v --device epson:/dev/usb/scanner0

Похоже версия 1.0.6 извлекает из аппаратуры все, что только можно:

  • --mode Binary|Gray|Color
  • --depth 8|16
  • --halftoning (все что обещано аппаратурой)
  • --dropout None|Red|Green|Blue
  • --brightness -4..3 (не совместим с гаммакоррекцией)
  • --sharpness -2..2
  • --gamma-correction аппаратная гаммакоррекция, в т.ч. загружаемые кривые отдельно по каждому цвету
  • --color-correction (эти параметры вручную точно не задашь ;)
  • --resolution 50|60|72|75|80|90|100|120|133|144|150|160|175|180|200|216|240|266|300|320|350|360|400|480|600|720|800|900|1200|1600|1800|2400|3200
  • --threshold 0..255
  • --mirror[=(yes|no)]
  • --speed[=(yes|no)]
  • --auto-area-segmentation[=(yes|no)] (картинки halftoned, текст наоборот)
  • --zoom 50..200
  • --wait-for-button (1.0.8)
  • --preview[=(yes|no)]
  • --preview-speed[=(yes|no)]
  • геометрия: -l, -t, -x, -y (mm)
  • --source Flatbed|Transparency Unit
  • --film-type Positive Film|Negative Film
  • --focus-position Focus on glass|Focus 2.5mm above glass

При попытке сканирования более 32 КБ на строку выдает ошибку "out of memory". Это не недостаток оперативной памяти (памяти я закупил достаточно по случаю снижения цен ;), а проблемы с адресацией командного языка (на самом деле ограничение равняется 64 КБ на строку - Epson Twain 5 позволяет такое, но sane-epson ошибается вдвое).

Установив переменную окружения SANE_DEBUG_EPSON (от 1 до 128) можно получить отладочную печать в случае затруднений. Вот что устройство сообщает о себе:

type    B
level   8
option equipment is installed
resolution (dpi): 50
...
resolution (dpi): 3200
maximum scan area: x 27200 y 37440
fbf tlx 0.000000 tly 0.000000 brx 215.899994 bry 297.179993 [mm]
Max. supported color depth = 16
TPU detected
tpu tlx 0.000000 tly 0.000000 brx 48.259995 bry 231.139999 [mm]
model : GT-8200

Кстати, в комплекте есть модуль для захвата изображений с video4linux (например, v4l:/dev/video0), который работает с моей AverMedia TVPhone98.

XSANE 0.82 (0.84)

scanimage позволяет отсканировать изображение с нужными параметрами и сохранить его в формате TIFF или PNM. Но пользоваться им можно разве что для тестирования. Поможет нам xsane - графическая оболочка к SANE. Также используется как plugin для GIMP, что позволяет сканировать изображения прямо из графического редактора.

Получить xsane можно

  • вместе с Red Hat 7.2: пакеты xsane-0.77-4 и xsane-gimp-0.77-4 (но это очень старая версию с огромным количеством ошибок, например в некоторых режимах PNG сохраняется с ошибками)
  • переустановив (rpm -Uvh) новые версии (0.82-3) с RawHide (почему-то нет русских меню)
  • собрав их самостоятельно (удалив предварительно старую версию и пакеты, которые от нее зависят; не забудьте о plugin для GIMP: ~/.gimp-1.2/pluginrc!):
    • ./configure (иногда приходится давать --disable-sanetest)
    • make
      • в RH 7.1 ошибка gcc-2.96-81 при компиляции xsane.c:4501(xsane_mail_dialog), о чем честно предупреждается в xsane.INSTALL (видимо силенок не хватает скомпилировать 260КБ с -O2). Уменьшение уровня оптимизации позволяют завершить сборку.
      • в RH 7.2 потребовалось установить пакет libusb-devel в дополнение к libusb, который потребовался обновленному sane
    • make install
      • /usr/local/share/sane/xsane
      • /usr/local/share/locale
      • /usr/local/man/man1
      • /usr/local/share/sane

Вот и все: запускаем командой xsane или xsane epson:/dev/usb/scanner0, если не срабатывает автоматическое распознавание. После этого надо обязательно включить отображение всех окон и погулять по конфигурации.

Гаммакоррекция похоже в xsane-0.82 только программная.

Image Scan! от Epson Kowa 1.1.0

Заменяет libsane-epson.so в /usr/lib/sane на свою реализацию libsane-epsonkw.so (является модификацией одной из ранних версий libsane-epson). Единственное замеченное мной различие - появилась гаммакоррекция - 1.8. Устанавливается библиотека libesmod.so в /usr/lib и графический интерфейс к SANE - iscan. Его также можно использовать как plugin для gimp.

Интерфейс проще, чем xsane. Появились кривые гамма- и цветокоррекции, но нет возможности управлять аппаратными функциями, белой и черной точек, гистограммы, 16 битных цветов, как в xsane. В общем, я не понял зачем это нужно.

Ограничение на размер строки сканирования в 32 КБ осталось :(

VueScan

VueScan - библиотека драйверов сотни сканеров и графическая оболочка в одной программе. Нет исходных текстов. Shareware (изображения не сохраняются, пока не заплатишь автору). Ориентирована на слайдсканеры: поддержка инфракрасного канала, фокусировки, установки времени экспозиции, пакетной обработки, многократного сканирования (гм, Floating point exception); специальные фильтры обработки изображений для пленки: удаление зерна, восстановление "увядших" цветов (рекомендуется нажать кнопку "advanced options"). При попытке сканировать весь лист 1600x1600x16 получаем Segmentation fault (видимо та же проблема с ограничением размера изображения). Перед запуском надо установить переменные окружения, описывающие сканер:

export SCANNER0="/dev/usb/scanner0"
export SCANVID0="0x4b8"
export SCANPID0="0x110"

Первые впечатления

Сканирование 3200 dpi. Заметна явная полосатость изображения - либо кто-то путает четные и нечетные строки, либо CCD не успевает "отдохнуть" за полшага.

Попытка многократного сканирования одной фотографии (c идеей дальнейшего усреднения с помощью convert -depth 16 -average) и последующее сравнение их (composite -depth 16 -compose difference) наводит на мысль, что младшие 8 бит на цвет генерируются датчиком случайных чисел (а на границе светлого и темного - все 10 ;).

Ссылки


Copyright © 1996-2003 Sergey E. Bogomolov; www.bog.pp.ru

Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости