Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Captura de Video - a Leo o otros
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Captura de Video - a Leo o otros Responder citando

Buenas,
Estoy trabajando con la captura video y quisiera enviar la secuencia capturada vía la red (socket) en tiempo real. La captura está trabajando correctamente, pero no descubre cómo tener acceso al contenido capturado. Estoy tentando tener acceso a esta información por las funciones capCaptureSequenceNoFile y capSetCallbackOnFrame (o capSetCallbackOnStream). En esta función la pude poner un contador del frame, por ejemplo, pero no estoy encontrando cómo tener acceso a la información del quadro (o de la stream) para que pudesse enviarla por la red. Alguien sabe como tener acceso a estos datos?
Volver arriba
Mensaje    Asunto: Captura de Video - a Leo o otros Responder citando

Hola Samuel:

'capSetCallbackOnStream' solo se dispara cuando estamos en modo captura, bien con 'capCaptureSequenceNoFile' (sin captura a fichero) o bien con 'capCaptureSequence' (para capturar un .AVI por ejemplo).

'capSetCallbackOnFrame' se dispara cuando estamos en modo preview, con 'capPreview' por ejemplo. El ejemplo adjunto muestra esto.

Nos permite capturar los datos del fotograma en el formato que lo entregue la capturadora o camara, en el ejemplo lo he puesto que trabaje sin compresión y a 24bits de color para que fuese mas fácil manipular la imagen. (más detalles en los comentarios del código)

Como ejemplo, creamos un proyecto nuevo y añadimos al Form 1 TPanel (Panel1) de 322x242 pixels, 2 TButton (btnStart y BtnSaveFrame) y la cabecera #include <vfw.h>
y metemos este código en la Unit1.cpp:

code:

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include <vfw.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TForm1 *Form1;
HWND w; // Ventana de captura
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
LRESULT CALLBACK fcb(HWND w, LPVIDEOHDR h)
{
// En 'h->lpData' tenemos los datos del fotograma
// antes de ser visualizado. En este ejemplo a 320x240 24bits,
// por lo tanto la información de cada pixel estara del siguiente
// modo BLUE-GREEN-RED.... o sea, 3 bytes por cada pixel

// En 'h->dwBytesUsed' tenemos la cantidad de bytes de la imagen

// Para este ejemplo, como demostración vamos a poner la imagen
// en negativo. Aquí podriamos tanto modificar la imagen antes
// de ser vista o bien comprimir estos datos y enviarlos por la red...
typedef struct {BYTE b,g,r;} PIXEL;
for (DWORD i=0; i<h->dwBytesUsed/3; i++)
{
PIXEL *pixel = &((PIXEL*)h->lpData)[i];
pixel->r = ~pixel->r;
pixel->g = ~pixel->g;
pixel->b = ~pixel->b;
}

// devolvemos TRUE para que la función siga capturando mas fotogramas
return TRUE;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStartClick(TObject *Sender)
{
// Selecciona la ventana de captura
w = capCreateCaptureWindow("Mi Video", WS_CHILD | WS_VISIBLE,
1, 1, 320, 240, Panel1->Handle, 0);
if (!w)
throw Exception("No se pudo seleccionar una ventana de captura");

// Se conecta con el primer dispositivo de captura que encuentra
bool bRet;
for (int iCapDrv=0; iCapDrv<10; iCapDrv++)
{
bRet = capDriverConnect(w, iCapDrv);
if (bRet) break;
}
if (!bRet)
throw Exception("Error: no se encontraron dispositivos.");

// Mostramos en el titulo del form el nombre del driver seleccionado
char szNombreDrv[256];
if ( capDriverGetName(w, szNombreDrv, sizeof(szNombreDrv)) )
Caption = szNombreDrv;

// Cambiar formato de video a 320x240 24bits de color
// tambien podriamos ponerlo manualmente en esta
// resolución usando la función 'capDlgVideoFormat(w);'
BITMAPINFO bi;
ZeroMemory(&bi, sizeof(bi));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = 320;
bi.bmiHeader.biHeight = 240;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
if (!capSetVideoFormat(w, &bi, sizeof(bi)))
throw Exception("No se puede cambiar el formato de video");

// Definimos la función que sera
// llamada antes de visualizar cada fotograma
if (!capSetCallbackOnFrame(w, fcb))
throw Exception("callback no instalado");

// Previsualizar captura
capPreviewScale(w, true);
capPreviewRate(w, 40);
capPreview(w, true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnSaveFrameClick(TObject *Sender)
{
// Enviamos un fotograma a un fichero .BMP
String FileName = ExtractFilePath(Application->ExeName) + "foto.bmp";
capFileSaveDIB(w, FileName.c_str());
}
//---------------------------------------------------------------------------


Saludos.

Volver arriba
Mensaje    Asunto: Captura de Video - a Leo o otros Responder citando

Gracias _Leo!

Solo mas una informacion : para apresentar la imagen - en la otra estación de la red - qual es lo metodo mas adecuado ? Estoy intentando via DrawDib, es lo mejor ? O hay una forma de atribuir los datos (h de tu ejemplo) a uno TPanel ?

Saludos!

Volver arriba
Mensaje    Asunto: Captura de Video - a Leo o otros Responder citando

Una forma sencilla de dibujarlo en caso de pasar los datos tal cual los devuelve la capturadora a 320x240x24bits sin compresión:

// DatosDib - el array con los datos DIB
// Panel - el panel donde queremos dibujarlo
void DibujaDibEnPanel(void *DatosDib, TPanel *Panel)
{
    BITMAPINFO bi;
    ZeroMemory(&bi, sizeof(bi));
    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bi.bmiHeader.biWidth = 320;
    bi.bmiHeader.biHeight = 240;
    bi.bmiHeader.biPlanes = 1;
    bi.bmiHeader.biBitCount = 24;
    bi.bmiHeader.biCompression = BI_RGB;
    HDC hdc = GetDC(Panel->Handle);
    if (hdc)
    {
         SetDIBitsToDevice(hdc, 0, 0, bi.bmiHeader.biWidth,
              bi.bmiHeader.biHeight, 0, 0, 0, bi.bmiHeader.biHeight,
              DatosDib, &bi, DIB_RGB_COLORS);
         ReleaseDC(Panel->Handle, hdc);
}
}

---

Volver arriba
Mensaje    Asunto: Responder citando

Como hicieron para ENVIAR el frame capturado en la funcion callback ?

estoy probando con NTMStrm pero no comprendo como enviarlo

Aydua porfavor
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Disculpen que lo vuelva a poner arriba, considero que es una pregunta de alto nivel (enviar datos a travez de la red, seria importante para otros y para mi por supuesto la respuesta) Gracias y disculpas otra vez
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Esto e spara enviar un archivo, no hay problema aqui , mi duda es como CONVIERTO, llso bytes de la imagen a un STREAM, ayuda porfavor!!!

TFileStream *MyFStream;
MyFStream = new TFileStream(OpenPictureDialog1->FileName, fmOpenRead);
try
{
NMStrm1->Host = Edit2->Text;
NMStrm1->FromName = Edit1->Text;
NMStrm1->PostIt(MyFStream);
}
catch(...)
{
}
MyFStream->Free();
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: para Touchsoftwares Responder citando

Hola Touchsoftwares, leíste tu correo privado???
Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

desasoftware@hotmail.com

Aunque lo ideal es que las respuestas se colqoen en el foro para ayduar a todos

saludos
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Componente Responder citando

Que hay compañero, ya lo puse en el foro, está en esta dirección :
https://cppbuilder.es/viewtopic.php?p=13295&highlight=#13295

Son unos ejemplos de : probabilidad de movimiento, videoconferencia...
están en delphi.
Aparte tengo el activeX y el componente para delphi, pero haciendo unos apaños vale para builder, este componente está muy bien (a mi gusto), ya que captura video y audio con sólo poner dos líneas de código.

Para todo el que lo quiera que me lo diga y se lo mando a partir del lunes ya que lo tengo en otro ordenata y ya os diré para instalar lo que hay que borrar porque ahora no me acuerdo pero era fácil, para que así funcione el componente y compile.

Saludos Touchsoftwares
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Eso me interesa.....
Tengo la captura de video aparcada desde hace mucho tiempo.

Mi e-mail es: natalia_bcb@terra.es

Muchas gracias
_________________
-
Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si no es mucha molestia te agradeceria me lo enviaras Smile

progmac@hotmail.com

Gracias...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

La captura devideo no es problema, en tips coloque un objeto que lo hace (sin necesidadde componenetes externos), lo que me gustaria me ayudaran es como convertir la informacion caturaraa en callback de video en un stream (que tipo de stream?) para enviar por ntmstr (a travez de una red local)
Aclaro que lo logre hacerlos funcionar un stream tipo file , leyendo un archivo guardado (frame, como esta en el ejemplo que trae builder), pero no es lo suficientemete rapido .a que lo maneje todo en memoria TStreamMemory ? o TStreamSocket ?

Ayuda porfavor

Al qu e lei nterese captura video y tomar fotos:

https://cppbuilder.es/viewtopic.php?t=5592
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Instalación del componente Responder citando

Bueno lo acabo de instalar el el builder 6 y funciona :

Ir a instalar componente, el primero que debeis instalar y sólo éste, luego lo demás, es el JLCVideo.pas (El tipo de extensión es pas ojo para poder verla), lo instalais y da 29 errores( ami por lo menos). Ahora lo desinstalais y aceptais todo lo que salga y cerrais builder.
Si saltan errores habiendo cerrado builder apagais el ordenador.
Abrimos otra vez buirder y ahora instalamos el JLCVideo.pas, el avi captura.pas y el activeX JLCVideoXControl.ocx. Ahora no tiene que dar error. Cerrais builder.
Si saltan errores habiendo cerrado builder apagais el ordenador.
Una vez instalado el componente, el activeX y sus hpp, cogemos una form1 y ponemos sobre ella un JLCVideo1 y nada más, Compilamos y nos dan tres errores, Borramos las líneas de error y volvemos a compilar, ya no da errores. Cerramos el proyecto, no guardamos los cambios del proyecto pero sí guardar los cambios en el hpp para que cuando lo useis no tengais que volver a borrar las tres lineas.


En el builder 5 me parece que sólo había que hacer los dos últimos pasos.

Espero que os sirva a tod@s

Saludo2
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Ejemplo Responder citando

Ahí va un ejemplo muy simple con JLCVideo1 :


Este es un ejemplo muy muy simple :

Colocaís en un form1 un JLCVideo1, y 8 botones :

Abrir cámara, cerrar cámara, sacar foto, formato vídeo, fuente vídeo, compresión vídeo, grabar vídeo, parar vídeo.

Existen bastantes opciones, pero esto es para que veais que simple es capturar imágenes.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
JLCVideo1->Activo=true;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
JLCVideo1->Activo=false;
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
JLCVideo1->GrabarImagenDisco;
};

void __fastcall TForm1::Button4Click(TObject *Sender)
{
JLCVideo1->GrabarVideoDisco;
}

void __fastcall TForm1::Button5Click(TObject *Sender)
{
JLCVideo1->StopVideo;
}

void __fastcall TForm1::Button6Click(TObject *Sender)
{
JLCVideo1->SeleccionarFormato;
}

void __fastcall TForm1::Button7Click(TObject *Sender)
{
JLCVideo1->SeleccionarFuente;
}

void __fastcall TForm1::Button8Click(TObject *Sender)
{
JLCVideo1->SeleccionarCompresion;
}


Saludo2
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.