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 Anterior  1, 2
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Responder citando

Siendo CONCRETO:

como meto la infromacion de :
Código:

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;
    }

en el arreglo
Código:

void *DatosDib


Es algo basico de C pero ahora estoy bloquedao, llevo muchas horas en esto.

Le digo que ya funciono leyendo un archivo bmp, convirtiendo en jpg en memoria ey enviarlo.. esta perfecto, pero el problema es velocidad
no se ve rapido por los accesos a disco.

Entonces lo unico que me queda es leerlodesde el callback directamente , meterlo en el arreglo void *DatosDib (quees un miembro public de mi clase) y cuando este lleno, leerlo y dibujarlo sobre un timage

Ayuda plz
_________________
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: Envío de un stream a través de la red EFICIENTEMENTE Responder citando

Saludos A todos!!

Touchsoftwares hace tiempo tenía la misma inquietud, logré enviar y recibir pero por medio de archivos, lo que hacía ineficente el programa y a largo plazo acabar con mi pobre disco duro. Me parece que es un tema muy valido de discutir en el foro, así que por favor si alguien tiene alguna información comuníquela através del foro.
_________________
ErnestX
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Efectivamente por medio de archivos no hay problema, el problema es que al cabo de muchas capturas la camara deja de grabar o actualziar al imagen, debido al LIMITE que existen en los archivos que deben estar en un subdirectorio o directorio raiz,
el chiste aes "tomarlo" desde el callback y de ahi enviarlo por la red, en esl posto que retome Leo ya habia puesto gran parte de la soucion dejando abierta la posibilidad:

Cito el mensaje de leo


Cita:

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

Como lo enviamos por la red, ya estoy cerca, hice un puntero *DatosDib de alcance global en el form donde capturo el video,

Código:

TMemoryStream *mystr=new TMemoryStream(); // Creo stream para enviar
Caption=IntToStr(size); // la vaiable size es de alcance global la tomo del call back (mas abajo pongo de donde sale
mystr->Read(DatosDib,size); // aqui meto los datos de l puntero que tome del callback al stream
mystr->Position=0; // rebobino el stream
StreamEnvia->PostIt(mystr); // lo envio por la red
mystr->Free(); // libero el stream




callback modificado del original de leo

Código:

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,
        // 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;
     DatosDib=new unsigned char[h->dwBytesUsed];
   // tanto size (int) como  *DatosDib (void) son globales en el form
    size=h->dwBytesUsed; // guardo el tamaño de la imagen
    DatosDib=h->lpData;  // Esto esta bien?
   // blqoueo esta parte ya qeu solo es para cambair la imagen a negativo
/*
     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;


Alguien puede ayudar?
_________________
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

Básicamente, creamos un TMemoryStream, lo rellenamos con los datos de "h->lpData" y ya podemos enviarlo.
Código:
LRESULT CALLBACK fcb(HWND w, LPVIDEOHDR h)
{
    std::auto_ptr<TMemoryStream> stream(new TMemoryStream);
    stream->Write(h->lpData, h->dwBytesUsed);
    Form1->NMStrm1->PostIt(stream.get());
    return TRUE;
}

Y para recibirlo en el lado del TNMStrmServ en su evento OnMSG:
Código:
void __fastcall TForm1::NMStrmServ1MSG(TComponent *Sender,
      const AnsiString sFrom, TStream *strm)
{
    std::auto_ptr<TMemoryStream> stream(new TMemoryStream);
    stream->CopyFrom(strm, strm->Size);
    // Usamos un panel sobre el que dibujaremos los datos recibidos
    //   usando la función siguiente que se muestra más arriba
    DibujaDibEnPanel(stream->Memory, Panel1);
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si queremos mejorarlo enviando los datos en formato JPEG, con lo que conseguiremos que ocupe muchísimo menos:
Código:
LRESULT CALLBACK fcb(HWND w, LPVIDEOHDR h)
{
    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;

    std::auto_ptr<Graphics::TBitmap> bmp(new Graphics::TBitmap);
    bmp->PixelFormat = pf24bit;
    bmp->Width       = bi.bmiHeader.biWidth;
    bmp->Height      = bi.bmiHeader.biHeight;

    SetDIBits(bmp->Canvas->Handle, bmp->Handle, 0,
        bi.bmiHeader.biHeight, h->lpData, &bi, DIB_RGB_COLORS);

    std::auto_ptr<TJPEGImage> jpg(new TJPEGImage);
    jpg->CompressionQuality = 50;
    jpg->Assign(bmp.get());

    std::auto_ptr<TMemoryStream> stream(new TMemoryStream);
    jpg->SaveToStream(stream.get());

    Form1->NMStrm1->PostIt(stream.get());

    return true;
}

Y para mostrarlo en el lado del receptor:
Código:
void __fastcall TForm1::NMStrmServ1MSG(TComponent *Sender,
      const AnsiString sFrom, TStream *strm)
{
    std::auto_ptr<TJPEGImage> jpg(new TJPEGImage);
    jpg->LoadFromStream(strm);
    Image1->Canvas->Draw(0, 0, jpg.get());
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Leo eres un pistola!

me tienes anonaddo , ya funcionaa

Gracias, gracias, gracias y mil veces gracais

ahora voy a solucionar que funcione con una ventana invisible y pongo la repsuesta en el foro, saludos

Y GRACIAS 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

Se puede hacer invisibel la ventana de captura?

lo intente quitandole la badera Visible, pero no enra al callback cuando la bentana es oculta o cubierta
_________________
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

Disculpa mi ignorancia

se deberia liberar los punteros despues de usarlos

delete jpg; ?
_________________
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

Me autorespondo

para tener la captura INVISIBLE, uso la funcion capGrabFrame(w) que forma el uso de call back cuando la imagen no es visible, debido a que cuando noes visible (oculta , minimizada , el GDI, para el reloj de actualizacion, que llama al callback)

por lo tanot uso un timer par aue cada 1/2 segundo haga capGrabFrame y asi envio la imagen por la red, aunque la imagen este invisible

Lo que observe tambien es que si hago la ventana de captura OCULTA, no funciona el capGrabFrame, seguire investigando

Saludos y Gracias

PD. No me gusta los componentes externos, solo cuando no queda otra opcion
_________________
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

Cita:
...se deberia liberar los punteros despues de usarlos
delete jpg; ?

En este caso no, porque usamos la plantilla "auto_ptr" que al salir de la función ya se encarga de liberar el objeto.

Cita:
Se puede hacer invisibel la ventana de captura?
lo intente quitandole la badera Visible, pero no enra al callback cuando la bentana es oculta o cubierta

Tienes "capSetCallbackOnVideoStream" que funciona de manera similar a "capSetCallbackOnFrame", la diferencia es que la segunda solo funciona para la previsualización por tanto debe estar activa y visible, mientras que la primera no necesita ni siquiera que actives la previsualización ni que este visible.

Si usas "capSetCallbackOnVideoStream" tendrás que usar "capCaptureSequenceNoFile" para comenzar la captura y "capCaptureStop" para detenerla.

Luego para cambiar la cantidad de fotogramas por segundo y otros parámetros tienes "capCaptureSetSetup" ya que estas funciones son independientes de las de previsualización.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

He tratado de poner en marcha el código que ustedes colgaron pero siempre me resulta el error de "No se puede cambiar el formato de video", a que se debe esto?. Gracias por su ayuda.
_________________
Entre más sé, sé que nada sé
----------------------------------
Miguel Angel Torres Arredondo
Siegen - Deutschland
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Descubrí que la resolución de video de mi pc es diferente a la que se pretende configurar y por esto ocurre el error, pero igualmente luego de corregirlo me sige presentando el mismo problema. Pero la duda mia no viene a este caso mucho, ya que sólo quería comprobar lo que estaba en el foro y lamentablemente no me funcionó. Mi duda viene a que quiero hacer una aplicación que capture video y que me pueda funcionar tanto en windows como en linux. Ya César me comentó que haciendo projectos del tipo CLX, estos pueden ser ejecutados en Windows o Linux. Luego realizé otra consulta y Tochsoftwares me dijo que la captura de video viene relacionada al Kernel del sistema operativo. He estado buscando en internet y fuera de los ejemplos del foro de captura de video en cámara web (que lastimosamete no me funcionaron), y otros componente como los de Mitov y otros para Linux. La mayoría usan la WIN32 y por consiguiente sólo los podría ejecutar en windows. Si alguien tiene una pequeña idea de como poder hacer o ideas de lo que explico les agradecería. Gracias, suerte....
_________________
Entre más sé, sé que nada sé
----------------------------------
Miguel Angel Torres Arredondo
Siegen - Deutschland
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
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.