OCR y Fivewin alguna sugerencia?

Post Reply
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

OCR y Fivewin alguna sugerencia?

Post by George »

El reto es el siguiente:
1.- Leer un tarjeta de identificacion (ID card) con el scanner. Esto esta resuelto con la clase de L. Gadaleta.
2.- Identificar secciones de la tarjeta de identificacion y aplicarle OCR. Luego poder grabar, esa parte, como texto en un archivo DBF.
AQUI ESTA EL RETO: Como poder accesar a la parte del ID scaneado donde se encuentra, digamos, el apellido de la persona para luego aplicarle OCR y convertar esa parte grafica a archivo de texto?.

En el siguiente "site" venden scanners que viene con un software que ya lo hace: http://www.scanshell-store.com/

Saludos


George.
User avatar
Rafael Clemente
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Post by Rafael Clemente »

George:
Yo estoy trabajando en eso precisamente ahora, pero está demasiado preliminar como para mostrar nada. En todo caso, si tú has hecho algo así me gustaría conocer tus experiencias.
Rafael
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

hola

Post by fleal »

George,

Te cuento mi experiencia.
El escaner escanea un documento tamaño carta. La imagen resultante es en formato Tiff. Esto lo hace el software que viene con el scanner.
Desde un programa como el irislink o el finereader. Se cargan las imagenes y se le pasa el motor de OCR a las partes del documento que me interesan. El resultado se guarda en un TXT el cual con FWH lo cargo al programa para pasarlo por los diccionarios ortograficos.

Este proceso en 3 partes... es lo que hago.

Que si hay una forma directa de hacerlo... bueno, el mismo finereader tiene un SDK pero no creo que valga la pena por la cantidad de euros que piden por el SDK ni por el resultado. El resultado para ICR es muuuy pobre y por el OCR dependerá del tamaño del font impreso en el documento. En el OCR y con un buen diccionario reconoces el 75%

Lo que si voy hacer es conectarme directo al scanner para obtener la imagen en multitiff y visualizarla através de FWH. Esto último para captura datos, pero ya nada tiene que ver con el OCR.

Mis 5 centavos
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

Post by George »

Rafael y Fernando gracias por contestar este post.

Estoy apenas comenzando con este proyecto y lo primero que me encuentro (y acabo de comprar) es con el scanner "ScanShell" model 800.
Este viene con el Software "IDScan" que lee las licencia de conducir de cada uno de los estado en USA. Luego escribe la data en un archivo de texto, como lo indica Fernando que lo hace en su aplicacion. "IDScan" tambien captura la data de cheques.

Mi primera opcion seria llamar este software desde mi aplicacion, hacer el scaner y el OCR desde el "IDScan" y luego procesar el archivo TXT que genera dicho software para salvarlo en la tabla DBF.
Realmente me interesa mas usar funciones dentro de la aplicacion xHarbour + FWH. Ellos ofrecen un SDK pero todavia no he tenido tiempo de estudiarlos y hacer los "wrappers" para integrar las llamadas a la funciones desde mi programa. La limitacion de "IDScan" es que solo trabaja con los scanners que ellos venden.
Lo ideal es que tuvieramos una clase en Fivewin que nos ayudara con esto de los OCR; talvez entre todos podemos cooperar y desarrollar esta clase.

Saludos,

George
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

Post by George »

Alguien podria indicarme cual es la funcion que devuelve la lista de los scaners que estan disponible en el computador?

George
User avatar
Rafael Clemente
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Post by Rafael Clemente »

George:
Yo consulto la lista de scaners mediante "SelectTwainDevice" pero ésa no es una función de FWH sino del OCX que yo utilizo. Supongo que tú tendrías que buscar algo parecido en tu SDK, aunque no sé si ése scaner es TWAIN compatible.
Rafael
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

Post by George »

Rafael,

Es correcto lo que indicas asi lo hago con el OCX.
Lo que quisiera hacer es obtener esa lista de los scanners directamente sin necesida de OCX.
Po ejemplo, utilizo la funcion wCamGetDrvDesc() para la obtencion de Camaras que estan disponibles (es decir de los drivers instalados). Espero encontrar la funcion equivalente para los scanners.

Code: Select all

DLL32 STATIC FUNCTION wCamGetDrvDesc;
       (nDriver AS _INT,;
        cName AS STRING,;
        nName AS LONG,;
        cVersion AS STRING,;
        nVersion AS LONG) AS BOOL PASCAL;
  FROM "capGetDriverDescriptionA" LIB "avicap32.dll"
Saludos


George
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

ok

Post by fleal »

George,

¿El tamaño de una identificación es el mismo que la Tarjeta de crédito?.
Tal parece que el tamaño en las identificaciones emitidas por el gobierto en USA y otros paises es el mismo que el de las Tarjetas de crédito.

Una tarjeta de crédito mide de ancho 8.5 por 5.4 de alto. Esto en Centimetros y milimetros.
El equivalente en pulgadas es 3.6 X 2.2

¿Cuál de los dos has adquirido?

Bundled with ScanShell 800R A6 card scanner $599.00
ó
Bundled with ScanShell 800DX A6 duplex card scanner $759.00

El que contiene el SDK Scan Shell.Net es muy poca la diferencia en dolares... pero se me ocurre, que el soft te deja los datos del OCR y la imagen. Entonces, tomar la imagen de la huella digital y crear una base de datos para AFIS. Esto es excelente :)

Entonces para mi gusto este es el bueno
Bundled with ScanShell 800DX A6 duplex card scanner $859.00

Por último, la empresa está en USA y vos ¿De donde eres?. ¿Puedes decirme en cuantos euros te ha salido ya con el envio y los impuestos de importación ??

Gracias
Fernando
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

Post by George »

Fernando,

Disculpa la tardanza en contestarte pero hasta el dia de hoy no habia visto tu post :?

¿El tamaño de una identificación es el mismo que la Tarjeta de crédito?.
Si, los ID's (Driver License) aqui en USA tienen el mismo tamaño que las Tarjetas de Credito.

Yo adquiri el Scanshell 800 que con el software IDscan (version cheques) cuesta USD299 + costo de envios (unos $10). Al cambio actual serian unos 220 Euros aproximadamente.
Tanto los Scanner que mencionas como el Scanshell pueden usar el software IDScan que es el que hace la magia del OCR. La desventaja del Scanshell 800 es que es algo lento y solo lee de un solo lado.

Por último, la empresa está en USA y vos ¿De donde eres?. ¿Puedes decirme en cuantos euros te ha salido ya con el envio y los impuestos de importación ??
La empresa que vende los scanner + IDScan esta en los EE.UU. (California). Yo soy de Rep. Dominicana pero resido en Boston USA asi que no pague impuestos de importacion.

Saludos,

George
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

Hola

Post by fleal »

George,
Soy de México. DF
Compré el Scanshell 800DX en bundle... en total 11800 pesos o más o menos el equivalente a 1050 dolares ya con gastos de importación.
He probado el software IdScan y funciona relativamente bien. Como cualquier otro software de OCR. Para mi gusto, le hace falta incorporar un diccionario...
Estoy probando algunos OCX para adquirir la imagen directamente del scanner... ya luego con eso. Correr el OCR sobre la imagen.
He solicitado (y no me han contestado) información sobre el SDK del FineReader y ya con eso, tener un software propio que se comunique con el scanner y haga el OCR sobre la imagen.
User avatar
busmatic
Posts: 51
Joined: Fri Jun 30, 2006 6:56 pm
Contact:

lectura de OCR , Metrologic IS1650

Post by busmatic »

A mi esperiencia, algunos lectores puenden incorporar en el fimware la utilidades de lectura de OCR , Metrologic IS1650 capas de leer OCR, asi como cuaquier tipo de barras y barras de 1,2 D en un solo flasheo es una de los mas economicos y baratos en el mercado.

Estos tipos de lectores simplemente lo compras con el firmware incluido y listo. Tambien otras casas tambein tienen esta lectores pero aveces los compramos si saber que eso es asi y nos damos sorpresas.



Asi de fa
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

Post by George »

Fernando,
Aqui te copio una funcion que desarrolle usando el "ScanX". Esta funcion extrae los datos de la Licencia de Conducir de cualquier estado de USA y tambien de Mexico y de muchos otros paises.
#define FIELD_STATE 4 // 0
#define FIELD_CITY 3 // 1
#define FIELD_NAME_F 29 // 2
#define FIELD_NAME_M 30 // 3
#define FIELD_NAME_L 31 // 4
#define FIELD_ADDRESS 2 // 5
#define FIELD_LICENSE_MAIN 9 // 6
#define FIELD_EXPIRES 7 // 7
#define FIELD_DOB 6 // 8
#define FIELD_ZIP 5 // 9
#define FIELD_CLASS 11 // 10
#define FIELD_RESTRICTION 22 // 11
#define FIELD_END 24 // 12
#define FIELD__ 16 // 13
#define FIELD_HEIGHT 15 // 14
#define FIELD_WEIGHT 17 // 15
#define FIELD_HAIR 14 // 16
#define FIELD_EYES 13 // 17
#define FIELD_ISSUE 8 // 18


FUNCTION GetIdData()
LOCAL cBuffer := space(99), stateID

oSLibEx := TOleAuto():New( "ScanX.SLibEx" )
oSLibEx:InitLibrary("TU_LICENCIA_SDK")

oCImage = TOleAuto():New("ScanX.CImage")
oCImage:InitLibrary("TU_LICENCIA_SDK")

oIdData = TOleAuto():New("ScanX.IdData")
oIdData:InitLibrary("TU_LICENCIA_SDK")

oCOcr = TOleAuto():New("ScanX.COcr")
oCOcr:InitLibrary("TU_LICENCIA_SDK")

oSLibEx:ScanToFileEx("C:\_CK_NEW\SCANID\IMAGE10.BMP")

stateID = DetectState("")
msginfo(stateID)

GetStateNameById(stateID, @cBuffer)
msginfo(cBuffer)

GetField(FIELD_NAME_F, @cBuffer)
msginfo(cBuffer)

GetField(FIELD_NAME_L, @cBuffer)
msginfo(cBuffer)

GetField(9, @cBuffer)
msginfo(cBuffer)

GetField(7, @cBuffer)
msginfo(cBuffer)

GetField(6, @cBuffer)
msginfo(cBuffer)

GetField(5, @cBuffer)
msginfo(cBuffer)

RETURN (.T.)
TU_LICENCIA_SDK es la licencia que te dan ellos al comprar el SDK. Puedes conseguir una para trabajar, creo que por tres meses, sin costo alguno.
El Scanshell 800 trabaja muy bien leyendo las Drivers Licence de USA.

Yo por mi parte opte por trabajar en modo "Kiosk". Es decir usando el software de ellos, llamandolo desde mi aplicacion FWH, y luego salvando un archivo de texto con toda la informacion extraida por el motor OCR del IDScan. Leo desde este TXT todos _ del ID y lo salvo en mis DBF. Todo esto se hace bastante rapido.

La razon por la cual deje el ActiveX por el modo "Kiosk"es debido a que no pude ponerlo a trabajar para hacer el OCR de los cheques. Parece que ellos no tienen ese ActiveX todavia; solo tienen unos DLL y no me fue posible inicializar dicha libreria.
En el siguiente link tiene el website de ellos para los "Developers". Ahi tienes toda la informacion y manuales que tu necesitas.

http://www.cssn-developers.com/developers_login.asp

Exito en tu proyecto

George
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

Post by George »

Si deseas hacer algunas pruebas con los DLL del Scanshell aqui te paso algunos wrappers:
DLL32 Function InitLibrary(License As STRING);
As LONG PASCAL FROM "InitLibrary" LIB "ScanW.dll"

DLL32 Function InitChequeLibrary (szFileName As STRING) As LONG PASCAL FROM "InitChequeLibrary" LIB "ChequeCOM.dll"

DLL32 Function InitChequeLib(FileName As STRING) As LONG PASCAL FROM "InitChequeLib" LIB "CheckLib.dll"

DLL32 Function InitImageLib(szFileName AS STRING) As LONG PASCAL FROM "InitImageLib" LIB "ImageCtrl.dll"

DLL32 Function InitScanLib(FileName As STRING);
As LONG PASCAL FROM "InitScanLib" LIB "ScanX.dll"

DLL32 Function InitOcrLib(FileName As STRING);
As LONG PASCAL FROM "InitOcrLib" LIB "SOCRdll.dll"

DLL32 Function InitIdLib(FileName As STRING);
As LONG PASCAL FROM "InitIdLib" LIB "IdCard.dll"

DLL32 Function InitBizLibrary (License As STRING) As LONG PASCAL FROM "InitBizLibrary" LIB "BizLib.dll"

// IDCARD Functions
DLL32 Function GetStateNameById(nID As LONG, @cBuffer As STRING) As LONG PASCAL FROM "GetStateNameById" LIB "IdCard.dll"

DLL32 Function DetectState(cReserved As STRING) As LONG PASCAL FROM "DetectState" LIB "IdCard.dll"

DLL32 Function DetectStateEx(cReserved As STRING) As LONG PASCAL FROM "DetectStateEx" LIB "IdCard.dll"

DLL32 Function ProcessState(cReserved As STRING, nState As LONG, nInt As LONG);
As LONG PASCAL FROM "ProcessState" LIB "IdCard.dll"

DLL32 Function GetField(nID As LONG, @cBuffer As STRING);
As LONG PASCAL FROM "GetField" LIB "IdCard.dll"

// CImage Functions
DLL32 Function GetImageBufferData(sFileType As STRING, sBuffer As STRING);
As LONG PASCAL FROM "GetImageBufferData" LIB "ImageCtrl.dll"

DLL32 Function LoadRotateSave(szFileName AS STRING, nAngle As LONG, nSave As LONG, cDestination As STRING);
As LONG PASCAL FROM "LoadRotateSave" LIB "ImageCtrl.dll"

DLL32 Function RotateImage(szFileName AS STRING, nAngle As LONG, nSave As LONG, cDestination As STRING);
As LONG PASCAL FROM "RotateImage" LIB "ImageCtrl.dll"

DLL32 Function Name(Name As STRING);
As LPSTR PASCAL FROM "Name" LIB "Slib.dll"

DLL32 Function GetBCName(Name As STRING);
As STRING PASCAL FROM "GetBCName" LIB "Slib.dll"

DLL32 Function ScanToFile (FileName As STRING) As LONG PASCAL FROM "ScanToFile" LIB "SLib.dll"

DLL32 Function ScanToFileEx (FileName As STRING) As LONG FROM "ScanToFileEx" LIB "ChequeCom.dll"


DLL32 Function CalibrateScanner () As LONG FROM "CalibrateScanner" LIB "ChequeCom.dll"

DLL32 Function IsPaperOn () As BOOL FROM "IsPaperOn" LIB "SLib.dll"

DLL32 Function ScanBmpFile(szFileName AS STRING) As LONG PASCAL FROM "ScanBmpFile" LIB "SLib.dll"

DLL32 Function ScanBmpFileEx (szFileName As STRING) As LONG PASCAL FROM "ScanBmpFileEx" LIB "SLib.dll"

DLL32 Function TotalConnectedScanners () AS LONG PASCAL FROM "TotalConnectedScanners" LIB "SLib.dll"

DLL32 Function IsScannerValid() AS BOOL PASCAL FROM "IsScannerValid" LIB "SLib.dll"

DLL32 Function GetCurScanner () AS LONG PASCAL FROM "GetCurScanner" LIB "SLib.dll"

DLL32 Function GetScannerType() As LONG FROM "GetScannerType" LIB "SLib.dll"

DLL32 Function GetLibVersion() As STRING FROM "GetLibVersion" LIB "SLib.dll"

DLL32 Function SetStartModel(int As LONG) AS LONG FROM "SetStartModel" LIB "SLib.dll"

DLL32 Function Calibrate() AS VOID FROM "Calibrate" LIB "SLib.dll"

DLL32 Function ExtractText(cSource As STRING, nType As LONG) AS LONG FROM "ExtractText" LIB "SLib.dll"

DLL32 Function SetScannerSize(n1Int As LONG, n2Int As LONG) AS VOID FROM "SetScannerSize" LIB "Slib.dll"


// CheckLib Functions
DLL32 Function ChequeLoadImage(cReserved As STRING) As LONG PASCAL FROM "ChequeLoadImage" LIB "CheckLib.dll"

DLL32 Function ChequeGetData(type As LONG, @cBuffer As STRING) As LONG PASCAL FROM "ChequeGetData" LIB "CheckLib.dll"

DLL32 Function GetChequeData(type As LONG, @cBuffer As STRING) As LONG PASCAL FROM "GetChequeData" LIB "CheckLib.dll"

DLL32 Function ProcessCheque(cReserved As STRING) As LONG PASCAL FROM "ProcessCheque" LIB "CheckLib.dll"

DLL32 Function ChequeLoadImageMicrOnly(@fName As STRING) As LONG PASCAL FROM "ChequeLoadImageMicrOnly" LIB "CheckLib.dll"

DLL32 Function GetChequeAngle() As LONG PASCAL FROM "GetChequeAngle" LIB "CheckLib.dll"
Saludos,

George
Post Reply