 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Lun 11 Ago, 2003 6:00 am Asunto: |
|
|
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
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 |
|
 |
ErnestX Cdt

Registrado: 06 Ene 2003Mensajes: 9Ubicación: Cali (Colombia)
|
Publicado: Mar 12 Ago, 2003 12:14 am Asunto: Envío de un stream a través de la red EFICIENTEMENTE |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Mar 12 Ago, 2003 2:10 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 12 Ago, 2003 5:58 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 12 Ago, 2003 6:49 am Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Mar 12 Ago, 2003 6:57 am Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Mar 12 Ago, 2003 7:10 am Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Mar 12 Ago, 2003 7:18 am Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Mar 12 Ago, 2003 8:02 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 13 Ago, 2003 3:31 am Asunto: |
|
|
| 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 |
|
 |
Miguel Angel Torres Master


Registrado: 23 Abr 2006Mensajes: 282Ubicación: Siegen, Alemania
|
Publicado: Sab 10 Feb, 2007 9:55 pm Asunto: |
|
|
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 |
|
 |
Miguel Angel Torres Master


Registrado: 23 Abr 2006Mensajes: 282Ubicación: Siegen, Alemania
|
Publicado: Dom 11 Feb, 2007 6:41 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|