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

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 imagen se ven los electrones saliendo en tiempo real de la placa de color gris hacia la placa de color rojo acelerándose cuando atraviesan el campo eléctrico.

El escenario se puede girar o rotar en todas direcciones para apreciar mejor el movimiento.


Autor:
Email: systemhalt@nm.ru
www.systemhalt.nm.ru


Codigo fuente



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


Simulador de circuitos lógicos



Simulador de circuitos con código fuente que permite diseñar circuitos basándose en puertas lógicas: Y, AND, OR, etc.



Una vez que se termina el diseño se puede activar virtualmente para ver su resultado.
Utilizando o no una tabla es posible realizar funciones básicas: sumador, comparador, etc y simular cualquier expresión booleana de una forma fácil.
El autor incluye varios ejemplos:
-Un display de 7 segmentos
-Un multiplicador binario.

Descargar codigo

Autor: Montero-Ribas

Web: ADMR.CAD.Free.fr





Comprimir jpgs



Con este programa se comprimen imágenes bmp y jpg en archivos jpg.

Características:

-Regulación del nivel de compresión.

-6 formatos standards de redimiensionamiento.

-Varios formatos de exportación, incluyen zip.

-Gestión completa de exif, xmp, miniaturas, thumbnails, copyright.

-Posibilidad de añadir copyrights o cualquier texto sobre la imagen.

-Posibilidad de cambiar la fecha de creación o modificación.



Autor:

Nicolas Plagieri

http://www.ni69.info/

Aplicacion


Codigo fuente

Movimiento de un octoedro



Movimiento de un octaedro en pantalla. (No utiliza OpenGL, GlScene)





Codigo fuente










LIBROS:














Rotación de poliedros en el espacio








Simula el movimiento de un objeto sobre los 3 ejes X,Y,Z





Juego de damas avanzado


Aquí tienen el conocido juego de las damas. Tiene como opción la posibilidad de jugar humano-máquina, máquina-máquina, giro de tablero y varios niveles (beginer, intermediate, expert).












El juego de las líneas en 3D










 Juego interesante, adictivo y muy bien programado.





Autor: Alexander Izmukhambetov 





Librería Exif


Biblioteca de funciones para crear, editar y modificar los metadatos exif y ipctc en archivos de imágenes con formato jpg.













Autor:


Chris Rolliston (http://delphihaven.wordpress.com/).





Licence:


MPL 1.1 (text at http://www.mozilla.org/MPL/MPL-1.1.html).





Features





·        Exif parsing is 100% pure Delphi code — doesn’t use (say) LibExif or LibTiff, GDI+, WIC, or even Windows.pas.





·        Reads and writes both small- and big-endian data.





·        Surfaces both standard Exif and Windows Explorer tags, and provides access to the tags of some maker note types too.





·        Doesn’t corrupt internal maker note offsets when data is rewritten, and takes account of the Microsoft-defined OffsetSchema tag.





·        Can optional write XMP data as per the XMP Exif schema.





·        Includes an IPTC reader/writer class as well.














Manejar archivos DICOM













DICOM (Digital Imaging and Communication in Medicine) es el estándar
reconocido mundialmente para el intercambio de imágenes médicas, pensado
para el manejo, almacenamiento, impresión y transmisión de imágenes médicas.






Mas abajo pueden descargarse un conversor de archivos
en formato DICOM a bmp, jpg o png y un visor de imágenes que
incluye el objeto ActiveX ezDICOMax.ocx.










Para instalarlo:




Desde Delphi seleccionar 'Import ActiveX Control' desde el
menú "component" y después pulsar "Add" y
"Install" seleccionado el archivo DCMaxPro.OCX que está incluido en
la carpeta.




Una vez que se ha instalado correctamente se debería ver el
componente "DCMax" en la pestaña "ActiveX" de la barra de
componentes.









Si da un error del tipo "eOlesyserror" es porque no
se ha registrado el activex llamado ezDICOMax.ocx




Para instalarlo teclear:    c:\regsvr32 ezDICOMax.ocx




y para desinstalarlo  c:\regsvr32   /u   ezDICOMax.ocx 

 



Codigo fuente en Delphi :




Conversor de imagenes DICOM a bmp,jpg,png



Autor:  Wolfgang Krug and Chris Rorden

chris.rorden@nottingham.ac.uk





Visor de imagenes



PROCEDIMIENTOS DEL PROGRAMA


procedure TForm1.ToolClick(Sender: TObject);
begin
     DCMax1.DCMtool := (sender as TSpeedButton).tag;
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Open1Click(Sender: TObject);
begin
     if not OpenDialog1.execute then exit;
     DCMax1.DCMfilename := OpenDialog1.Filename;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DCMax1.DCMtoolbar := false;
  Smooth1.Checked := DCMax1.DCMsmoothOn;
end;

procedure TForm1.N2001Click(Sender: TObject);
var lPct: integer;
begin
     (Sender as TMenuItem).Checked := true;
     lPct := (Sender as TMenuItem).tag;
     if lPct = 0 then begin
         if not DCMax1.DCMbestFitZoom then
            DCMax1.DCMbestFitZoom := true;
     end else begin
         if DCMax1.DCMbestFitZoom then
            DCMax1.DCMbestFitZoom := false;
         DCMax1.DCMzoomPct := lPct;
     end;

end;

procedure TForm1.Smooth1Click(Sender: TObject);
begin
  Smooth1.Checked := not Smooth1.Checked;
  DCMax1.DCMsmoothOn := Smooth1.Checked;
end;

procedure TForm1.InvertedHotmetal1Click(Sender: TObject);
begin
     (Sender as TMenuItem).Checked := true;
     DCMax1.DCMcolorscheme := (Sender as TMenuItem).tag;
end;

procedure TForm1.N3x3Click(Sender: TObject);
var lMosaic: integer;
begin
    lMosaic := (Sender as TMenuItem).tag;
    (Sender as TMenuItem).checked := true;
    //Form1.caption := inttostr(lMosaic);
    DCMax1.DCMmosaicFirstSlice := 1;
    DCMax1.DCMmosaicLastSlice := maxint;
    DCMax1.DCMmosaicRows := lMosaic;
    DCMax1.DCMmosaicCols := lMosaic;

    //DCMax1.DCMmosaicX[lMosaic,lMosaic,1] := MaxInt;
    //DCMax1.DCMmosaicX[2,2,1,16];
    //xxxx
end;

procedure TForm1.DelphiDemo1Click(Sender: TObject);
begin
 showmessage('DelphiDemo by Chris Rorden. Demonstrates ezDICOM ActiveX component. '+
  DCMax1.DCMversionInfo);
end;

procedure TForm1.ShowHeader1Click(Sender: TObject);
begin
  ShowHeader1.Checked := not ShowHeader1.Checked;
  DCMax1.DCMshowHeader := ShowHeader1.Checked;
end;

procedure TForm1.Copy1Click(Sender: TObject);
begin
  if DCMax1.DCMshowHeader then
    DCMax1.DCMcopyHeader2Clipboard
  else
    DCMax1.DCMcopyImage2Clipboard;
end;

procedure TForm1.Saveimage1Click(Sender: TObject);
begin
     if not SaveDialog1.Execute then exit;
     DCMax1.DCMsaveToFile := SaveDialog1.FileName;
end;

procedure TForm1.Border1Click(Sender: TObject);
begin
 // DCMax1.DCMmo
end;

procedure TForm1.Unloadimages1Click(Sender: TObject);
begin
end;
(*procedure TForm1.Loadc0020dcm50times1Click(Sender: TObject);
var lInc: integer;
begin
  for lInc := 1 to 50 do
    DCMax1.DCMfilename := 'C:\0020.dcm';
end;

procedure TForm1.Unloadimages1Click(Sender: TObject);
begin
  DCMax1.DCMunloadImages:= 0;
end;
*)
procedure TForm1.PreviousSliceItemClick(Sender: TObject);
begin
  if DCMax1.DCMslice > 1 then
    DCMax1.DCMslice := DCMax1.DCMslice -1
  else
    DCMax1.DCMslice := DCMax1.DCMimageSlices;
end;

procedure TForm1.NextSliceItemClick(Sender: TObject);
begin
  if DCMax1.DCMslice < DCMax1.DCMimageSlices then
    DCMax1.DCMslice := DCMax1.DCMslice +1
  else
    DCMax1.DCMslice := 1;
end;

procedure TForm1.DCMax1DCMmouseMoveIntensity(ASender: TObject; X, Y,
  Button, Shift, Intensity: Integer; RGB: WordBool);
begin
  Caption := inttostr(X)+','+inttostr(Y)+':'+inttostr(intensity);
end;


















Componente para modificar la interfaz de usuario de tus programas

AlphaControls es una VCL que mejorará notablemente la interfaz gráfica de tus aplicaciones de escritorio en Delphi .





Lo que os presento ahora es la versión AlphaControls Lite Edition v.8.14 que contiene 13 componentes gratuitos y totalmente funcionales derivados del dpk de AlphaControls (TsSkinManager, TsSkinProvider, TsEdit, TsCheckBox, TsPanel, TsButton, TsScrollBar, TsLabel, TsWebLabel, TsBitBtn, TsComboBox, TsListBox and TsGauge).





Características:




  1. Es posible incorporar varios skin dentro del Exe.

  2. Los skins se pueden actualizar fácilmente.

  3. El dibujo de los componentes se producen por capas por lo que pueden tener bordes, sombras y otros bonitos efectos.

  4. También se pueden aplicar a los componentes standard (tEdit, tMemo, Tcombobox, ...)

  5. Los elementos de cada control son calculados en tiempo real, aunque cualquier control puede ser libremente movido y redimensionado en tiempo real.

  6. Los botones soportan PNG-glyhs.


Soporta los siguientes compiladores:



Delphi 5/6/7

Delphi 2005/2006/2007/2009/2010/XE/XE2/XE3 (x32/x64)

C++ Builder 6/2006/2007/2009/2010/XE/XE2/XE3





Para aplicarlo en vuestros programas tenéis que incorporar el componente tsSkinManager con la propiedad "Active=True" sobre vuestro Form y después hacer lo mismo con el tsSkinProvider.

Hay que tener la precaución de poner la carpeta "Skin" que viene en el componente, en directorio raíz del equipo (c:\skin)



Descarga del componente



Página del fabricante





Aquí tenéis varios skins gratuitos:





Click for enlarge


Download Mint

Serge Goncharov, 2012-11-15, 50.7 Kb

Rate :    9.24 / 17




2.


Click for enlarge


Download Zest

Serge Goncharov, 2012-10-26, 27.7 Kb

Rate :    9.18 / 17




3.


Click for enlarge


Download Subway

Graf Sascha, 2012-10-12, 98.4 Kb

Rate :    8.69 / 26




4.


Click for enlarge


Download Black box

Graf Sascha, 2012-09-27, 67.1 Kb

Rate :    9.08 / 48




5.


Click for enlarge


Download iOS dark

Serge Goncharov, 2012-09-11, 41.9 Kb

Rate :    8.55 / 33




6.


Click for enlarge


Download Toxic

Graf Sascha, 2012-07-13, 59.5 Kb

Rate :    9.06 / 32




7.


Click for enlarge


Download Android OS

Graf Sascha, 2012-06-24, 42.6 Kb

Rate :    9.10 / 48




8.


Click for enlarge


Download Windows 8

Graf Sascha, 2012-06-23, 60.8 Kb

Rate :    8.04 / 46




9.


Click for enlarge


Download Light Board

Serge Goncharov, 2012-04-14, 107.3 Kb

Rate :    9.10 / 42




10.


Click for enlarge


Download Autumn sky

Serge Goncharov, 2012-04-02, 66.5 Kb

Rate :    9.11 / 54




11.


Click for enlarge


Download WOT

Serge, 2012-01-22, 123.7 Kb

Rate :    8.41 / 61




12.


Click for enlarge


Download WEB2

Serge Goncharov, 2011-10-17, 37.5 Kb

Rate :    9.14 / 84












Capturar pantalla






Capturador de pantalla con muchas opciones:




  • Salida Jpeg o Bmp permitiendo seleccionar la calidad de la imagen.

  • Timer para capturar pantalla.

  • Soporte para múltiples monitores. Captura todos los monitores, el monitor activo o el monitor primario.

  • Auto Save.

  • Hot-key para imprimir una pantalla.

  • Minimizar como trayicon.





 Autor: g1i7ch


  Este proyecto se hizo para i3xC (ic0de's coding competition) http://www.ic0de.org




















Reconocimiento de imagenes








Image Recognition Library es un componente (dll) que hace fácil el añadir la funcionalidad de reconocimiento de imágenes en sus aplicaciones, es decir lo que hace es comparar dos imágenes identificando si son iguales o no o encontrando una imagen más pequeña en otra más grande según una tolerancia variable.



Características:

-Exacto o relativo ARGB y AHSL y diferentes modos de compresión utilizando el canal alpha.

-Pre-proceso de imagen con 6 diferentes resamplers.

-Utiliza Multi-thread

-Soporte para multi-coincidencias

-Utiliza unicode

-Plataforma x86 y x64



Web: http://www.3delite.hu/Object%20Pascal%20Developer%20Resources/ImageRecognitionLibrary.html



Enlace | Codigo fuente

















Seguimiento de personas, animales y objetos con OpenCV en Delphi




OpenCV para los que no la conozcan, es una biblioteca libre enfocada hacia la visión artificial, inicialmente desarrollada por Intel bajo licencia BSD lo que permite que sea usada libremente para un propósito comercial o de investigación.






OpenCV es multiplataforma con versiones para Windows, Linux y Mac y contiene funciones que tratan los temas de proceso de visión, reconocimiento facial, calibrado de cámaras o robótica.


Esta biblioteca es la base de la herramienta Swistrack que sirve para hacer un seguimiento de personas, animales y objetos.





El siguiente código se puede ejecutar en Delphi XE2 o superior y lo que hace es, como veis en la imagen, un seguimiento de las personas que circulan por la calle rodeándolas con un rectángulo de color rojo a medida que se van desplazando.




(* /*****************************************************************
// Delphi-OpenCV Demo
// Copyright (C) 2013 Project Delphi-OpenCV
// ****************************************************************
// Contributor:
// Mikhail Grigorev
// email: sleuthhound@gmail.com
// ****************************************************************
// You may retrieve the latest version of this file at the GitHub,
// located at git://github.com/Laex/Delphi-OpenCV.git
// ****************************************************************
// The contents of this file are used with permission, subject to
// the Mozilla Public License Version 1.1 (the "License"); you may
// not use this file except in compliance with the License. You may
// obtain a copy of the License at
// http://www.mozilla.org/MPL/MPL-1_1Final.html
//
// Software distributed under the License is distributed on an
// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
// implied. See the License for the specific language governing
// rights and limitations under the License.
******************************************************************* *)

// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF
program MotionDetect;

{$APPTYPE CONSOLE}
{$POINTERMATH ON}
{$R *.res}

uses
System.SysUtils,
Math,
uLibName in '..\..\..\include\uLibName.pas',
highgui_c in '..\..\..\include\highgui\highgui_c.pas',
imgproc.types_c in '..\..\..\include\imgproc\imgproc.types_c.pas',
imgproc_c in '..\..\..\include\imgproc\imgproc_c.pas',
imgproc in '..\..\..\include\imgproc\imgproc.pas',
core in '..\..\..\include\core\core.pas',
core.types_c in '..\..\..\include\core\Core.types_c.pas',
core_c in '..\..\..\include\core\core_c.pas';

var
storage: pCvMemStorage = nil;
capture: pCvCapture = nil;
frame: pIplImage = nil;
frame_grey: pIplImage = nil;
difference_img: pIplImage = nil;
oldframe_grey: pIplImage = nil;
contours: pCvSeq = nil;
c: pCvSeq = nil;
// rect: TCvRect;
rect2d: TCvBox2D;
key: integer;
first: boolean = true;

begin
try
capture := cvCreateCameraCapture(0);
storage := cvCreateMemStorage(0);
frame := cvQueryFrame(capture);
frame_grey := cvCreateImage(cvSize(frame^.width, frame^.height), IPL_DEPTH_8U, 1);

while true do
begin
frame := cvQueryFrame(capture);
if frame = nil then
break;
cvCvtColor(frame, frame_grey, CV_RGB2GRAY);
if first then
begin
difference_img := cvCloneImage(frame_grey);
oldframe_grey := cvCloneImage(frame_grey);
cvConvertScale(frame_grey, oldframe_grey, 1.0, 0.0);
first := false;
end;
cvAbsDiff(oldframe_grey, frame_grey, difference_img);
cvSmooth(difference_img, difference_img, CV_BLUR);
cvThreshold(difference_img, difference_img, 25, 255, CV_THRESH_BINARY);
contours := AllocMem(SizeOf(TCvSeq));
cvFindContours(difference_img, storage, @contours, SizeOf(TCvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE,
cvPoint(0, 0));
c := contours;
while (c <> nil) do
begin
rect2d := cvMinAreaRect2(c);
cvRectangle(frame, cvPoint(Round(rect2d.center.x - rect2d.size.width / 2),
Round(rect2d.center.y - rect2d.size.height / 2)), cvPoint(Round(rect2d.center.x + rect2d.size.width / 2),
Round(rect2d.center.y + rect2d.size.height / 2)), cvScalar(0, 0, 255, 0), 2, 8, 0);
c := c.h_next;
end;
cvShowImage('Output Image', frame);
cvShowImage('Difference Image', difference_img);
cvConvertScale(frame_grey, oldframe_grey, 1.0, 0.0);
cvClearMemStorage(storage);
c := nil;
FreeMem(contours, SizeOf(TCvSeq));
key := cvWaitKey(33);
if (key = 27) then
break;
end;
cvReleaseMemStorage(storage);
cvReleaseCapture(capture);
cvReleaseImage(oldframe_grey);
cvReleaseImage(difference_img);
cvReleaseImage(frame_grey);
cvDestroyAllWindows();
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;

end.















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...