Capturar códigos QR con la webcam desde Visual Foxpro 9

Posted on junio 28, 2015

7



Hace algún tiempo probé las librerías FoxBarcodeQR, que son fantásticas par crear códigos QR.

Pero… ¿Cómo leer los códigos QR con la webcam?

Buscando por Internet, encontré la aplicación ZBar, que permite capturar los códigos de barras y obtener en formato texto plano o XML su contenido. Será necesario descargarlo e instalarlo para ver su funcionamiento con este ejemplo.

Existen otras librerías para capturar con la cámara el código QR, pero suelen ser aplicaciones de pago. ZBar es Open Source y cumple su cometido suficientemente bien.

Cómo funciona?

El archivo capturaqr.txt que genera ZBAR crece con los códigos añadidos que va leyendo con la cámara web. NO borra el anterior código, sino que lo añade al final del archivo, con lo que tendremos un archivo con varios códigos leídos en su interior.

Es fácil perfeccionar este ejemplo para obtener los códigos y usarlos en una aplicación, por ejemplo para control de accesos, descuentos, punto de información, etc.

He usado para el ejemplo una webcam de Logitech. Con la cámara de un portátil HP también me ha funcionado. No ha de haber demasiados problemas con otras cámaras.

Explicación de la pantalla de ejemplo:

La pantalla que he creado contiene:

1. Un botón para ejecutar el proceso ZBARCAM.EXE para que genere un archivo de texto con las capturas.

2. Un TIMER para que abra y capture el contenido el archivo generado en el punto 1 de forma periódica. La pantalla tiene un CHECKBOX para parar el timer.

3. Un EDITBOX donde pongo el resultado de la lectura del TIMER. Ojo, al ser un ejemplo sencillo, no “quito” los códigos leídos con anterioridad.

4. Un checkbox para activar/desactivar el timer.

Captura formulario

Archivo ZBAR.BAT

Para iniciar la captura de los códigos QR a través de la cámara, se puede usar un archivo por lotes para activar ZBAR.

Deberá comprobarse el path, en mi caso al tener un sistema operativo de 64 bits, está en el directorio “Program files (x86)…”.

Adjunto el código de ZBAR.BAT.

echo off
“c:/program files (x86)/ZBar/bin/zbarcam.exe “>capturaqr.txt

Código fuente

El formulario original (SCX) se puede descargar aquí:

He usado Foxbin2prg para transformar el código del formulario SCX a un PRG, así se puede ver fácilmente qué tiene cada botón dentro del formulario, sin necesidad de descargar el formulario:

*——————————————————————————————————————————————————–
* (ES) AUTOGENERADO – ¡¡ATENCIÓN!! – ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!!
* (EN) AUTOGENERATED – ATTENTION!! – NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*——————————————————————————————————————————————————–
*< FOXBIN2PRG: Version=”1.19″ SourceFile=”escanear.scx” /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS dataenvironment AS dataenvironment
*< CLASSDATA: Baseclass=”dataenvironment” Timestamp=”” Scale=”” Uniqueid=”” ClassIcon=”1″ />

DataSource = .NULL.
Height = 0
Left = 0
Name = “Dataenvironment”
Top = 0
Width = 0

ENDDEFINE

DEFINE CLASS form1 AS form
*< CLASSDATA: Baseclass=”form” Timestamp=”” Scale=”” Uniqueid=”” />

*– OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath=”Timer1″ UniqueID=”” Timestamp=”” />
*< OBJECTDATA: ObjPath=”chkautomatico” UniqueID=”” Timestamp=”” />
*< OBJECTDATA: ObjPath=”Edit1″ UniqueID=”” Timestamp=”” />
*< OBJECTDATA: ObjPath=”Command2″ UniqueID=”” Timestamp=”” />
*< OBJECTDATA: ObjPath=”Label1″ UniqueID=”” Timestamp=”” />

Caption = “Form1”
DoCreate = .T.
Name = “Form1”

ADD OBJECT ‘chkautomatico’ AS checkbox WITH ;
Alignment = 0, ;
AutoSize = .T., ;
Caption = “Revisar automáticamente”, ;
Enabled = .F., ;
Height = 17, ;
Left = 12, ;
Name = “chkautomatico”, ;
Top = 12, ;
Value = .F., ;
Visible = .T., ;
Width = 159
*< END OBJECT: BaseClass=”checkbox” />

ADD OBJECT ‘Command2’ AS commandbutton WITH ;
Caption = “Iniciar Captura”, ;
Height = 27, ;
Left = 280, ;
Name = “Command2”, ;
Top = 62, ;
Width = 89
*< END OBJECT: BaseClass=”commandbutton” />

ADD OBJECT ‘Edit1’ AS editbox WITH ;
Height = 152, ;
Left = 12, ;
Name = “Edit1”, ;
Top = 56, ;
Width = 262
*< END OBJECT: BaseClass=”editbox” />

ADD OBJECT ‘Label1’ AS label WITH ;
AutoSize = .T., ;
Caption = “El resultado de leer el código QR se verá aqui:”, ;
Height = 17, ;
Left = 12, ;
Name = “Label1”, ;
Top = 36, ;
Width = 256
*< END OBJECT: BaseClass=”label” />

ADD OBJECT ‘Timer1’ AS timer WITH ;
Height = 23, ;
Interval = 200, ;
Left = 286, ;
Name = “Timer1”, ;
Top = 12, ;
Width = 23
*< END OBJECT: BaseClass=”timer” />

PROCEDURE Init
* http://sourceforge.net/projects/zbar/?source=navbar

PUBLIC oShell as WScript.Shell
oShell = CreateObject(“WScript.Shell”)
RETURN DODEFAULT()

ENDPROC

PROCEDURE Command2.Click
lcFicheroAbrir = Addbs(Fullpath(Curdir()))+”capturaqr.txt”

Comando =Addbs(Fullpath(Curdir()))+”zbar.bat”

try
DELETE FILE (lcFicheroAbrir )
oShell.Run(Comando, 1, .f.)
CATCH
MESSAGEBOX(“Posiblemente ya tiene abierta la utilidad ZBAR”)
ENDTRY

thisform.chkautomatico.enabled=.t.
thisform.chkautomatico.Value =.t.
ENDPROC

PROCEDURE Timer1.Timer
If Thisform.chkautomatico.Value
Local gnFileHandle,nSize,cString
cString=””

lcFicheroAbrir = Addbs(Fullpath(Curdir()))+”capturaqr.txt”

gnFileHandle = Fopen(lcFicheroAbrir )
* Seek to end of file to determine number of bytes in the file.
nSize = Fseek(gnFileHandle, 0, 2) && Move pointer to EOF
If nSize <= 0
* If file is empty, display an error message.
* WAIT WINDOW “This file is empty!”
Else
* If file is not empty, store the file’s contents in memory
* and display the text in the main Visual FoxPro window.
= Fseek(gnFileHandle, 0, 0) && Move pointer to BOF
cString = Fread(gnFileHandle, nSize)
Thisform.edit1.Value = cString
Endif
= Fclose(gnFileHandle) && Close the file
Endif

ENDPROC

ENDDEFINE

Posted in: Foxpro