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

Relacionados:

Reconocimiento de caras con Delphi

OCR simplificado

Librería Exif


Modos blend

Programa para generar efectos graficos

Componente para manipulacion de imagenes

Chipmunk 2D physics engine


Libros para saber más:

Tratamiento digital de la imagen con Adobe Photoshop

Tratamiento digital de la imagen  (Anaya)

Tratamiento digital de imágenes fotográficas

Astrofotografía con cámaras digitales

Edición de medios digitales con software libre (Anaya)





Chipmunk 2D motor de física bidimensional


Chipmunk 2D es un motor de física bidimensional codificado en C++, que podemos utilizarlo en Delphi utilizando la unit chipmunk.pas que viene incluida en el zip.
Para cada partícula incorpora dos tipos de estructuras: una de ellas guarda su forma (esfera, segmento o polígono) y posición  y la otra almacena la forma en la que interactúa con su entorno (velocidad, elasticidad y fricción), lo que hace que genere simulaciones altamente realistas, como podrán comprobar  en el exe que adjunto.
Mi recomendación es que reduzcan el radio de las esferas dentro del procedure ImgMouseMove hasta hacerlo = 1 y que jueguen con el ratón haciendo clic y moviéndolo para generar miles de esferas.



Enlace | Codigo fuente


Relacionado:
         
author:            Scott Lembcke  
 mail:              slembcke@gmail.com     
                                           
 chipmunk version:  5.3.2                  
 license:           MIT                    
 chipmunk homepage:                        
 http://code.google.com/p/chipmunk-physics/
                                           
 header version:    0.99 beta 2            
 date:              2010.12.09             
 header homepage:                           
 http://code.google.com/p/chipmunk-pascal/ 
                                           
----------- cabeceras escritas por -------------
                                           
           Kemka Andrey aka Andru           
                                           
 mail: dr.andru@gmail.com                  
 JID:  dr.andru@googlemail.com             
 ICQ:  496929849                           
 www:  http://andru-kun.inf.ua      






Automatizando Outlook

Funciones que tenemos que utilizar cuando queremos automatizar el programa Outlook desde Delphi.


Crear un objeto Outlook

var 
  Outlook, NmSpace, Folder: OleVariant; 
begin 
  Outlook := CreateOleObject('Outlook.Application');    
  NmSpace := Outlook.GetNamespace('MAPI');
  NmSpace.Logon(EmptyParam, EmptyParam, False, True);
  Folder := NmSpace.GetDefaultFolder(olFolderInbox);
  Folder.Display;


Cerrar Outlook


  NmSpace.Logoff;
  Outlook.Quit;
  Outlook.Disconnect;   
  { or }
  Outlook := nil;      
  { or }
  Outlook := Unassigned; //hacerlo así se usamos variants




Leer un mensaje

var
s: string;
objCDO: OLEVariant;
begin
objCDO := CreateOLEObject('MAPI.Session');
objCDO.Logon('', '', False, False);
objMsg := objCDO.GetMessage(itemOL.EntryID, itemOL.Parent.StoreID);

s := objMsg.Sender.Address;
ShowMessage(s);
objMsg := Unassigned;
objCDO := Unassigned;
end

//donde itemOL es un  MailItem que contiene  SenderName pero no contiene   SenderAddress


Componer un email
const
  olMailItem = 0;
var
  Email: Variant;
begin
 Email := Outlook.CreateItem(olMailItem);
  Email.Recipients.Add('Debs@djpate.freeserve.co.uk');
  Email.Subject := 'Greetings, O gorgeous one';
  Email.Body := 'Your web pages fill me with delight';
  Email.Attachments.Add('C:\CreditCardNo.txt', EmptyParam, EmptyParam, EmptyParam);
  Email.Send;

Enviar / recibir email
uses Office_TLB; 
var
ToolsMenu: CommandBar;
SendRecMenuItem, AllAccs: CommandBarControl;
begin
ToolsMenu := (Outlook.ActiveExplorer.CommandBars as CommandBars).Item['Tools'];
SendRecMenuItem := ToolsMenu.Controls_['Send and Receive'];
AllAccs := (SendRecMenuItem.Control as CommandBarPopup).Controls_['All Accounts'];
AllAccs.Execute;


Chequear el email no leído
var
   Inbox: MAPIFolder;
   NewMail: boolean;
...
   Inbox := NmSpace.GetDefaultFolder(olFolderInbox);
   NewMail := (Inbox.UnreadItemCount > 0);
   if NewMail then
     ShowMessage(Format('Unread items in Inbox: %d', [Inbox.UnreadItemCount]));

The constant olFolderInbox is defined in Outlook_TLB as $00000006.


Chequear el email no enviado
var
   Outbox: MAPIFolder;
   UnsentMail: integer;
...
   Outbox := NmSpace.GetDefaultFolder(olFolderOutbox);
   UnsentMail := Outbox.Items.Count;
   if (UnsentMail > 0) then
     ShowMessage(Format('Unsent items in Outbox: %d', [UnsentMail]));




The constant olFolderOutbox is defined in Outlook_TLB as $00000004




Añadir un contacto a la libreta de direcciones de Outlook
uses
ComObj, Variants, SysUtils;

type
TContact = record
   LastName: string;
   FirstName : string;
   Company : string;
   // ###  Further properties. See MSDN
end;


//------------------------------------------------------------------------------
{:Add outlook contact

@param ContactFolderPath The contact path. E.g.: '' for default contact folder,
'SubFolder\Sub2\Test' for subfolders
@param Contact The contact informations.
@author 19.09.2003 Michael Klemm}
//------------------------------------------------------------------------------
procedure OutlookAddContact(ContactFolderPath : string; Contact : TContact);
const
olFolderContacts = $0000000A;
var
Outlook : OleVariant;
NameSpace : OleVariant;
ContactsRoot : OleVariant;
ContactsFolder : OleVariant;
OutlookContact : OleVariant;
SubFolderName : string;
Position : integer;
Found : boolean;
Counter : integer;
TestContactFolder : OleVariant;
begin
// Connect to outlook
Outlook := CreateOleObject('Outlook.Application');
// Get name space
NameSpace := Outlook.GetNameSpace('MAPI');
// Get root contacts folder
ContactsRoot := NameSpace.GetDefaultFolder(olFolderContacts);
// Iterate to subfolder
ContactsFolder := ContactsRoot;
while ContactFolderPath <> '' do
begin
   // Extract next subfolder
   Position := Pos('\', ContactFolderPath);
   if Position > 0 then
   begin
     SubFolderName := Copy(ContactFolderPath, 1, Position - 1);
     ContactFolderPath := Copy(ContactFolderPath, Position + 1, Length(ContactFolderPath));
   end
   else
   begin
     SubFolderName := ContactFolderPath;
     ContactFolderPath := '';
   end;
   if SubFolderName = '' then
     Break;
   // Search subfolder
   Found := False;
   for Counter := 1 to ContactsFolder.Folders.Count do
   begin
     TestContactFolder := ContactsRoot.Folders.Item(Counter);
     if LowerCase(TestContactFolder.Name) = LowerCase(SubFolderName) then
     begin
       ContactsFolder := TestContactFolder;
       Found := True;
       Break;
     end;
   end;
   // If not found create
   if not Found then
     ContactsFolder := ContactsFolder.Folders.Add(SubFolderName);
end;
// Create contact item
OutlookContact := ContactsFolder.Items.Add;
// Fill contact information
OutlookContact.FirstName := Contact.FirstName;
OutlookContact.LastName := Contact.LastName;
OutlookContact.CompanyName := Contact.Company;

// ### Further properties

// Save contact
OutlookContact.Save;
// Disconnect from outlook
Outlook := Unassigned;
end;



Eliminar todos los archivos adjuntos que hayan sido enviados por un determinado email
uses
comobj;

{...}

function manageattachments(sendersname, attachmentpath: string;
maildelete: boolean): boolean;
var
oapp: variant;
ons: variant;
ofolder: variant;
omsg: variant;
atc: variant;
attfilename: variant;
filename: string;
checksender: string;
counter: integer;
mailcounter: integer;
begin
try
oapp := createoleobject('outlook.application');
try
ons := oapp.getnamespace('mapi');
ofolder := ons.getdefaultfolder(6); // foldertypeenum (olfolderinbox)
mailcounter := 1;
// if there is any email in the inbox
if ofolder.items.count > 0 then
begin
repeat
// get the first email
omsg := ofolder.items(mailcounter);
// check the name or email
// use checksender := omsg.subject to search on subject;
checksender := omsg.sendername;
if checksender = sendersname then
// remove this line to backup all your attachments.
begin
// check how many attachments
atc := omsg.attachments.count;
if atc > 0 then
begin
// get all the attachments and save them
for counter := 1 to atc do
begin
attfilename := omsg.attachments.item(counter).filename;
//filename := includetrailingbackslash(attachmentpath)+attfilename; {use this line for d5)}
filename := attachmentpath + '' + attfilename;
omsg.attachments.item(counter).saveasfile(filename);
end;
end;
if maildelete then
begin
omsg.delete;
// there's 1 email less, so mailcounter - 1
dec(mailcounter);
end;
end;
// get the next email
inc(mailcounter);
// do until there is no more email to check
until mailcounter > ofolder.items.count;
end;
finally
oapp.quit;
end;
except
result := false;
exit;
end;
result := true;
end;


procedure tform1.button1click(sender: tobject);
begin
// manageattachments(email or name, backup directory, maildelete yes or no)
manageattachments('info@cleys.com', 'f:test', false);
end;


{
warning!
all your selected email will be deleted if maildelete = true
autor: patrick cleys 
homepage: http://www.dcmedical.org 
}












Automatizando CorelDraw

Funciones que se utilizan cuando queremos manejar archivos creados con CorelDraw dentro de nuestros programas Delphi


Abrir un documento Corel

var
  CorelDraw: Variant;
  …
CorelDraw := CreateOleObject('CorelDraw.Automation.8');
CorelDraw.FileNew;
  // también se puede usar CorelDraw.FileOpen(FileName);
CorelDraw.SetDocVisible(True);
CorelDraw.FileSave('NewName', 0, False, 0, False);
CorelDraw.FileExit(False); 
CorelDraw := Unassigned;

Parámetros de la función FileSave
FileName: WideString
ThumbNailSize: Integer
SaveSelectedOnly: WordBool
FileVersion: Integer
IncludeCMXData: WordBool




Abrir un documento usando COM
  var
    Disp: IDispatch;
  begin
    Disp := CreateComObject(CLASS_CDrawAutomate) as IDispatch;
    Draw := IDrawAutomate(Disp);



Cerrar  CorelDraw
  Draw.FileExit(False);
  Draw := nil;             // si Draw es una variable del tipo IDrawAutomate 

o

  Draw.FileExit(False);
  Draw := Unassigned;      // si Draw es una variable de tipo variant



Cerrar un documento
 Draw.FileClose(False); 

Cambiar la orientación del texto y otras propiedades.
CorelDraw.SetPageOrientation(0);
CorelDraw.SetPageSize(PageW, PageH);
CorelDraw.NewLayer('NewLayer1');
CorelDraw.SelectLayer('NewLayer1');
CorelDraw.CreateEllipse(CalcY(Y1)), CalcX(X1), CalcY(Y2), CalcX(X2), 0, 0, 0);
CorelDraw.CreateRectangle(CalcY(Y1)), CalcX(X1), CalcY(Y2), CalcX(X2), CalcX(Radius));


Primero hay que crear el objeto del dibujo y luego se asignan distintas propiedades, como color, tipo de relleno, grosor, etc Por defecto, estos valores no se pueden establecer a través de la automatización.

CorelDraw.CreateArtisticText( Text, CalcX(X), CalcY(Y));
With Font do
  begin
  if (Italic) and (Bold) then FSK:=14 else
  if (Italic) then FSK:=8 else
  if (bold) then FSK:=13 else FSK:=7;
  end;
CorelDraw.SetCharacterAttributes( 0, 0, Font.Name, FSK, Abs(Font.Size)*10,
  0, 0, 0, 0, 0, 1000, 1000, HAlign);
ColorToCMYK(Font.Color, C,M,Y,K);
CorelDraw.StoreColor(2, C,M,Y,K, 0,0,0,0); 
CorelDraw.ApplyUniformFillColor; 

CorelDraw.GetSize(XSize, YSize); 
CorelDraw.MoveObject(0, -YSize); 

Mostrar todos los objetos:
var ObjID, FirstObjID:longint;
begin
CorelDraw.SelectAllObjects;
CorelDraw.SelectNextObject(true);
FirstObjID := CorelDraw.GetObjectsCDRStaticID;
Repeat
...
// otra opción    CorelDraw.SelectNextObject(true);
ObjID := CorelDraw.GetObjectsCDRStaticID;





Lotus Notes con Delphi

Abre la base de datos de Lotus Notes  names.nsf y muestra su libro de direcciones.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Domino_TLB, Menus, ComCtrls;
const
PASSWD = 'ur70';
type
TForm2 = class(TForm)
   TV_INFO: TTreeView;
   MainMenu1: TMainMenu;
   File1: TMenuItem;
   Create1: TMenuItem;
   Init1: TMenuItem;
   AddressBook1: TMenuItem;
   Scan1: TMenuItem;
   procedure Create1Click(Sender: TObject);
   procedure Init1Click(Sender: TObject);
   procedure Scan1Click(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
end;

var
Form2: TForm2;
Session: TNotesSession;
implementation

{$R *.dfm}

procedure TForm2.Create1Click(Sender: TObject);
begin
Session := TNotesSession.Create(nil);
end;

procedure TForm2.Init1Click(Sender: TObject);
begin
Session.Initialize(PASSWD);
end;


Abre la base de datos names.nsf y muestra el libro de direcciones

procedure TForm2.Scan1Click(Sender: TObject);
var
NotesDb: NotesDatabase;
addrBook: NotesDatabase;
People, People2: NotesView;
Person, Person2: NotesDocument;
View: NotesView;
Item: NotesItem;
AddrBooks: OleVariant;
Views: OleVariant;
Items: OleVariant;
x, y, z: integer;
view_name: string;
tn, tc: TTreeNode;
begin
NotesDb := Session.GetDatabase('', 'names.nsf', False);
AddrBooks := Session.AddressBooks;
for x := 0 to VarArrayHighBound(AddrBooks, 1) -
   VarArrayLowBound(AddrBooks, 1) do
begin
   addrBook := NotesDatabase(IUnknown(AddrBooks[x]));
   if (addrBook.IsPrivateAddressBook) then
   begin
     addrBook.Open;
   end
   else
     addrBook := nil;
   if (addrBook <> nil) then
   begin
     Views := addrBook.Views;
     for y := 0 to VarArrayHighBound(Views, 1) -
       VarArrayLowBound(Views, 1) do
     begin
       View := NotesView(IUnknown(Views[y]));
       view_name := View.Name;
       tn := tv_info.Items.AddNode(nil, nil, view_name, nil, naAdd);

       if copy(view_name, 1, 1) = '$' then
         view_name := copy(view_name, 2, length(view_name) - 1);
       people := addrBook.GetView(view_name);
       person := people.GetFirstDocument;
       if Person <> nil then
       begin
         Items := Person.Items;
         for z := 0 to VarArrayHighBound(Items, 1) -
           VarArrayLowBound(Items, 1) do
         begin
           Item := NotesItem(IUnknown(Items[z]));
           tc := tv_info.Items.AddChild(tn, Item.Name);

           people := addrBook.GetView(view_name);
           person := people.GetFirstDocument;

           while (Person <> nil) do
           begin
             try
               try
                 tv_info.Items.AddChild(tc, Person.GetFirstItem(Item.Name).Text
                   {Item.Text});
               except
               end;
             finally
               Person := People.GetNextDocument(Person);
             end;
           end;
         end;
       end;
     end;

   end;
end;
end;

end.