Clipper On Line • Ver Tópico - WebCam

WebCam

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

WebCam

Mensagempor asimoes » 16 Ago 2015 21:30

Contribuindo com solução para uso de webcam com opção de tirar foto
Boa diversão.
O importante é incluir a lib Vfw32 que tem na mingw e msvc 2010
O exemplo é feito com hwgui

webcam_mingw.hbp
#
# $Id$
#
# Autor     : Alexandre Simões
# VersÆo    : 1.0
# Data      : 16/08/2015
# Harbour   : Harbour 3.4.0dev
#             http://harbour-project.org/
# Compilador: MinGW GNU C 5.0.1 (32-bit)
# ---------------------------------------------------------------------------------
# Nome do Executável
# ---------------------------------------------------------------------------------
# -o<outname> Diretiva para nome de arquivo de sa¡da
-owebcam_mingw
# ---------------------------------------------------------------------------------
# Bibliotecas
# ---------------------------------------------------------------------------------
# l<libname> Diretiva para linkar com a biblioteca <libname>. <libname> deve omitir
# path, extensÆo e o prefixo 'lib' (… menos que fa‡a parte do nome-de-arquivo).

-lhwgui
-lprocmisc
-lgtwvg
-lgtwvt
-lhbct
-lhbwin
-lhbnf
-lxhb
-lhbblink
-lhbmemio
-lhbhpdf
-llibhpdf
-lpng
-lhbzebra
-lhbwin
-lversion
-lVfw32
hbssl.hbc
hbtip.hbc
hbxpp.hbc
xhb.hbc
# ---------------------------------------------------------------------------------
# Caminhos dos Includes
# ---------------------------------------------------------------------------------
# -i<p>|-incpath=<p>  paths adicionais para pesquisa de arquivos headers
-incpath=\hb32fork\hwgui\include;
# ---------------------------------------------------------------------------------
# Caminho da Lib HPROC E HGAC
# ---------------------------------------------------------------------------------
# -L<libpath>         path adicional para pesquisar por bibliotecas
-L\hb32fork\hwgui\lib;
# ---------------------------------------------------------------------------------
# Outros Parƒmetros
# ---------------------------------------------------------------------------------
# .\OBJ\ Grava os arquivos .c e .o na subpasta OBJ
# ---------------------------------------------------------------------------------
# -workdir=<dir>      Working directory
#                     Diretiva para diret¢rio de trabalho da compila‡Æo.
#                     (default: .hbmk/plat/comp in incremental mode, OS temp
#                     directory otherwise).
-workdir=.\OBJ\
-gtgui
# ---------------------------------------------------------------------------------
# -[no]head[=<m>]     Control source header parsing (in incremental build mode)
#                     <m> can be: native (uses compiler to extract
#                     dependencies), full (default, uses simple text parser on
#                     the whole file), dep, off.
-head=full           
# ---------------------------------------------------------------------------------
# /n[<type>]          No implicit starting procedure
#                     <type>: 0=no implicit starting procedure
#                             1=no starting procedure at all
#                             2=add starting procedure if necessary
-n                         
# ---------------------------------------------------------------------------------
# -[no]warn[=lev]     Define o n¡vel de avisos (warnings) do compilador C
#                     <lev> pode ser: max, yes, low, no, def (padrão: yes).
-warn=no
# ---------------------------------------------------------------------------------
# -inc                Habilita o modo de compilaçao incremental.
-inc                 
# ---------------------------------------------------------------------------------
# -[no]debug          Adicionar/excluir informa‡äes de debug do compilador C.
#                     Para compilar com Harbour utilize a op‡Æo -b como de
#                     costume.
-b                   
# ---------------------------------------------------------------------------------
# -d<diretiva>        Diretiva de compila‡Æo para ifdef
-dHARBOUR
# ---------------------------------------------------------------------------------
# -icon=<file>        Seta o ícone para o aplicativo. <file> deve possuir um
#                     formato compat¡vel com a plataforma de destino.
#                     Diretiva para informar o icone da aplicação.
#-icon=P:\GERAL\HARBOUR\HARB_WIN.ICO
# ---------------------------------------------------------------------------------
# /u[<file>]          Usa comando def set em <arquivo> (ou nenhum)
#                     Diretiva para carregar arquivo header (.ch) para toda
#                     aplicação.
-u+hbcompat.ch
-mt
# ---------------------------------------------------------------------------------
# Prg(s) e Rc(s)
# ---------------------------------------------------------------------------------
webfoto_mingw.prg
# ---------------------------------------------------------------------------------

webfoto_mingw.prg
#include "windows.ch"
#include "guilib.ch"

*---------------------------------------------------------------------------------------
FUNCTION Main
*---------------------------------------------------------------------------------------

Local oFontBtn
Local oFont := Nil
Local nColor
Local hWnd

Local cDirFoto := HB_DirBase()+"FOTOS\"

   SET DELETE ON
   
   SET DATE BRIT
   
   cDriverName:=""

   PREPARE FONT oFontBtn NAME "MS Sans Serif" WIDTH 0 HEIGHT -12

   INIT WINDOW Form_Main MAIN TITLE "WebCam" ON INIT {||CameraSource(@cDriverName)}

   MENU OF Form_Main
      MENU TITLE "&WebCam"
         MENUITEM "&Ligar Camera"            ACTION {||previewCamera(cDriverName,@hWnd,Form_Main)}
         MENUITEM "&Bater Foto"              ACTION {||capFileSaveDIB(hWnd, cDirFoto+"teste.bmp")}
         SEPARATOR
         MENUITEM "&Sair"                    ACTION {||capDriverDisconnect(hWnd),hwg_EndWindow()}
      ENDMENU

       MENU TITLE "&Ajuda"
         MENUITEM "&Sobre" ACTION hwg_MsgInfo(HWG_Version(1))
      ENDMENU
   ENDMENU
   
   @ 10,0 IMAGE Image_1 SHOW "IMAGE" SIZE 500, 500
   
   Form_Main:Activate()

RETURN NIL

*------------------------------------------------------------------------------*
FUNCTION CameraSource(cDriverName)
*------------------------------------------------------------------------------*
cDriverName:=""
cDriverVersion:=""
For i := 0 To 9
   If capGetDriverDescription(i, @cDriverName, 128, @cDriverVersion, 128)
      exit
   EndIf
Next

RETURN cDriverName

*------------------------------------------------------------------------------*
FUNCTION PreviewCamera(cDriverName,hWnd,Form_Main)
*------------------------------------------------------------------------------*
Local i := 0
Local nMaxAttempt := 10
Local lConnect:=.f.

   hWnd := capCreateCaptureWindow("WebCam", hb_bitOr(WS_CHILD, WS_VISIBLE), ;
           Form_Main:Image_1:nLeft, Form_Main:Image_1:nTop, Form_Main:Image_1:nWidth, Form_Main:Image_1:nHeight, ;
           Form_Main:handle, 1)

  do while !lConnect .Or. ++i > nMaxAttempt
     lConnect := capDriverConnect(hWnd, cDriverName)
  enddo
   
  If lConnect
     // set the preview scale
     capPreviewScale(hWnd, .T.)
     // set the preview rate (ms)
     capPreviewRate(hWnd, 30)
     // start previewing the image
     capPreview(hWnd, .T.)
  Else
     // error connecting to video source
     hwg_DestroyWindow(hWnd)
     hWnd := 0
  EndIf

RETURN lConnect

#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>
#include "vfw.h"

#if defined( __BORLANDC__ )
#pragma warn -use /* unused var */
#endif

HB_FUNC( CAPGETDRIVERDESCRIPTION )
{
TCHAR lpszName[128];
int iName = hb_parni(3);
TCHAR lpszVer[128];
int iVer = hb_parni(5);
BOOL bRet;

bRet = capGetDriverDescription( (WORD) hb_parnl(1), lpszName, iName, lpszVer, iVer );

hb_storc( lpszName, 2 );
hb_storc( lpszVer, 4 );

hb_retl( bRet );
}

HB_FUNC( CAPCREATECAPTUREWINDOW )
{
hb_retnl( (LONG) capCreateCaptureWindow( (LPCSTR) hb_parc(1),
                                          (DWORD) hb_parnl(2),
                                          hb_parni(3), hb_parni(4),
                                          hb_parni(5), hb_parni(6),
                                          (HWND) hb_parnl(7),
                                          hb_parni(8) ) );
}

HB_FUNC( CAPDRIVERCONNECT )
{
hb_retl( capDriverConnect( (HWND) hb_parnl(1), hb_parni(2) ) );
}

HB_FUNC( CAPDRIVERDISCONNECT )
{
hb_retl( capDriverDisconnect( (HWND) hb_parnl(1) ) );
}

HB_FUNC( CAPPREVIEWRATE )
{
hb_retl( capPreviewRate( (HWND) hb_parnl(1), (WORD) hb_parnl(2) ) );
}

HB_FUNC( CAPPREVIEWSCALE )
{
hb_retl( capPreviewScale( (HWND) hb_parnl(1), hb_parl(2) ) );
}

HB_FUNC( CAPPREVIEW )
{
hb_retl( capPreview( (HWND) hb_parnl(1), hb_parl(2) ) );
}

HB_FUNC( CAPCAPTURESEQUENCE )
{
hb_retl( capCaptureSequence( (HWND) hb_parnl(1) ) );
}

HB_FUNC( CAPFILESAVEAS )
{
hb_retl( capFileSaveAs( (HWND) hb_parnl(1), hb_parc(2) ) );
}

HB_FUNC( CAPFILESAVEDIB )
{
hb_retl( capFileSaveDIB( (HWND) hb_parnl(1), hb_parc(2) ) );
}

#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

WebCam

Mensagempor asimoes » 17 Ago 2015 11:07

A saída da função CapFileSaveDIB é um bmp (bitmap) o arquivo fica grande, então modifiquei o código para salvar como jpeg que é bem menor
usando a freeimage

No hbp deve se incluído hbfimage.hbc

Vejam a função SaveToJPG

#include "windows.ch"
#include "guilib.ch"

#define WS_CHILD     0x40000000
#define WS_VISIBLE   0x10000000

Static hWnd, lConnect:=.f.

*---------------------------------------------------------------------------------------
FUNCTION Main
*---------------------------------------------------------------------------------------

Local oFontBtn
Local oFont := Nil
Local nColor

Local cDirFoto := HB_DirBase()+"FOTOS\"

   SET DELETE ON
   
   SET DATE BRIT
   
   cDriverName:=""

   PREPARE FONT oFontBtn NAME "MS Sans Serif" WIDTH 0 HEIGHT -12

   INIT WINDOW Form_Main MAIN TITLE "WebCam" ON INIT {||CameraSource(@cDriverName)}

   MENU OF Form_Main
      MENU TITLE "&WebCam"
         MENUITEM "&Ligar Camera"            ACTION {||PreviewCamera(cDriverName,@hWnd,Form_Main)}
         MENUITEM "&Bater Foto"              ACTION {||SaveToJPG( hWnd, cDirFoto )}
         SEPARATOR
         MENUITEM "&Sair"                    ACTION {||CapDriverDisconnect(hWnd),hwg_EndWindow()}
      ENDMENU

       MENU TITLE "&Ajuda"
         MENUITEM "&Sobre" ACTION hwg_MsgInfo(HWG_Version(1))
      ENDMENU
   ENDMENU
   
   @ 10,0 IMAGE Image_1 SHOW "IMAGE" SIZE 640, 480
   
   Form_Main:Activate()

RETURN Nil

*------------------------------------------------------------------------------*
FUNCTION CameraSource(cDriverName)
*------------------------------------------------------------------------------*
cDriverName:=Space(128)
cDriverVersion:=Space(128)

For i := 0 To 9
   If capGetDriverDescription(i, @cDriverName, 128, @cDriverVersion, 128)
      exit
   EndIf
Next

RETURN cDriverName

*------------------------------------------------------------------------------*
FUNCTION PreviewCamera(cDriverName,hWnd,Form_Main)
*------------------------------------------------------------------------------*
Local i := 0
Local nMaxAttempt := 10

   hWnd := capCreateCaptureWindow("WebCam", hb_bitOr(WS_CHILD, WS_VISIBLE), ;
           Form_Main:Image_1:nLeft, Form_Main:Image_1:nTop, Form_Main:Image_1:nWidth, Form_Main:Image_1:nHeight, ;
           Form_Main:handle, 1)

  //hwg_msginfo()
 
  do while !lConnect .Or. ++i > nMaxAttempt
     //lConnect := capDriverConnect(hWnd, 0)
     lConnect:=LigaWebCam( hWnd, i )
  enddo
   
  If lConnect
     // set the preview scale
     capPreviewScale(hWnd, .T.)
     // set the preview rate (ms)
     capPreviewRate(hWnd, 30)
     // start previewing the image
     capPreview(hWnd, .T.)
  Else
     // error connecting to video source
     hwg_DestroyWindow(hWnd)
     hWnd := 0
  EndIf

RETURN lConnect

*-----------------------------------------------------------------------------*
FUNCTION SaveToJPG( hWnd, cDirFoto )
*-----------------------------------------------------------------------------*
Local cBmp := cDirFoto + "TESTE.BMP", cJpg := cDirFoto + "TESTE.JPG"

   HB_default(@cDirFoto,hb_DirBase())

  CapFileSaveDIB(hWnd, cDirFoto + "TESTE.BMP")

  im:=fi_Load( FIF_BMP, cBmp, BMP_DEFAULT )
 
   fi_Save( FIF_JPEG, im, cJpg, JPEG_DEFAULT )
   
   Ferase( cBmp )                  // Remove temporary file

RETURN Nil

//DECLARE DLL_TYPE_LONG DIWriteJpg(DLL_TYPE_LPCSTR DestPath, DLL_TYPE_LONG quality, DLL_TYPE_LONG progressive) ;
//   IN DIJPG.DLL ALIAS BMPTOJPG
   
#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>
#include "vfw.h"

#if defined( __BORLANDC__ )
#pragma warn -use /* unused var */
#endif

HB_FUNC( CAPGETDRIVERDESCRIPTION )
{
TCHAR lpszName[128];
int iName = hb_parni(3);
TCHAR lpszVer[128];
int iVer = hb_parni(5);
BOOL bRet;

bRet = capGetDriverDescription( (WORD) hb_parnl(1), lpszName, iName, lpszVer, iVer );

hb_storc( lpszName, 2 );
hb_storc( lpszVer, 4 );

hb_retl( bRet );
}

HB_FUNC( CAPCREATECAPTUREWINDOW )
{
hb_retnl( (LONG) capCreateCaptureWindow( (LPCSTR) hb_parc(1),
                                          (DWORD) hb_parnl(2),
                                          hb_parni(3), hb_parni(4),
                                          hb_parni(5), hb_parni(6),
                                          (HWND) hb_parnl(7),
                                          hb_parni(8) ) );
}

HB_FUNC( CAPDRIVERCONNECT )
{
hb_retl( capDriverConnect( (HWND) hb_parnl(1), hb_parni(2) ) );
}

HB_FUNC( CAPDRIVERDISCONNECT )
{
hb_retl( capDriverDisconnect( (HWND) hb_parnl(1) ) );
}

HB_FUNC( CAPPREVIEWRATE )
{
hb_retl( capPreviewRate( (HWND) hb_parnl(1), (WORD) hb_parnl(2) ) );
}

HB_FUNC( CAPPREVIEWSCALE )
{
hb_retl( capPreviewScale( (HWND) hb_parnl(1), hb_parl(2) ) );
}

HB_FUNC( CAPPREVIEW )
{
hb_retl( capPreview( (HWND) hb_parnl(1), hb_parl(2) ) );
}

HB_FUNC( CAPCAPTURESEQUENCE )
{
hb_retl( capCaptureSequence( (HWND) hb_parnl(1) ) );
}

HB_FUNC( CAPFILESAVEAS )
{
hb_retl( capFileSaveAs( (HWND) hb_parnl(1), hb_parc(2) ) );
}

HB_FUNC( CAPFILESAVEDIB )
{
hb_retl( capFileSaveDIB( (HWND) hb_parnl(1), hb_parc(2) ) );
}

HB_FUNC( LIGAWEBCAM )
{
hb_retl( SendMessage( (HWND) hb_parnl(1), WM_CAP_DRIVER_CONNECT, hb_parni(2), 0));
}

HB_FUNC( LOADLIBRARY )
{
   hb_retnl( (LONG) LoadLibraryA( (LPCSTR) hb_parc( 1 ) ) ) ;
}

HB_FUNC( FREELIBRARY )
{
   hb_retl( FreeLibrary( (HMODULE) hb_parnl( 1 ) ) ) ;
}

HB_FUNC( GETPROCADDRESS )
{
  ULONG dwProcAddr;
  char  cFuncName[MAX_PATH];

    if ((dwProcAddr = (ULONG) GetProcAddress( (HMODULE) hb_parnl(1),
                                              HB_ISCHAR( 2 ) ? (LPCSTR) hb_parc(2) :
                                              (LPCSTR) MAKELONG((WORD) hb_parni(2), 0) ) ) == 0 )
    {
       if ( HB_ISCHAR( 2 ) )
       {
            // try forced ANSI flavour ?
           strcpy(cFuncName, hb_parc(2));
           strcat(cFuncName, "A");           
           dwProcAddr = (ULONG) GetProcAddress((HMODULE) hb_parnl(1), cFuncName);
       }
    }

    hb_retnl( dwProcAddr );

}
#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

WebCam

Mensagempor fladimir » 17 Ago 2015 21:10

Legal, obrigado por compartilhar... eu tenho isso em Xailer e vou aproveitar a dica do JPG.

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2434
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 157 vezes

WebCam

Mensagempor Wanderlei » 21 Ago 2015 08:59

Qual versão do Hwgui vc está usando, porque estou com a 2.17 e não achei este #include "vfw.h"
Wanderlei Cardoso
Analista / Programador
XHarbour + GtWvW + FiveWin + HwGui + Firebird
Skype: cwanderlei
cwanderlei@yahoo.com.br
(62)98171-3059 - whatsapp

Imagem
Avatar de usuário

Wanderlei
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 183
Data de registro: 25 Jan 2008 12:19
Cidade/Estado: Goiânia - GO
Curtiu: 13 vezes
Mens.Curtidas: 5 vezes

WebCam

Mensagempor asimoes » 21 Ago 2015 09:14

Qual versão do Hwgui vc está usando, porque estou com a 2.17 e não achei este #include "vfw.h"


Está na pasta include da mingw e msvc
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

WebCam

Mensagempor ANDRIL » 01 Nov 2017 16:18

Alexandre poderia esclarecer se sua Hwgui é compilada em harbour? Estou a procura de um fonte que leia a webcam e salve a imagem em disco. Acho que o seu código poderia me servir, so que minha Hwgui é a 2.16 em xHarbour, saberia me informar se conseguirei compilar seu fonte? Ou como faço para ter a Hwgui para uso em Harbour?

Veja meu outro tópico
http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=18719
Até+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar de usuário

ANDRIL
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1270
Data de registro: 06 Jul 2004 00:44
Curtiu: 12 vezes
Mens.Curtidas: 46 vezes

WebCam

Mensagempor asimoes » 01 Nov 2017 18:50

Andril,

A versão que eu uso é hegui 2.17 e harbour 3.4, acredito que vá funcionar
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 15 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro