Mostrando entradas con la etiqueta Imagenes. Mostrar todas las entradas
Mostrando entradas con la etiqueta Imagenes. Mostrar todas las entradas

Crear códigos QR

 

Los códigos QR son una forma eficiente de almacenar y acceder a información. Las ventajas de usarlos son:

  1. Facilidad de uso: Los códigos QR pueden ser escaneados fácilmente con la mayoría de los smartphones.
  2. Versatilidad: Pueden ser utilizados para una amplia gama de propósitos, desde el marketing hasta la identificación de productos.
  3. Eficiencia: Permiten un acceso rápido a la información, simplemente escaneando el código con un dispositivo móvil.
  4. Ahorro de espacio: Pueden almacenar una gran cantidad de información en un espacio muy pequeño.

Ahora, vamos a ver cómo podríamos generar códigos QR en Delphi. Para este ejemplo, se necesita una biblioteca de terceros para generar códigos QR, como “DelphiZXingQRCode”.

En el archivo adjunto les dejo al archivo  DelphiZXingQRCode.pas en la carpeta "Source"



UNIT DelphiZXingQRCodeTestAppMainForm;

// Demo app for ZXing QRCode port to Delphi, by Debenu Pty Ltd (www.debenu.com)
// Need a PDF SDK? Checkout Debenu Quick PDF Library: http://www.debenu.com/products/development/debenu-pdf-library/

INTERFACE

USES
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DelphiZXingQRCode, Vcl.ExtCtrls,
Vcl.StdCtrls, jpeg;

TYPE
TForm1 = CLASS(TForm)
edtText: TEdit;
Label1: TLabel;
cmbEncoding: TComboBox;
Label2: TLabel;
Label3: TLabel;
edtQuietZone: TEdit;
Label4: TLabel;
PaintBox1: TPaintBox;
Memo1: TMemo;
Button1: TButton;
Label5: TLabel;
PROCEDURE HazCodigoQR(texto: STRING);
PROCEDURE FormDestroy(Sender: TObject);
PROCEDURE FormCreate(Sender: TObject);
PROCEDURE PaintBox1Paint(Sender: TObject);
PROCEDURE edtTextChange(Sender: TObject);
PROCEDURE cmbEncodingChange(Sender: TObject);
PROCEDURE edtQuietZoneChange(Sender: TObject);
PROCEDURE Button1Click(Sender: TObject);
PROCEDURE CargarFichero;
PRIVATE
QRCodeBitmap: TBitmap;
PUBLIC
PROCEDURE Update;
END;

VAR
Form1: TForm1;

IMPLEMENTATION

{$R *.dfm}

PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
i: integer;
bmp: TBitmap;
MyJPEG: TJPEGImage;

BEGIN
bmp := TBitmap.Create;
MyJPEG := TJPEGImage.Create;
TRY
bmp.Width := PaintBox1.Width;
bmp.Height := PaintBox1.Height;
FOR i := 0 TO Memo1.lines.count - 1 DO
BEGIN
IF trim(Memo1.lines[i]) <> '' THEN
BEGIN

HazCodigoQR(Memo1.lines[i]);
bmp.Canvas.CopyRect(PaintBox1.ClientRect, PaintBox1.Canvas, PaintBox1.ClientRect);
WITH MyJPEG DO
BEGIN
Assign(bmp);
SaveToFile('.\imagenes\' + Memo1.lines[i] + '.jpg');
END;

END;

END;

FINALLY
bmp.Free;
MyJPEG.Free;
END;
END;

PROCEDURE TForm1.cmbEncodingChange(Sender: TObject);
BEGIN
Update;
END;

PROCEDURE TForm1.edtQuietZoneChange(Sender: TObject);
BEGIN
Update;
END;

PROCEDURE TForm1.edtTextChange(Sender: TObject);
BEGIN
Update;
END;

PROCEDURE TForm1.FormCreate(Sender: TObject);
BEGIN
QRCodeBitmap := TBitmap.Create;
Update;
CargarFichero;
END;

PROCEDURE TForm1.CargarFichero;
BEGIN
Memo1.lines.clear;
Memo1.lines.loadfromfile('codigos.txt');
Label5.caption := Memo1.lines.count.Tostring;
END;

PROCEDURE TForm1.FormDestroy(Sender: TObject);
BEGIN
QRCodeBitmap.Free;
END;

PROCEDURE TForm1.PaintBox1Paint(Sender: TObject);
VAR
Scale: Double;
BEGIN
PaintBox1.Canvas.Brush.Color := clWhite;
PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.Width, PaintBox1.Height));
IF ((QRCodeBitmap.Width > 0) AND (QRCodeBitmap.Height > 0)) THEN
BEGIN
IF (PaintBox1.Width < PaintBox1.Height) THEN
BEGIN
Scale := PaintBox1.Width / QRCodeBitmap.Width;
END
ELSE
BEGIN
Scale := PaintBox1.Height / QRCodeBitmap.Height;
END;
PaintBox1.Canvas.StretchDraw(Rect(0, 0, Trunc(Scale * QRCodeBitmap.Width), Trunc(Scale * QRCodeBitmap.Height)), QRCodeBitmap);
END;
END;

PROCEDURE TForm1.Update;
VAR
QRCode: TDelphiZXingQRCode;
Row, Column: integer;
BEGIN
QRCode := TDelphiZXingQRCode.Create;
TRY
QRCode.Data := edtText.Text;
QRCode.Encoding := TQRCodeEncoding(cmbEncoding.ItemIndex);
QRCode.QuietZone := StrToIntDef(edtQuietZone.Text, 4);
QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);
FOR Row := 0 TO QRCode.Rows - 1 DO
BEGIN
FOR Column := 0 TO QRCode.Columns - 1 DO
BEGIN
IF (QRCode.IsBlack[Row, Column]) THEN
BEGIN
QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack;
END
ELSE
BEGIN
QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;
END;
END;
END;
FINALLY
QRCode.Free;
END;
PaintBox1.Repaint;
END;

PROCEDURE TForm1.HazCodigoQR(texto: STRING);
VAR
QRCode: TDelphiZXingQRCode;
Row, Column: integer;
BEGIN
QRCode := TDelphiZXingQRCode.Create;
TRY
QRCode.Data := texto;
QRCode.Encoding := TQRCodeEncoding(cmbEncoding.ItemIndex);
QRCode.QuietZone := StrToIntDef(edtQuietZone.Text, 4);
QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);
FOR Row := 0 TO QRCode.Rows - 1 DO
BEGIN
FOR Column := 0 TO QRCode.Columns - 1 DO
BEGIN
IF (QRCode.IsBlack[Row, Column]) THEN
BEGIN
QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack;
END
ELSE
BEGIN
QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;
END;
END;
END;
FINALLY
QRCode.Free;
END;
PaintBox1.Repaint;
END;

END.

 

Una vez compilado el programa se muestra así:


 

No se necesita instalar librerías, ni dlls adicionales, únicamente hay que utilizar la unit DelphiZXingQRCode.pas

Lo que hace el programa es leer las líneas del fichero "codigos.txt"

El fichero contiene números del 100 al 104.

Para cada línea genera su código QR como si fuese una imagen y la guarda en la carpeta "imágenes" siguiendo el esquema:  <linea>.jpg

Y al final el resultado es el siguiente:


 Descargar programa


Cómo añadir gráficos a vuestra app








A continuación os voy a explicar cómo hacer la pantalla de la
app “señales de tráfico de España” en la que se muestran en varios gráficos los
resultados de los diferentes tests.


En el gráfico superior muestra el resultado de los test realizados en el día de hoy y en el gráfico inferior muestra el resultado de todos los test realizados desde que se instaló la aplicación.


Los valores de ambos gráficos se pueden resetear desde la pestaña "Ajustes"














DISEÑO





Como siempre empezamos añadiendo un toolbar (Align=Top) y
varios speedbuttons




  Para volver a la pantalla anterior






Form.Close;


FormAnterior.Show;





  
Para mostrar una imagen de ayuda





image2.Bitmap.loadfromfile(‘Imagen1.jpg’)





 Pone o quita las marcas numéricas asociadas a
cada barra





  graficoHoy.Series[0].Marks.Visible
:= not graficoHoy.Series[0].Marks.Visible


 
graficoTotal.Series[1].Marks.Visible := not
graficoTotal.Series[1].Marks.Visible;








 Pone o quita la leyenda de los gráficos




 
graficoHoy.Legend.Visible := not graficoHoy.Legend.Visible;


 
graficoglobal.Legend.Visible := not graficoGlobal.Legend.Visible;








Después añadiremos un tTabControl con tres pestañas
PROGRESO, GRÁFICOS y AJUSTES. Para añadir una pestaña hay que pulsar con el
botón derecho sobre el tTabControl y activar el menú Add tTabitem.





Posteriormente seleccionaremos  dos componentes tLayout (Align=top y
Align=client) y dos  tChart (Align=client) y los colocaremos sobre la pestaña Gráficos. Hay que comprobar que en la la vista
de estructura quede de esta forma:








Los dos Layout se deben comportar como contenedores de los charts "GraficoGlobal" y "GraficoHoy", esto hay que hacerlo de esta forma para que todas las propiedades de alineamiento del chart  (excepto la propiedad contains) se apliquen sobre los Layout.








AÑADIENDO DATOS A LOS GRÁFICOS.





Haciendo doble clic sobre los tchart abrimos el diseñador de
gráficos














Este componente nos permitirá modificar la forma en el que el gráfico se
muestra al usuario. Podremos añadir nuevas series, cambiar el tipo de gráfico,
colores, quitar y poner leyenda, márgenes, cambiar el fondo, añadir profundidad
3D, etc…





En la app he añadido 2 series, ya que quería mostrar el número de señales correctas e incorrectas de cada test:




- Series[0] llamada LineSeries1 que corresponde con el número
de aciertos.


- Series[1] llamada Series1 que se corresponde con el número
de errores.





Para añadir valores a la serie 0 asociada con el tchart ( Name=grafico)





grafico.Series[0].AddXY(contador, NumAciertos);





y para añadir un nuevo dato correspondiente a la serie 1





grafico.Series[1].AddXY(contador, NumErrores);





Recordar que siempre hay que inicializar los datos de las series (Yo lo
hago en el evento OnShow del Form)





grafico.Series[0].Clear;




grafico.Series[1].Clear;



Es útil crear unos datos de prueba de la forma que os muestro a continuación para ver cómo queda:



for i:=1 to 10 do 

begin

grafico.Series[o].AddXY(i, random(10));

grafico.Series[1].AddXY(i, random(10));

end;









Juego de ajedrez




Este es un nuevo juego de ajedrez avanzado programado en Delphi que incorpora un algoritmo de cálculo de posiciones bastante bueno, aún en los niveles de juego básicos el programa tiene bastante fuerza.


Permite seleccionar el bando con el quieres jugar, tiene diferentes niveles de profundidad de cálculo de posiciones, posee una biblioteca de aperturas muy básica pero creo que suficiente para lo que pretende el programa y un diseño de tablero modificable por el usuario.



Autor: Montero-Ribas

Licencia: GNU GPL



Descargar codigo fuente



Relacionado:

http://delphimagic.blogspot.com/2008/11/ajedrez-con-delphi-chess-with-delphi.html



Ajedrez con Delphi - Chess with Delphi


Para los apasionados del fascinante juego del ajedrez, aquí tenéis un componente que os permitirá programarlo. El software cumple por supuesto las reglas básicas del juego y además contempla el enroque, comer al paso, etc...




También permite ver el tablero desde el punto de vista del oponente, mostrar / ocultar coordenadas y cambiar el diseño de las piezas.




Otra de las buenas características que tiene, es que se puede modificar la profundidad de búsqueda de la mejor jugada con el fin de hacerlo más "inteligente".






Para descargarlo pulsar en el siguiente enlace (incluye el código fuente)




El archivo ejecutable está en la carpeta EXAMPLE->PLAYER.EXE








Detectar movimiento de personas en un área con Python4Delphi

 

En esta ocasión veremos cómo detectar movimiento sobre un área utilizando Python4Delphi.

La versión de Delphi que he utilizado es la 10.4.2

Python4Delphi es un conjunto de componentes que encapsulan las funciones de las DLL de Python, lo que permite crear scripts de Python dentro de los programas realizados con Delphi.

Entre otras muchas cosas permite:

-Acceder a funciones de bajo nivel de Python.

-Utilizan comunicacion bidireccional con sus scripts.

-Acceder a objetos Python utilizando variants personalizados en Delphi.

-Construir wrappers de objetos Delphi para utilizarlos en scripts de Python,

-Crear módulos en Python utilizando las clases y funciones de Delphi.

 

Instalación de Python

Para que funcionen nuestras aplicaciones hay que tener instalado Python en Windows, que lo pueden descargar desde su sitio oficial

 

Instalación de Python4Delphi

La  forma mas sencilla es utilizar Getit

Abrimos nuestro Rad Studio y accedemos al menú

Project - Tools - Getit Package Manager

Escribimos Python4Delphi  en la caja de búsqueda y pulsamos el botón INSTALL

Getit nos añade los componentes necesarios en nuestro entorno de desarrollo y modifica automáticamente nuestro Library Path:

Tools - Options - Language - Delphi - Library - (Win32 o Win64)

añadiendo la rutas de las dll de Python4Delphi.

Después de su instalación tienen multitud de programas de demostración en la ruta:

C:\Users\<nombre del usuario>\Documents\Embarcadero\Studio\22.0\CatalogRepository\Python4Delphi-1.0\Demos\

 

Creación de nuestro primer programa

Abrimos el programa de ejemplo llamado Demo01 que está en la ruta:

C:\Users\<nombre del usuario>\Documents\Embarcadero\Studio\22.0\CatalogRepository\Python4Delphi-1.0\Demos\Demo01\Demo01.dpr


La ventana está dividida en 2 partes, en la parte superior muestra el resultado de la ejecución del programa o los errores que se produzcan y en la inferior es donde tenemos que escribir el código del script en python.

IMPORTANTE: Python tiene muchos módulos precargados que vienen con la instalación original, entre ellos hay uno llamado pip, que sirve para realizar la carga de módulos adicionales.

Para lo que queremos hacer en este ejemplo hay que abrir una ventana CMD y escribir lo siguiente:

c:\ pip install opencv-contrib-python (Con esto instalamos OpenCV, que es una biblioteca para el tratamiento de imágenes)

y después 

c:\ pip install numpy

 

Evitar los errores de división por cero

También hay que añadir una línea de código en un método del componente PythonEngine1 del programa Demo01 (esto no viene en la demo original) de esta forma:

Hacemos clic sobre el componente PythonEngine1 y en la ventana Object Inspector del entorno Delphi 

 


hacemos doble clic sobre el método OnBeforeLoad y en el procedure añadimos la línea
MaskFPUExceptions(True)

Tiene que quedar así:

procedure TForm1.PythonEngine1BeforeLoad(Sender: TObject);
begin
 MaskFPUExceptions(True)
end;

Esto se hace para ocultar los errores de división por cero que suelen producirse al ejecutar opencv dentro de Delphi. 


Ejecutar el programa

En la ventana inferior escribimos el siguiente código:

 



import cv2
import numpy as np

cap = cv2.VideoCapture('c:/aeropuerto.mp4')

fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))

while True:

ret, frame = cap.read()
if ret == False: break

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# Dibujamos un rectángulo en frame, para señalar el estado
# del área en análisis (movimiento detectado o no detectado)
cv2.rectangle(frame,(0,0),(frame.shape[1],40),(0,0,0),-1)
color = (0, 255, 0)
texto_estado = "Estado: No se ha detectado movimiento"

# Especificamos los puntos extremos del área a analizar
area_pts = np.array([[240,320], [480,320], [620,frame.shape[0]], [50,frame.shape[0]]])

# Con ayuda de una imagen auxiliar, determinamos el área
# sobre la cual actuará el detector de movimiento
imAux = np.zeros(shape=(frame.shape[:2]), dtype=np.uint8)
imAux = cv2.drawContours(imAux, [area_pts], -1, (255), -1)
image_area = cv2.bitwise_and(gray, gray, mask=imAux)

# Obtendremos la imagen binaria donde la región en blanco representa
# la existencia de movimiento
fgmask = fgbg.apply(image_area)
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
fgmask = cv2.dilate(fgmask, None, iterations=2)

# Encontramos los contornos presentes en fgmask, para luego basándonos
# en su área poder determina si existe movimiento
cnts = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
for cnt in cnts:
if cv2.contourArea(cnt) > 500:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(frame, (x,y), (x+w, y+h),(0,255,0), 2)
texto_estado = "Estado: ALERTA Movimiento Detectado!"
color = (0, 0, 255)

# Visuzalizamos el alrededor del área que vamos a analizar
# y el estado de la detección de movimiento
cv2.drawContours(frame, [area_pts], -1, color, 2)
cv2.putText(frame, texto_estado , (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, color,2)

cv2.imshow('fgmask', fgmask)
cv2.imshow("frame", frame)

k = cv2.waitKey(70) & 0xFF
if k == 27:
break

cap.release()
cv2.destroyAllWindows()








 

Quedaría así:


Copiamos el archivo aeropuerto.mp4 a c:\

El archivo aeropuerto.mp4 es un vídeo del interior de un aeropuerto en el que se ha definido un ROI (Region Of Interest) marcado como un polígono de color rojo. 

Si quieren utilizar una webcam conectada a su PC tendrían que cambiar la línea

cap = cv2.VideoCapture(''c:/aeropuerto.mp4)

por 

cap = cv2.VideoCapture(0)


y pulsamos el botón EXECUTE SCRIPT

y ya tendríamos funcionando nuestro script en python ejecutándose dentro de Delphi, en el que detectaría la presencia de personas que atraviesen el área marcada en rojo, mostrando una alerta.



 

 

Links:

Códigos y tutoriales con Python y Opencv (github de GabySol)

Descarga de Python4Delphi

Empezando con Python4Delphi

Desarrollar aplicaciones nativas de Python en Windows con DelphiVCL

 

 



 

 



 

 


Salvapantallas programado en Delphi


Aquí tienen un salvapantallas realizado en Delphi. Después de compilarlo se generará un archivo llamado "FeuxDartifice.scr" (que es el salvapantallas que pueden instalar en Windows).

Para ver cómo funciona hay que hacer clic con el botón derecho del ratón sobre el archivo anterior y en el menú emergente activar la opción "Probar".

Link de descarga



Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...